当前位置: 首页 > 图文教程 > 网络编程 > JSP > 实例讲解JSP Model2体系结构(中)

JSP
jsp计数器制作
用jsp编写文件上载
基于JSP的动态网站开发技术
JSP由浅入深(3)—— 通过表达式增加动态内容
JSP由浅入深(5)—— Scriptlets和HTML的混合
JSP由浅入深(1)—— 熟悉JSP服务器
JSP由浅入深(12)—— 表单编辑
JSP由浅入深(11)—— 标记库
JSP由浅入深(10)—— Beans and Forms处理
JSP由浅入深(9)—— JSP Sessions
JSP由浅入深(8)—— JSP Tags
JSP由浅入深(6)—— JSP声明
JSP由浅入深(4)—— Scriptlets
JSP由浅入深(2)—— 第一个JSP
JSP由浅入深(7)—— JSP Directives
JSP中的字符替换函数 str_replace() 实现!
把一张图片变形扭曲成各种不同的长宽
用JSP编写通用信息发布程序
Java Servlet及Cookie的使用
Apache+Servlet+Jsp环境设置(上)

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 42 ::
收藏到网摘: n/a

理解“音乐无国界”
  “音乐无国界”的主界面是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;
   }
  }