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

全部博文(163)

文章存档

2011年(1)

2009年(162)

我的朋友

分类:

2009-07-10 16:12:56

改进的“意大利面条式”代码

  在 ASP 端,可以以前一个例子为基础建立一种更好的方法,不过除了 login.asp 文件外,还使用只包含验证逻辑的一个 include ASP 文件。这样您就可以重用其他 ASP 文件中的代码。

  J2EE 端的一种更好方法是将应用逻辑转移到一个 Java servlet,从而使 JSP 页面仅限于使用 HTML 组件。现在验证逻辑独立于显示表单的页面,这是一种改进,而 JSP 页面仅限于使用 HTML 组件也是一种改进。清单 25 显示了如何将应用逻辑放到 servlet 中从而简化 JSP 页面。

  清单 25. J2EE:JSP 页面中改进的“意大利面条式”代码

  



Login example
...


method="POST" target="LoginServlet">




  清单 26 显示了 servlet 中的验证代码和导航逻辑。

  清单 26. J2EE:Java Servlet 中改进的“意大利面条式”代码


 public class LoginServlet 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 {
  string userName = request.getParameter("username");
  String password = request.getParameter("password");
  if (validateUser(userName, password)) {
  response.sendRedirect("mainpage.jsp");
  }
  ...
  } catch (Throwable t) {
  ...
  }
  }
  private boolean validateUser(String userName, String password) {
  ...
  }
  }

  清单 26 中的 Servlet 是表单提交的目标,并且充当一个控制器――处理用户输入并基于该输入调出适当的页面。注意 HttpServlet 父类允许您通过提供可重载的方法( doGet() 和 doPost() )来同时处理 GET 和 POST 请求。

  这种方法的主要缺点在于,凭证验证代码(它很可能要访问数据库)是 J2EE 例子中 servlet 的一部分。如果不同的页面需要使用这个逻辑,您就必须重复它。重复的代码更难于维护和更易于出错,因为您必须跟踪多个副本。

  模型-视图-控制器(MVC)方法

  下面我们将展示如何对这个例子使用更纯的 MVC 方法。在 ASP 端,这体现为将凭证验证逻辑转移到一个单独 com 组件,然后您在 ASP 文件中进行访问。在 J2EE 端,凭证验证代码将转移到一个单独的类中,然后从 servlet 访问该类。清单 27 中的代码片断显示了该 servlet 的外观。

  清单 27. J2EE: Java Servlet 中的 MVC


omport com.ibm.businessobjects.UserValidation
  public class LoginServlet 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 {
  String userName = request.getParameter("username");
  String password = request.getParameter("password");
  UserValidation user = new UserValidation();
  if (user.validate(userName, password)) {
  response.sendRedirect("mainpage.JSP");
  }
  ...
  } catch (Throwable t) {
  ...
  }
  }
  }
  清单 28 显示了位于一个单独的类中的凭证验证代码。

  清单 28. J2EE:用户验证类中的 MVC


     package com.ibm.businessobjects;
  public class UserValidation {
  public boolean validate(string username, String password) {
  ...
  }
  }

  凭证验证在 servlet 使用的类中进行。现在该 servlet 不必直接了解验证如何进行。只要您保持相同的公共接口不变,就可以随意更改 UserValidation 而不需改变 servlet 代码。您还可以在非 Web 应用程序中重用该代码。

  其他 J2EE 组件

  前面的例子展示了如何将业务逻辑分离到一个或一组单独的类中。这样允许您以各种不同的方式实现业务逻辑,而不会影响 servlet 和 JSP 页面。与使用一个需要访问数据库(使用 JDBC)的业务对象不同,您可以通过各种不同的方式实现这个逻辑。例如:

  使用 JCA 来访问诸如大型机等遗留系统:JCA 是一个 J2EE API,它允许 J2EE 应用程序使用标准接口与遗留系统(比如 CICS 或者 IMS)交互。

  使用 Web 服务客户端 API 来访问 Web 服务:这种方法涉及使用 Apache Axis 或其他某种 Java Web 服务客户端 API 来访问 Web 服务。

  使用 JMS 将消息作为验证请求来发送:这种方法涉及使用标准 API 来访问 JMS 相容的消息中间件(比如 WebSphere MQ)。

  使用 EJB 技术来实现验证逻辑:这种方法涉及使用 EJB 组件(而不是简单的 Java 类)来实现业务逻辑。EJB 组件能够使用应用服务器中的服务来管理(数据库或其他)事务,管理方法级的安全,以及提供群集和高速缓存。将此类任务委托给应用服务器,您可以把精力集中 在业务逻辑上,而不必担心系统级的问题。

  J2EE 数据访问

  下面我们将介绍 JDBC API,这是 J2EE 下的行业标准接口集,它允许 Java 程序使用统一的 API 调用集来访问关系数据库。JDBC 允许您开发应用程序一次,然后针对任何 JDBC 相容的数据库部署它们 ―― DB2、Oracle、SQL server、Sybase、MySQL、Informix 以及其他数据库。

  JDBC API 允许任何 Java 组件(包括 Java Servlets 和 JSP 页面)无缝地访问关系数据库中的数据。JDBC 由两部分组成:用于访问数据库的 API,以及数据库厂商为各自的数据库提供的可嵌入 JDBC 驱动程序。JDBC API 最便利的特性之一在于,您不必使用任何特定于厂商的类。您可以在运行时使用一个字符串常量来指定适当的驱动程序,以后就可以使用相同的编程接口,而不管所 使用的是哪种数据库。这样您就可以切换数据库,而不必更改代码(只要您在运行时提供字符串常量以指定驱动程序)。

  一个 JDBC 例子

  典型的 JDBC 应用程序必须完成以下步骤才能与数据库交互:

  识别驱动程序。(每个应用程序只需执行这个步骤一次。)

  识别数据库并与之建立连接(在需要时提供身份验证信息)。

  执行查询和/或更新。

  处理结果。

  断开与数据库的连接。

  清单 29 说明了上述步骤。

  清单 29. 一个 JDBC 例子


 // Step 1. SPECIFY THE APPROPRIATE DRIVER TO USE
  Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
  // Step 2. Identify the database  and connect to it
  connection= DriverManager.getConnection("jdbc:db2:SAMPLE","userid","password");
  // Step 3. Execute query
  Statement stmt = conn.createStatement();
  stmt.execute("SELECT * FROM USERID.EMPLOYEE");
  // Step 4. Get the results
  ResultSet rs = stmt.getResultSet();
  while (rs.next()) {
  String firstCol = rs.getString(1);
  int secondCol  = rs.getInt(2);
  ...
  }
  // Step 5. Disconnect from the database
  conn.close();

  清单 29 中的 Step 1 动态地加载适当的驱动程序。这个例子使用的是 DB2;其他 JDBC 驱动程序具有不同的完全限定名称。Step 2 提供特定于驱动程序的 String 指出要连接到哪个数据库。每种 JDBC 驱动程序都有自己的 String 格式。DB2 使用的格式是 "jdbc:db2:DBNAME" ,因此在此例中系统要连接到一个名为 SAMPLE 的数据库。例子中还提供了身份验证信息,以便数据库服务器能够对连接请求进行身份验证。在 Step 4 中,注意例子中如何循环遍历结果集,直到 next() 方法返回 false 。您还必须知道每列的类型,并对每列和每种类型调用适当的 getXXXX(n) 方法。还要注意您传递给 getXXXX(n) 方法的整数是列编号。

  在 ASP 页面使用 ADO 但没有连接池时,以上方法与典型的 ASP 页面采用的方法很相似,因为程序员负责打开和关闭数据库连接。

  连接池

  连接池通过对可以同时打开的数据库连接数目规定上限,可以增加应用程序的可伸缩性,因而防止由于过多的连接请求而造成数据库服务器的过度运行。 对于 ASP 来说,如果您选择的数据库(如 DB2、SQL Server 或 Oracle)有 OLEDB 提供程序,则可以利用连接池,从而就不必直接管理数据库连接。

  有了 JDBC,您可以将自己从直接管理连接的工作中解放出来。J2EE 应用程序服务器被要求为它们支持的所有数据库提供连接池。它们不使用某些高级的 JDBC API 调用来完成该任务。当您的代码在应用程序服务器的监控下运行时,您就不必直接与数据库服务器交互,以便为每个配置的数据库维护连接池。然后,应用程序从该 池中请求连接,并在使用完这些连接之后,将其返回到该池。大多数应用程序服务器都有相当高级的选项对池进行管理,包括“收回”连接的能力,即从出错的应用 程序(没有在给定时间内将连接返回池中)取回连接。

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