实例讲解JSP Model2体系结构(中)

理解“音乐无国界”
  “音乐无国界”的主界面是JSP页 Eshop.jsp(见代码清单1)。你会注意到,这个页面几乎只作为专门的用户界面,不承担任何处理任务――是一个最理想的JSP方案。另外,请注意另一个JSP页Cart.jsp(见代码清单2)被Eshop.jsp通过指令<jsp:include page="Cart.jsp" flush="true" />包含于其中。

  代码清单 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>

  代码清单 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体系中,购物车就充当Model的角色。

  观察Cart.jsp开头处的脚本片段:

  <%

   Vector buylist = (Vector) session.getValue("shopping.shoppingcart");

   if (buylist != null && (buylist.size() > 0)) {

  %>

  这段脚本主要是从会话中取出购物车。如果购物车是空的或尚未创建,则它什么都不显示;因此,当用户第一次访问这个应用程序时,呈现给他的视图如图3所示:

  图3:音乐无国界,主视图

  图中按钮文字:放入购物车

  如果购物车不为空,则选中的物品被依次从购物车中取出,如下面的脚本片段所示:

  <%

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

    CD anOrder = (CD) buylist.elementAt(index);

  %>

  描述物品的变量一旦被创建,就会被用JSP表达式直接嵌入静态HTML模板中去。图4显示了当用户向购物车中放入一些物品后的视图。

  图4:音乐无国界,购物车视图

  图中文字:Music Without Borders:音乐无国界;Quantity:数量;ALBUM:唱片;ARTIST:演唱者;COUNTRY:国家;PRICE:价格;Delete:删除;Checkout:结帐。

  这里需要注意的重要一点是,在Eshop.jsp和Cart.jsp中实现的对所有动作的处理都由一个servlet――ShoppingServlet.java控制,如代码清单3所示:

  代码清单3:ShoppingServlet.java

  import java.util.*;

  import java.io.*;

  import javax.servlet.*;

  import javax.servlet.http.*;

  import shopping.CD;

  public class ShoppingServlet extends HttpServlet {

   public void init(ServletConfig conf) throws ServletException {

    super.init(conf);

   }

   public void doPost (HttpServletRequest req, HttpServletResponse res)

     throws ServletException, IOException {

    HttpSession session = req.getSession(false);

    if (session == null) {

     res.sendRedirect("http://localhost:8080/error.html");

    }

    Vector buylist=

     (Vector)session.getValue("shopping.shoppingcart");

    String action = req.getParameter("action");

    if (!action.equals("CHECKOUT")) {

     if (action.equals("DELETE")) {

      String del = req.getParameter("delindex");

      int d = (new Integer(del)).intValue();

      buylist.removeElementAt(d);

     } else if (action.equals("ADD")) {

      //以前是否购买了同样的cd?

      boolean match=false;

      CD aCD = getCD(req);

      if (buylist==null) {

       //将第一张CD放入购物车

       buylist = new Vector(); //第一份定单

       buylist.addElement(aCD);

      } else { // 不是第一次购买

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

        CD cd = (CD) buylist.elementAt(i);

        if (cd.getAlbum().equals(aCD.getAlbum())) {

         cd.setQuantity(cd.getQuantity()+aCD.getQuantity());

         buylist.setElementAt(cd,i);

         match = true;

        } //if name matches结束

       } // for循环结束

       if (!match)

        buylist.addElement(aCD);

      }

     }

     session.putValue("shopping.shoppingcart", buylist);

     String url="/jsp/shopping/EShop.jsp";

     ServletContext sc = getServletContext();

     RequestDispatcher rd = sc.getRequestDispatcher(url);

     rd.forward(req, res);

    } else if (action.equals("CHECKOUT")) {

     float total =0;

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

      CD anOrder = (CD) buylist.elementAt(i);

      float price= anOrder.getPrice();

      int qty = anOrder.getQuantity();

      total += (price * qty);

     }

     total += 0.005;

     String amount = new Float(total).toString();

     int n = amount.indexOf('.');

     amount = amount.substring(0,n+3);

     req.setAttribute("amount",amount);

     String url="/jsp/shopping/Checkout.jsp";

     ServletContext sc = getServletContext();

     RequestDispatcher rd = sc.getRequestDispatcher(url);

     rd.forward(req,res);

    }

   }

   private CD getCD(HttpServletRequest req) {

    //想象一下如果这些都在一个脚本片段中会有多么难看

    String myCd = req.getParameter("CD");

    String qty = req.getParameter("qty");

    StringTokenizer t = new StringTokenizer(myCd,"|");

    String album= t.nextToken();

    String artist = t.nextToken();

    String country = t.nextToken();

    String price = t.nextToken();

    price = price.replace('$',' ').trim();

    CD cd = new CD();

    cd.setAlbum(album);

    cd.setArtist(artist);

    cd.setCountry(country);

    cd.setPrice((new Float(price)).floatValue());

    cd.setQuantity((new Integer(qty)).intValue());

    return cd;

   }

  }

(0)

相关推荐

  • jsp 页面上图片分行输出小技巧

    <table border="0" cellpadding="2"> <c:forEach items="${pics}" var="pic" varStatus="status"> <c:if test="${((status.index)%3)==0}"><tr></c:if> <td> <input cl

  • jsp源码实例1(输出)

    package coreservlets; import java.io.*;import javax.servlet.*;import javax.servlet.http.*; /** Simple servlet that generates HTML.* <P>* Taken from Core Servlets and JavaServer Pages* from Prentice Hall and Sun Microsystems Press,* http://www.corese

  • JSP运行原理和九大隐式对象说明

    每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用. 由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响. JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的

  • 实例讲解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; publi

  • JSP动态输出Excel及中文乱码的解决

    最近在网上看到一个用java来操纵excel的open source,在weblogic上试用了一下,觉得很不错,特此向大家推荐一下. 首先去http://www.andykhan.com/jexcelapi/index.html下载最新的JExcelApi,把jxl.jar置于你的classpath中. 写一个javaBean,利用JExcelApi来动态生成excel文档,我这里写一个最简单的,示意性的.复杂的你可能还要查询数据库什么的. //////////////////////////

  • Jsp结合XML+XSLT将输出转换为Html格式

    我们知道 XML+XSLT就可以直接输出到支持XML的浏览器上,如IE 5.0以上,但是,我们还要考虑到有不少浏览器不直接支持XML,在这种情况下,我们需要在服务器上进行转换成html输出到浏览器,这种临时过渡办法恐怕要在一段时间内一直要使用. 使用Jsp 加上tablib标识库,我们可以完成这种转换. 著名open source项目组jakarta.apache.org推出的系列标识库中,就有这个功能的tanglib:http://jakarta.apache.org/taglibs/doc/

  • JSP输出HTML时产生的大量空格和换行的去除方法

    这个问题当年也困扰了我比较长的时间.因为在jsp内使用的EL标签和其他标签时,会产生大量的空格和换行符.例如: 复制代码 代码如下: ------- start ---------- <c:choose> <c:when test="${fn:length(mainPageList)>1&}"> Something </c:when> <c:otherwise> Others </c:otherwise> <

  • JSP中使用JavaScript动态插入删除输入框实现代码

    JavaScript代码: 复制代码 代码如下: <script language="javascript"> function addrows(){ var len = optionlist.rows.length; //得到table的行数 var obj = optionlist.insertRow(len);//在最后一行插入 /**插入第一列**/ obj.insertCell(0); obj.cells(0).innerHTML="选项" +

  • JSP程序运行原理、文档结构及简单输入输出实例分析

    本文实例讲述了JSP程序运行原理.文档结构及简单输入输出.分享给大家供大家参考.具体如下: 目标: 掌握Web应用的文档结构: 掌握JSP的运行原理: 掌握JSP的简单输入和输出. 主要内容: 通过一个简单实例介绍Web应用的文档结构和运行原理: 通过一个简单的注册功能介绍基本的输入输出. 实现内容:客户端验证. 1. 文档结构 每个应用都有一个根目录,例如ch2:理论上可以放在任何地方,但是需要配置,简单的做法,直接放在了webapps这个目录下,在这个目录的应用会被自动加载. 在根目录下会有

  • JSP + ajax实现输入框自动补全功能 实例代码

    下面是我用ajax实现的输入框自动补全功能,数据库数据很少,大体模仿出了百度首页的提示功能,当然,人家百度的东西不只是这么简单的!先看运行效果: index.jsp(包含主要的js代码) 复制代码 代码如下: <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath();

  • 实例讲解JSP Model2体系结构(上)

    最近已经有了很多相关的介绍,JSP正在成为一种卓越的Java技术,可用于创建动态Web应用程序.Java程序员之所以喜爱JSP有数不清的理由.有些人喜欢它为交互式页面带来的"一次编写,处处使用"的方式:还有些人欣赏它是因为它容易学习,并且使他们可以把Java作为一种服务器端脚本语言来使用.但更多的还都是因为一个共同原因――使用JSP的最大好处是它能帮助你有效地把表达与内容分离开.在本文中,我对下面的问题作了深入探讨,那就是,如何使用JSP Model 2体系结构获得最佳的表达-内容分离

随机推荐