實(shí)例講解JSP Model2體系結(jié)構(gòu)(中)
“音樂無國(guó)界”的主界面是JSP頁(yè) Eshop.jsp(見代碼清單1)。你會(huì)注意到,這個(gè)頁(yè)面幾乎只作為專門的用戶界面,不承擔(dān)任何處理任務(wù)――是一個(gè)最理想的JSP方案。另外,請(qǐng)注意另一個(gè)JSP頁(yè)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操縱著基于會(huì)話的購(gòu)物車的表達(dá),在MVC體系中,購(gòu)物車就充當(dāng)Model的角色。
觀察Cart.jsp開頭處的腳本片段:
<%
Vector buylist = (Vector) session.getValue("shopping.shoppingcart");
if (buylist != null && (buylist.size() > 0)) {
%>
這段腳本主要是從會(huì)話中取出購(gòu)物車。如果購(gòu)物車是空的或尚未創(chuàng)建,則它什么都不顯示;因此,當(dāng)用戶第一次訪問這個(gè)應(yīng)用程序時(shí),呈現(xiàn)給他的視圖如圖3所示:
圖3:音樂無國(guó)界,主視圖
圖中按鈕文字:放入購(gòu)物車
如果購(gòu)物車不為空,則選中的物品被依次從購(gòu)物車中取出,如下面的腳本片段所示:
<%
for (int index=0; index < buylist.size(); index++) {
CD anOrder = (CD) buylist.elementAt(index);
%>
描述物品的變量一旦被創(chuàng)建,就會(huì)被用JSP表達(dá)式直接嵌入靜態(tài)HTML模板中去。圖4顯示了當(dāng)用戶向購(gòu)物車中放入一些物品后的視圖。
圖4:音樂無國(guó)界,購(gòu)物車視圖
圖中文字:Music Without Borders:音樂無國(guó)界;Quantity:數(shù)量;ALBUM:唱片;ARTIST:演唱者;COUNTRY:國(guó)家;PRICE:價(jià)格;Delete:刪除;Checkout:結(jié)帳。
這里需要注意的重要一點(diǎn)是,在Eshop.jsp和Cart.jsp中實(shí)現(xiàn)的對(duì)所有動(dòng)作的處理都由一個(gè)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")) {
//以前是否購(gòu)買了同樣的cd?
boolean match=false;
CD aCD = getCD(req);
if (buylist==null) {
//將第一張CD放入購(gòu)物車
buylist = new Vector(); //第一份定單
buylist.addElement(aCD);
} else { // 不是第一次購(gòu)買
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結(jié)束
} // for循環(huán)結(jié)束
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) {
//想象一下如果這些都在一個(gè)腳本片段中會(huì)有多么難看
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;
}
}
- JSP運(yùn)行原理和九大隱式對(duì)象說明
- 實(shí)例講解JSP Model2體系結(jié)構(gòu)(下)
- 實(shí)例講解JSP Model2體系結(jié)構(gòu)(上)
- JSP中使用JavaScript動(dòng)態(tài)插入刪除輸入框?qū)崿F(xiàn)代碼
- JSP + ajax實(shí)現(xiàn)輸入框自動(dòng)補(bǔ)全功能 實(shí)例代碼
- JSP輸出HTML時(shí)產(chǎn)生的大量空格和換行的去除方法
- jsp 頁(yè)面上圖片分行輸出小技巧
- JSP動(dòng)態(tài)輸出Excel及中文亂碼的解決
- Jsp結(jié)合XML+XSLT將輸出轉(zhuǎn)換為Html格式
- jsp源碼實(shí)例1(輸出)
- JSP程序運(yùn)行原理、文檔結(jié)構(gòu)及簡(jiǎn)單輸入輸出實(shí)例分析
相關(guān)文章
JSP使用JDBC完成動(dòng)態(tài)驗(yàn)證及采用MVC完成數(shù)據(jù)查詢的方法
這篇文章主要介紹了JSP使用JDBC完成動(dòng)態(tài)驗(yàn)證及采用MVC完成數(shù)據(jù)查詢的方法,實(shí)例分析了JDBC連接數(shù)據(jù)庫(kù)及查詢數(shù)據(jù)庫(kù)的實(shí)現(xiàn)技巧,并結(jié)合MVC框架進(jìn)行分析說明,需要的朋友可以參考下2015-09-09jsp連接MySQL實(shí)現(xiàn)插入insert操作功能示例
本文將為大家展示下jsp連接MySQL執(zhí)行插入操作的功能,具體的示例及代碼如下,感興趣的朋友可以了解下2013-08-08Struts2中實(shí)現(xiàn)web應(yīng)用的初始化實(shí)例詳解
這篇文章主要介紹了Struts2中實(shí)現(xiàn)web應(yīng)用的初始化實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06jsp頁(yè)面中EL表達(dá)式被當(dāng)成字符串處理不顯示值問題的解決方法
下面小編就為大家?guī)硪黄猨sp頁(yè)面中EL表達(dá)式被當(dāng)成字符串處理不顯示值問題的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09JSP中通過Servlet 將服務(wù)器硬盤圖片并展示到瀏覽器
這篇文章主要介紹了JSP中通過Servlet 將服務(wù)器硬盤圖片并展示到瀏覽器的相關(guān)資料,希望通過本文大家可以實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08JSP實(shí)用教程之簡(jiǎn)易圖片驗(yàn)證碼的實(shí)現(xiàn)方法(附源碼)
圖片驗(yàn)證碼對(duì)大家來說應(yīng)該再熟悉不過了,而圖片驗(yàn)證碼的實(shí)現(xiàn)主要的技術(shù)點(diǎn)是如何生成一個(gè)圖片,下面這篇文章主要跟大家介紹了關(guān)于JSP實(shí)用教程之實(shí)現(xiàn)簡(jiǎn)易圖片驗(yàn)證碼的方法,文中介紹的非常詳細(xì),需要的朋友們下面來一起看看吧。2017-07-07jsp+ajax實(shí)現(xiàn)的局部刷新較驗(yàn)驗(yàn)證碼(onblur事件觸發(fā)較驗(yàn))
這篇文章主要介紹了jsp+ajax實(shí)現(xiàn)的局部刷新較驗(yàn)驗(yàn)證碼,基于onblur事件觸發(fā)較驗(yàn)功能,以實(shí)例形式詳細(xì)的分析了前臺(tái)顯示、圖片生成及Ajax動(dòng)態(tài)驗(yàn)證等詳細(xì)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10ResourceBundle類在jsp中的國(guó)際化實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猂esourceBundle類在jsp中的國(guó)際化實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07