ASP/COM 和 J2EE 应用程序模型
接下来研究不同的应用程序体系结构,您可以使用这些体系结构开发 J2EE 应用程序并将其与相应的 ASP/COM 应用程序体系结构关联起来。
使用 Java Servlets 编程:基础知识
编写 Java Servlets 就可以对来自 URL 的请求进行可编程控制。典型的 servlet 调用类似于以下步骤:
客户机向 Web 服务器发出请求,将 servlet 命名为 URL 的一部分 ―― 例如,
<FORM action="/myWebApp/LoginServlet" method="POST"> 。
Web 服务器将该请求转发给应用程序服务器,该服务器查找 servlet 类的实例。
Web 容器调用 servlet。(servlet 的一个实例被加载到内存中,每个请求都调用不同线程上的一个实例。)
注意,HTML 表单中 servlet 的 URL 包括 servlet 的名字和称为 上下文根(在上例中是 /myWebApp )的前缀。上下文根大致等价于 IIS 虚拟目录。
图 2 说明了这些步骤。
图 2. Servlet 调用
Servlets 扩展 HttpServlet 类。如有需要,可以覆盖 下列 HttpServlet 类的方法:
init() :在应用程序服务器加载 servlet 时调用
destroy() :在应用程序服务器卸载 servlet 时调用
doGet() :通过 HTTP GET 调用 servlet 时调用
doPost() :通过 HTTP POST 调用 servlet 时调用
编写 servlet 涉及编写代码来处理 HTTP 请求,处理任何参数并直接返回任何内容,或委派另一种资源(如 JSP 页面)来处理响应。不建议直接从 servlet 返回 HTML,因为管理 Java 类内的 HTML 代码很不灵活。
当应用程序服务器调用 doGet() 或 doPost() 方法时,以下两个对象将作为参数传递进来:
HttpServletRequest 允许访问任何请求参数以及 HTTP 请求中引发 servlet 调用的其他信息。
HttpServletResponse 充当返回到客户机的沟通渠道,允许 servlet 直接返回内容或返回其他 HTTP 返回代码(错误、重定向等)。
清单 20 和 21 展示了两个 Hello World servlet。清单 20 直接返回内容,清单 21 使用 JSP 页面返回内容。
清单 20. HelloWorld servlet:直接返回内容
2 /**
3 * Handles all HTTP POST requests
4 *
5 * @param request Object that encapsulates the request to the servlet
6 * @param response Object that encapsulates the response from the servlet
7 */
8 public void doPost(
9 javax.servlet.http.HttpServletRequest request,
10 javax.servlet.http.HttpServletResponse response)
11 throws ServletException, IOException {
12 try {
13 PrintWriter out = response.getWriter();
14 out.println("<html>");
15 out.println("Hello World");
16 out.println("</html>");
17 } catch (Throwable t) {
18 ...
19 }
20 }
21 }
22
注意,您从响应对象获得 PrintWriter ,并一次一行将 HTML 输出到客户机。
清单 21. HelloWorld servlet:使用 JSP 页面返回内容
2 /**
3 * Handles all HTTP POST requests
4 *
5 * @param request Object that encapsulates the request to the servlet
6 * @param response Object that encapsulates the response from the servlet
7 */
8 public void doPost(
9 javax.servlet.http.HttpServletRequest request,
10 javax.servlet.http.HttpServletResponse response)
11 throws ServletException, IOException {
12 try {
13 RequestDispatcher rd = getServletContext().getRequestDispatcher("helloworld.jsp");
14 rd.forward(request, response);
15 } catch (Throwable t) {
16 ...
17 }
18 }
19 }
20
RequestDispatcher 是您希望将请求转发给的资源的包装器。注意,要同时包括原始请求和响应对象,以便目标资源可以访问它们。从 getServletContext() 返回的 ServletContext 允许服务器与底层应用程序进行通信来获得 RequestDispatcher 。注意,所有 servlet 都通过 etServletContext() 方法访问其 ServletContext 。
使用 JSP 技术编程:基础知识
使用 JSP 技术您就具有使用 Java 语言编写服务器端脚本的能力。在 JSP 页面返回到客户机前,它是一个组合页面,由 HTML 和应用程序服务器处理的 Java 代码组成。在页面返回到客户机前,应用程序服务器处理嵌入代码以生成静态内容。与 .aspx 文件类似,JSP 页面通常与 HTML 文件很相似,只是增加了一些额外的标签和 Java 代码片断。
在第一次请求 JSP 页面时,应用程序服务器将每个 JSP 页面转换为特殊的 servlet。该 servlet 编译并加载到内存中。只要 JSP 源未被修改,这个 servlet 就对要获得该页面的请求提供服务。在源修改后,此过程再次开始,并生成一个新版本的 servlet。
您可以在 JSP 页面中使用几种特殊的 JSP 标签,用户还可以定义自己开发的标签的行为。您还可以将大段的 Java 代码添加到页面的不同部分。J2EE 运行时环境创建了许多变量,称为 隐含变量―― 可用于这些 Java 代码的片断。隐含变量的例子有:
request:与页面的特定调用相关的 HttpServletRequest
response:与页面的特定调用相关的 HttpServletResponse
out:与 HttpServletResponse 相关的 PrintWriter
清单 22 展示了 JSP 页面的一个例子,该页面既包含 HTML 也包含 Java.代码。 标签之间的 Java 代码部分称为 scriptlet。
清单 22. HelloWorld servlet:使用 JSP 页面返回内容
2 <title>JSP page example</title>
3 The date is:
4 <%
5 Date date = new Date();
6 out.println(date);
7 %>
8 Some more HTML
9 The value of <em>e</em> is:
10 <%
11 double e = Math.exp(1.0);
12 out.println(e);
13 %>
14 Yet even more HTML
15 The value of PI is:
16 <%
17 double pi = 22.0/7.0;
18 out.println(pi);
19 %>
20 </html>
21
注意,JSP 隐含变量 out 的用途是将内容写回到客户机,还要注意 HTML 和 Java 代码的交织。
一个示例场景
为了说明各种体系结构选项,我们将使用一个简单的用户登录场景,它包含:
一个具有 HTML 表单的登录页面,它从用户那里获得用户名和密码
验证用户凭证(可能使用数据库)并重定向站点主页的应用逻辑
使用这个简单的例子可以说明各种应用程序体系结构。