隔离表现层与业务逻辑,实现多层次的Web应用程序

 

早期的Web应用程序结构都很简单,通常用户界面与业务逻辑都混合在一起。修改这种应用的任何一方,都将使维护整个应用程序变得十分困难。将用户界面与业务逻辑隔离就简化了应用程序的维护,从而可以更快更容易的改变应用程序。本文讨论Java ServletJava Server Page这两种技术,它们可以用于隔离用户界面与业务逻辑。我们用一个简单的应用来演示如何实现这种隔离,以及如何实现更快的部署和改变应用程序。

首先,我们简介一下Java ServletJSP及它们如何在一个Web应用中协调工作。

 

什么是Servlet

Servlet是平台独立的Java服务器端组件。它以多种方式来扩展服务器端的功能,同时将维护和支持的开销也降到最小。Servlet不同于CGI脚本,它被编译成Java的字节码(bytecode),所以它没有引入任何与平台有关的因素,从而实现了真正的“Write OnceRun Anywhere”。

 

什么是Java Server PageJSP)?

JSP是建立含有动态内容的Web应用程序的Java技术。一个JSP页面是一个文本文档,包含了静态的HTML内容和动态的动作标记。这些动作描述了如何处理返回给客户的响应。在应用开发阶段,JSPServlet差异很大,然而在运行时,它被编译成Servlet,在JSP引擎中执行。JSP引擎存在于任何一种Web应用服务器中,如WebSphere V3.x

 

ServletJSP协同工作

从理论上讲,用户可以只使用Servlet来接收从Web浏览器发来的HTTP请求,Servlet动态的处理请求(可能是查询后端系统来完成请求),然后在Servlet中直接发送HTMLXML文档的响应给浏览器。

上述方法在原理上是可行的,但它把Web页面的产生也交由Java Servlet来做。如果Web页面的设计人员要改变页面的外观就必须编辑、重新编译Servlet。这将要求动态Web页面的设计人员需要有应用程序开发经验。显然,我们需要将Web页面的显示与Servlet处理请求相隔离。

满足上述需求的方法是采纳Model-View-ControllerMVC)模型来建立Web应用程序。在MVC模型中,后端系统是我们的Model,用来创建用户响应界面的模板是View,而把这两者联系起来的纽带是ControllerJSP完美的对应于MVC模式中的ViewServlet包含了管理如何处理请求的逻辑,实际上就成为了Controller,而系统已有的业务规则就是Model

我们来看一个例子,它使用了MVC模式实现表现层和业务逻辑的隔离,该例实现了从浏览器访问3270后端系统的一个应用。

示例程序的体系结构如图1所示。浏览器使用HTMLJSP实现了View,一组在应用服务器中的Java Servlet提供了Controller,后端的CICS等应用提供了业务规则或称作ModelServletHTMLJSP页面调用的流程如图2所示,并附有详细的文字叙述。

 

示例应用流程详解

发起请求

用户用浏览器载入初始HTML页面,该页面是由Web使能的应用服务器提供的。应用服务器以与Web Server相同的方式来进行Web文件服务。这个页面是整个Web应用的入口点。它使用了HTML FORM action标记来访问Servlet。在我们的例子中,这个ServletLoginServlet。同样附加的参数也随着FORM的动作发给Servlet

下面是一段例子:

<FORM action="http://localhost:8080/servlet/LoginServlet" method="POST">
<input type="text" size="30" name="firstname">
<input type="text" size="30" name="surname">
.
.
<input type=hidden name=host value="localhost">
<input type=hidden name=port value="9876">
<input type=submit value=" Submit ">
</FORM>

请求一般是以HTTPHTTPS来发起,然后由Servlet来处理。它使用HttpServletRequest.getParameter()方法来访问FORM表单提供的参数。

Servlet然后测试用户是否有SessionSession用来将从远程客户端来的一系列请求关联起来,这对于无状态保持功能的HTTP协议是必须的。

Session可用如下方法来创建:

HttpSession session = req.getSession(true);

对象可以被加入到Session中去:

session.putValue(“host”,hostToConnectTo);

session.putValue(“port”,tmpPort);

 

Controller

Servlet负责调用处理用户请求的JavaBean。它也负责创建对用户的响应。在我们建议的应用结构中,响应将被传递到JSP。因此,Servlet被叫做Controller

回到我们的例子。下面的代码实例化一个类型CICSEmulator的新类叫newEmulator。这是一个由第三方厂商提供的3270终端仿真类,它提供了一组对仿真终端直接操纵的方法(类似的类也可以用IBM VisualAge for Java企业版中的Enterprise Access Builder来生成)。newEmulator可以从Session中传递变量,此例中变量为远程主机和端口。

CICSEmulator newEmulator = new CICSEmulator();
newEmulator.setTN3270Port(portToConnectTo);
newEmulator.setTN3270Host(hostToConnectTo);  

第二个实例化的类是一个Java Bean叫做AcctDetails。它是一个数据访问Bean,它将向后端的系统查找和获取数据。AcctDetailsnewEmulator来作为它的 3270终端,然后传递变量(姓和名)给它的set方法。

AcctDetails getAccountDetails = new AcctDetails();
getAccountDetails.set3270Emulator(newEmulator);

getAccountDetails.setSurname(inputsurname);
getAccountDetails.setFirstName(inputfirstname);

数据访问Bean执行请求

Bean实例getAccountDetails的方法performWork(),它连接后端3270系统,并基于用户提供的姓名来获取用户帐户的细节。

try {
getAccountDetails.performWork();
session.putValue("resultsBean", getAccountDetails);
}

catch ( IllegalStateException e ) {
// handle the error
}

如果执行成功,ServletgetAccountDetails Bean放入用户的session中。这个Bean的标识符为resultsBean,它包含了用户查询的结果,这些结果可以用Beanget方法来访问。

 

控制权传给JSP

我们已经提到,MVC模式的重点就在于它隔离了表现层与业务逻辑。Servlet负责处理请求,它会去调用数据访问Bean,数据访问Bean getAccountDetails包含了从后端系统访问和获取数据的服务器端逻辑。后端系统(Model)包含了业务规则。而对用户的响应(View)是由JSP创建出来的。

Servletrequestresponse对象传递给JSP时遵循如下的语法:

getServletContext().getRequestDispatcher(“/jspDemo/login.jsp”).forward(req,res);

Forward方法允许Servlet将响应的处理传给第三方。它的参数requestresponse必须就是调用servletservice方法时传递的对象。 它使用 getRequestDispatcher对象来得到requestDispatcher,从而确定了到目的JSP的路径。以“/”开始的JSP路径名被解释成相对于当前应用上下文环境的根路径。

访问ResultsBean

JSP负责创建对用户的响应,它可以访问getAccountDetails Bean的数据(使用标识符resultsBean来引用)。这些在HTML中用如下语法来完成:

<HTML>
<BODY>
.
.
<jsp:useBean id="resultsBean" scope="session" class="acct.AcctDetails " />
<jsp:getProperty name="resultsBean" property="*"/>

其中<JSP:useBean>是去查找已存在的对象(本例中是resultsBean)。本例中我们把getAccountDetails bean放入session中并命名为resultsBean。于是上述JSP语句就从session中得到了resultsBean,然后就可以通过访问resultsBeanget方法来得到它的数据。

也可以通过如下JSP语句来实现:

<%= resultsBean.getDetails_Title() %>
<%= resultsBean.getDetails_Initial() %>

上述语句也是JSP表达式的一个例子。在<%=%>之间所有的内容被放入JSP引擎中处理,结果被作为输出送给JSP文件。上述的两个表达式将执行resultsBeanget方法来显示用户的titleMiddle_Initial。同任何一种脚本语言(如JavaScript)一样,JSP代码可以在HTML页面中任意嵌入。JSP的语法也非常简单,这意味着JSP可以由Web页面设计人员来维护而不是应用开发人员。开发人员负责的是servlet和数据访问Bean。在JSP中的任何改变不会影响到servlet,反之亦然。

响应

JSP在请求时被动态翻译成Java Servlet,并在应用服务器中缓存。后续JSP请求的响应将明显加速。用户收到的最终响应都是HTML页面(以.jsp为扩展名),这些页面包含了动态产生的内容。

总结:

在本文示例的应用结构中,客户端浏览器发起的请求直接到了servlet,然后用数据访问Bean来处理请求,从后端系统获取数据。Servlet将结果包装进resultsBean,把它放入session中,然后调用JSP来处理这个响应。Servlet是初始请求到产生响应的总体控制者。

JSP决定产生给用户响应的内容。JSP只应当包含如何格式化表现层的逻辑。这种隔离的优点在于它创建了在应用中可重用的、可移植的、平台独立的组件,这些组件可以作为将来更大的应用的一部分。

隔离Servlet开发与JSP显示为应用开发人员和Web页面设计人员彼此独立的工作带来了极大的方便。同样,这种方法也完美的符合了本文所介绍的MVC设计模型。

作者:井明灿     E-mail:    jingmc@cn.ibm.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值