选择显示字体大小

实例讲解jsp model2体系结构(下)


  每次用户在eshop.jsp页内加入一件物品,页面就向控制servlet发送一个请求。由servlet依次决定适当的动作,然后处理要加入的物品的请求参数。然后它例示一个新的cd bean(见代码清单4)表示所选物品,并在会话内更新购物车对象。

  代码清单 4:cd.java

  package shopping;

  public class cd {

   string album;

   string artist;

   string country;

   float price;

   int quantity;

   public cd() {

    album="";

    artist="";

    country="";

    price=0;

    quantity=0;

   }

   public void setalbum(string title) {

    album=title;

   }

   public string getalbum() {

    return album;

   }

   public void setartist(string group) {

    artist=group;

   }

   public string getartist() {

    return artist;

   }

   public void setcountry(string cty) {

    country=cty;

   }

   public string getcountry() {

    return country;

   }

   public void setprice(float p) {

    price=p;

   }

   public float getprice() {

    return price;

   }

   public void setquantity(int q) {

    quantity=q;

   }

   public int getquantity() {

    return quantity;

   }

  }

  注意:我们在servlet中包括了附加的智能,这样一来它就能明白,如果一个原先加入过的cd被再次选中,它只需在购物车中为这个cd bean增加计数就可以了。这个控制servlet也能处理在cart.jsp中被触发的动作,比如用户从购物车中删除物品或结帐。注意观察,控制servlet一直在完全掌握着对资源的支配权,它决定在对特定动作的响应中调用哪些资源。例如,购物车状态的改动,如添加或删除,会使控制servlet把处理过的请求送至eshop.jsp页。这促使该页重新显示主视图,这时购物车中显示的数据已被更新。如果用户决定结帐,这个请求在处理后被送至checkout.jsp页(见代码清单5),通过如下所示的调度程序实现:

  string url="/jsp/shopping/checkout.jsp";

  servletcontext sc = getservletcontext();

  requestdispatcher rd = sc.getrequestdispatcher(url);

  rd.forward(req,res);

  代码清单5:checkout.jsp

  <%@ page session=&quot;true&quot; import=&quot;java.util.*, shopping.cd&quot; %>

  <html>

  <head>

  <title>music without borders checkout</title>

  </head>

  <body bgcolor=&quot;#33ccff&quot;>

   <font face=&quot;times new roman,times&quot; size=+3>

   music without borders checkout

   </font>

   <hr><p>

   <center>

   <table border=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; bgcolor=&quot;#ffffff&quot;>

   <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>

   <%

   vector buylist = (vector) session.getvalue(&quot;shopping.shoppingcart&quot;);

   string amount = (string) request.getattribute(&quot;amount&quot;);

   for (int i=0; i < buylist.size();i++) {

   cd anorder = (cd) buylist.elementat(i);

   %>

   <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>

   </tr>

   <%

   }

   session.invalidate();

   %>

   <tr>

   <td> </td>

   <td> </td>

   <td><b>total</b></td>

   <td><b>&#36;<%= amount %></b></td>

   <td> </td>

   </tr>

   </table>

   <p>

   <a href=&quot;/examples/jsp/shopping/eshop.jsp&quot;>shop some more!</a>

   </center>

  </body>

  </html>

  checkout.jsp仅从会话中取出购物车和所有请求的总数,然后显示所选的物品及总价格。图5显示了结帐时客户端的视图。一旦用户结帐,那么及时去除会话对象很重要。照顾到这一点,在页面最后需要有一个session.invalidate()调用。这一处理是必要的,原有有两个:第一,如果会话不被终止,用户的购物车就不会重新初始化,当他没有结帐而试图开始新一轮购物的时候,他的购物车中仍将保留着他已购买的那些物品。第二,如果用户未结帐就离开了,那么这个会话对象不会作废,仍将占用宝贵的系统资源直到它过期。由于默认的会话有效期是30分钟,所以在高负荷的系统上,这种情况会使系统资源迅速耗尽。我们当然知道一个应用程序将系统资源耗尽意味着什么!


  图5:音乐无国界,结帐视图

  图中文字同图4。

  注意,在这个例子中所有的资源分配都是基于会话的,因为这个模型就是存于会话内的。所以,你必须确保控制servlet不被用户访问,即使是意外的访问也不允许。要解决这一问题,可以在控制servlet检查到一个非法访问时自动转向重定向错误页面。(见代码清单6)

  代码清单 6:error.html

  <html>

  <body>

  <h1>

   sorry, there was an unrecoverable error! <br>

   please try <a href=&quot;/examples/jsp/shopping/eshop.jsp&quot;>again</a>.

  </h1>

  </body>

  </html>

配置“音乐无国界”
  我假定你使用的是sun公司最新版本的javaserver web development kit(java服务器网页开发工具包-jswdk)来举例说明。假设此服务器安装在jswdk-1.0.1目录下――这是在windows中它的默认安装路径,“音乐无国界”应用程序的文件应如下配置:

  ●在 jswdk-1.0.1examplesjsp目录下建立shopping目录

  ●复制eshop.jspjswdk-1.0.1examplesjspshopping

  ●复制cart.jspjswdk-1.0.1examplesjspshopping

  ●复制check.jspjswdk-1.0.1examplesjspshopping

  ●键入javac *.java编译.java文件

  ●复制 shoppingservlet.class到 jswdk-1.0.1webpagesweb-infservlets

  ●在jswdk-1.0.1examplesweb-infjspbeans目录下建立shopping目录

  ●复制cd.class到jswdk-1.0.1examplesweb-infjspbeansshopping

  ●复制error.htmljswdk-1.0.1webpages

  ●服务器一旦启动,你就可以使用http://localhost:8080/examples/jsp/shopping/eshop.jsp访问这个应用程序

权衡jspservlets
  在这个例子中,我们仔细考察了jsp model 2提供的控制水准和灵活性。特别地,我们看到了如何挖掘servlets和jsp的最佳特性,在最大程度上分离内容和表达。正确运用model2体系结构,可以把所有处理逻辑集中于控制servlet中,让jsp页只负责表达或视图。然而,使用model 2的弊端是它很复杂。因此,在简单的应用中model 1或许更合适。

  <全文完>


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons