Chinaunix首页 | 论坛 | 博客
  • 博客访问: 206458
  • 博文数量: 163
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 1720
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-08 11:41
文章分类

全部博文(163)

文章存档

2011年(1)

2009年(162)

我的朋友

分类: Java

2009-07-10 16:16:27

 ASP/com 和 J2EE 应用程序模型

  接下来研究不同的应用程序体系结构,您可以使用这些体系结构开发 J2EE 应用程序并将其与相应的 ASP/COM 应用程序体系结构关联起来。

  使用 Java Servlets 编程:基础知识

  编写 Java Servlets 就可以对来自 URL 的请求进行可编程控制。典型的 servlet 调用类似于以下步骤:

  客户机向 Web 服务器发出请求,将 servlet 命名为 URL 的一部分 ―― 例如,

      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:直接返回内容


public class HelloWorldServlet extends HttpServlet {
  /**
  * Handles all HTTP POST requests
  *
  * @param request object that encapsulates the request to the servlet
  * @param response Object that encapsulates the response from the servlet
  */
  public void doPost(
  Javax.servlet.http.HttpServletRequest request,
  javax.servlet.http.HttpServletResponse response)
  throws ServletException, IOException {
  try {
  PrintWriter out = response.getWriter();
  out.println("");
  out.println("Hello World");
  out.println("");
  } catch (Throwable t) {
  ...
  }
  }
  }

  注意,您从响应对象获得 PrintWriter ,并一次一行将 HTML 输出到客户机。

  清单 21. HelloWorld servlet:使用 JSP 页面返回内容


     public class HelloWorldServlet extends HttpServlet {
  /**
  * Handles all HTTP POST requests
  *
  * @param request Object that encapsulates the request to the servlet
  * @param response Object that encapsulates the response from the servlet
  */
  public void doPost(
  javax.servlet.http.HttpServletRequest request,
  javax.servlet.http.HttpServletResponse response)
  throws ServletException, IOException {
  try {
  RequestDispatcher rd = getServletContext().getRequestDispatcher("helloworld.jsp");
  rd.forward(request, response);
  } catch (Throwable t) {
  ...
  }
  }
  }

  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.代码。 <% and the %>标签之间的 Java 代码部分称为 scriptlet。

  清单 22. HelloWorldservlet:使用 JSP 页面返回内容



JSP page example
The date is:
<%
Date date = new Date();
out.println(date);
%>
Some more HTML
The value of e is:
<%
double e = Math.exp(1.0);
out.println(e);
%>
Yet even more HTML
The value of pi is:
<%
double pi = 22.0/7.0;
out.println(pi);
%>
    

  注意,JSP 隐含变量 out 的用途是将内容写回到客户机,还要注意 HTML 和 Java 代码的交织。

  一个示例场景

  为了说明各种体系结构选项,我们将使用一个简单的用户登录场景,它包含:

  一个具有 HTML 表单的登录页面,它从用户那里获得用户名和密码

  验证用户凭证(可能使用数据库)并重定向站点主页的应用逻辑

  使用这个简单的例子可以说明各种应用程序体系结构。

  “意大利面条式”代码

  在 ASP 端,“意大利面条式”代码方法使用单个 .aspx 文件来同时包含应用逻辑和 HTML 表单。(不建议对现实中的例子采用这种方法,因为这样所有表示逻辑和应用逻辑都将是单个文件,从而您就不能重用用于验证用户凭证的代码。)该代码的轮廓看 起来类似清单 23 中所示的代码。(为简单起见,我们省略了所有错误处理代码。)

  清单 23. ASP 中的“意大利面条式”代码


--FUNCTION TO VALIDATE USER ENTERED LOGIN data FUNCTION ValidateUser(username,password)
  '--code to validate users credentials goes here
  ...
END FUNCTION %>


Login example


<% IF (REQUEST.SERVERVARIABLES("REQUEST_METHOD") = "GET") THEN %>
 
 
 
 
 
<% ELSE userName = REQUEST.FORM("username") password = REQUEST.FORM("password")
   IF (ValidateUser(userName, password)) THEN 
         RESPONSE.redirect("mainpage.asp") ELSE ... END IF END IF %>
  <font color="red"><%=LoginMessage%>

    正如清单 24 所示,您可以在 J2EE 中采用相同的方法,使用单个 JSP 页面来同时包含表单和应用逻辑。

  清单 24.J2EE 中的“意大利面条式”代码

  



Login example
<%!
private boolean validateUser(string userName, String password) {
   ...
}
%>
...


<%
  if (request.getMethod().equals("GET") ) { %>
 


 
   <% }
  else {
   String userName = request.getParameter("username");
   String password = request.getParameter("password");
    if (validateUser(userName, password)) {
     response.sendRedirect("mainpage.jsp");
   }
   ...
  } %>


  与 ASP 模型类似,JSP 模型不是事件驱动的,因此您需要检查表单是否被发送回去了,方法是检查该请求,并且如果不是 POST 请求时则添加表单的 HTML。如果它是 POST 请求,您将使用在 JSP 中声明的一个方法来验证登录。注意,使用 <%! 表明该代码是一个方法。Scriptlet 代码将在 JSP 页面处理期间遇到它们的时候执行,因此用于 scriptlet 的标签( <% %>)对方法无效。还要注意如何使用 if/then/else 编程结构来方便地添加或去除较大的 HTML 块。与在 ASP 例子中一样,不推荐将此方法用于 J2EE 开发。表示代码(HTML)和应用逻辑的混合仅允许很少的重用,并且使得代码难于维护。

 

阅读(701) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~