JSP高级技术如何开发动态网站(1)

发表于:2007-07-14来源:作者:点击数: 标签:
近年来,Jsp技术现在已经成为一种卓越的动态网站 开发技术 。 Java 开发者出于各种理由喜爱使用jsp。有人喜爱其“一次开发,处处使用”的 性能 ,另外的人觉得jsp使 java 成为一种易学的 服务器 端scripting语言。但是,jsp最大的长处在它将页面的表现和页面
近年来,Jsp技术现在已经成为一种卓越的动态网站开发技术Java开发者出于各种理由喜爱使用jsp。有人喜爱其“一次开发,处处使用”的性能,另外的人觉得jsp使java成为一种易学的服务器端scripting语言。但是,jsp最大的长处在它将页面的表现和页面的商业逻辑分开了。本章中,我们将深入地讨论如何使用jsp模式2体系结构来开发网站。这一模式可以被看作是通用模式浏览控制模式(popular Model-View-Controller,MVC)模式的服务器端实现。

Servlets有何缺陷

当jsp成为开发动态网站的主要技术时,可能有人会问为何在jsp技术中我们不强调servlets。Servlets的应用是没有问题的。它们非常适于服务器端的处理和编程,并且它们会长期驻留在他们现在的位置。但是,从结构上说,我们可以将jsp看作是servlet的一个高层的抽象实现,特别是在servlet 2.2 API下。但是,你仍然不能无拘束地使用servlet;它们并不适合每一个人。例如,页面设计者可以方便地使用html或者xml工具开发jsp页面,但servlet却更适合于后端开发者使用,他们的工具是ide??一个需要更多编程训练的开发领域。当发布servlet时,每个开发者必须小心地确定在页面表现和页面逻辑之间没有紧密的关联出现。你可以使用第三方html包装工具,如htmlkona来混合html和servlet代码。即使如此,这点灵活性还不足以让你自由地改变风格本身。例如,你希望从html改变到dhtml,则包装本身需要被小心地测试,以确保新的格式可以正确使用。在最坏的情况下,包装不可用,你就需要应变马来表现动态内容。所以,需要一种新的解决方案。你将会看到,一种方案就是混合jsp和servlet的使用。

不同的方式

早期的jsp标准给出了两种使用jsp的方式。这些方式,都可以归纳为jsp模式1和jsp模式2,主要的差别在于处理大量请求的位置不同。在模式1中(图1),jsp页面独自响应请求并将处理结果返回客户。这里仍然有表现和内容的分离,因为所有的数据依靠bean来处理。尽管模式1 可以很好的满足小型应用的需要,但却不能满足大型应用的要求。大量使用模式1,常常会导致页面被嵌入大量的script或者java代码。特别是当需要处理的商业逻辑很复杂时,情况会变得严重。也许对于java程序员来说,这不算大的问题。但如果开发者是前端界面设计人员??在大型项目中,这非常常见,??则代码的开发和维护将出现困难。在任何项目中,这样的模式多少总会导致定义不清的响应和项目管理的困难。

在图2中显示的模式2 结构,是一种面向动态内容的实现,结合了servlet 和jsp技术。它利用了两种技术原有的优点,采用jsp来表现页面,采用servlets来完成大量的处理。这里,servlet扮演一个控制者的角色,并负责响应客户请求。接着,servlet创建jsp需要的bean和对象,再根据用户的行为,决定将那个jsp页面发送给用户。特别要注意,jsp页面中没有任何商业处理逻辑;它只是简单地检索servlet先前创建的bean 或者对象,再将动态内容插入预定义的模版。从开发的观点看,这一模式具有更清晰的页面表现,清楚的开发者角色划分,可以充分地利用开发小组中的界面设计人员。事实上,越是复杂的项目,采用模式2 的好处就越突出。

为了清楚地了解模式2 的开发过程,我们举一个网上音乐商店的例子。

我们创建一个叫”音乐无国界”的销售音乐制品的商店。“音乐无国界”在线商店的主界面,是一个叫“音乐无国界”的页面(代码1)。你会看到,这个页面完全着眼于用户界面,与处理逻辑无关。另外,注意另外一个jsp页面,Cart.jsp(在代码2中),用<jsp:include page="Cart.jsp" flush="true" />.嵌入Eshop.jsp中。

Listing 1:
EShop.jsp

<%@ page session="true" %>
<html>
<head>
<title>Music Without Borders</title>
</head>
<body bgcolor="#33CCFF">
<font face="Times New Roman,Times" size="+3">
Music Without Borders
</font>
<hr><p>
<center>
<form name="shoppingForm"
action="/examples/servlet/ShoppingServlet"
method="POST">
<b>CD:</b>
<select name=CD>
<option>Yuan / The Guo Brothers / China / $14.95</option>
<option>Drums of Passion / Babatunde Olatunji / Nigeria / $16.95</option>
<option>Kaira / Tounami Diabate/ Mali / $16.95</option>
<option>The Lion is Loose / Eliades Ochoa / Cuba / $13.95</option>
<option>Dance the Devil Away / Outback / Australia / $14.95</option>
<option>Record of Changes / Samulnori / Korea / $12.95</option>
<option>Djelika / Tounami Diabate / Mali / $14.95</option>
<option>Rapture / Nusrat Fateh Ali Khan / Pakistan / $12.95</option>
<option>Cesaria Evora / Cesaria Evora / Cape Verde / $16.95</option>
<option>Ibuki / Kodo / Japan / $13.95</option>
</select>
<b>Quantity: </b><input type="text" name="qty" SIZE="3" value=1>
<input type="hidden" name="action" value="ADD">
<input type="submit" name="Submit" value="Add to Cart">
</form>
</center>
<p>
<jsp:include page="Cart.jsp" flush="true" />
</body>
</html>

Listing 2:
Cart.jsp

<%@ page session="true" import="java.util.*, shopping.CD" %>
<%
Vector buylist = (Vector) session.getValue("shopping.shoppingcart");
if (buylist != null && (buylist.size() > 0)) {
%>
<center>
<table border="0" cellpadding="0" width="100%" bgcolor="#FFFFFF">
<tr>
<td><b>ALBUM</b></td>
<td><b>ARTIST</b></td>
<td><b>COUNTRY</b></td>
<td><b>PRICE</b></td>
<td><b>QUANTITY</b></td>
<td></td>
</tr>
<%
for (int index=0; index < buylist.size();index++) {
CD anOrder = (CD) buylist.elementAt(index);
%>
<tr>
<td><b><%= anOrder.getAlbum() %></b></td>
<td><b><%= anOrder.getArtist() %></b></td>
<td><b><%= anOrder.getCountry() %></b></td>
<td><b><%= anOrder.getPrice() %></b></td>
<td><b><%= anOrder.getQuantity() %></b></td>
<td>
<form name="deleteForm"
action="/examples/servlet/ShoppingServlet"
method="POST">
<input type="submit" value="Delete">
<input type="hidden" name= "delindex" value=<%= index %>>
<input type="hidden" name="action" value="DELETE">
</form>
</td>
</tr>
<% } %>
</table>
<p>
<form name="checkoutForm"
action="/examples/servlet/ShoppingServlet"
method="POST">
<input type="hidden" name="action" value="CHECKOUT">
<input type="submit" name="Checkout" value="Checkout">
</form>
</center>
<% } %>

这里,Cart.jsp按照MVC的模式1处理基于SESSION的购物车的表现。请看Cart.jsp开始处的代码:

<%
Vector buylist = (Vector) session.getValue("shopping.shoppingcart");
if (buylist != null && (buylist.size() > 0)) {
%>

本质上,这段代码从SESSION中取出“购物车”。如果“购物车”为空或者没有被创建,它就什么也不显示。所以,在用户第一次访问应用时,其界面如图:

如果“购物车”不为空,用户选择的商品从车中取出,依次显示在页面上:

<%
for (int index=0; index < buylist.size(); index++) {
CD anOrder = (CD) buylist.elementAt(index);
%>

原文转自:http://www.ltesting.net