亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? jsp高級技術如何開發動態網站.txt

?? java學習文檔
?? TXT
字號:
作者:jspfuns
日期:2000-8-10 17:23:22
近年來,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);
%>

一旦生成一個物品的說明,就使用JSP按照事先設定的模板將其插入靜態HTML頁面。下圖顯示了用戶選購一些物品后的界面:




需要注意的一個重要的地方是所有關于Eshop.jsp,Cart.jsp的處理有一個控制SERVLET,ShoppingServlet.java,代碼在源程序3中:

Listing 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")) {
//any previous buys of same cd?
boolean match=false;
CD aCD = getCD(req);
if (buylist==null) {
//add first cd to the cart
buylist = new Vector(); //first order
buylist.addElement(aCD);
} else { // not first buy
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;
} //end of if name matches
} // end of 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) {
//imagine if all this was in a scriptlet...ugly, eh?
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;
}
}


每次用戶用Eshop.jsp增加一個商品,頁面就請求控制SERVLET。控制SERVLET決定進一步的行動,并處理增加的商品。接著,控制SERVLET實例化一個新的BEAN CD代表選定的商品,并在返回SESSION前更新購物車對象。

Listing 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中具有附加的智能,如果一個物品被重復選擇,不會增加新的記錄,而是在以前的記錄上更新計數。控制SERVLET也響應Cart.jsp中的行為,如修改數量,刪除商品,還有結帳。如果結帳,控制通過下述語句轉向Checkout.jsp頁面(源程序5):

String url="/jsp/shopping/Checkout.jsp";
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher(url);
rd.forward(req,res);

Listing 5:
Checkout.jsp 

<%@ page session="true" import="java.util.*, shopping.CD" %>
<html>
<head>
<title>Music Without Borders Checkout</title>
</head>
<body bgcolor="#33CCFF">
<font face="Times New Roman,Times" size=+3>
Music Without Borders Checkout
</font>
<hr><p>
<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>
<%
Vector buylist = (Vector) session.getValue("shopping.shoppingcart");
String amount = (String) request.getAttribute("amount");
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>$<%= amount %></b></td>
<td> </td>
</tr>
</table>
<p>
<a href="/examples/jsp/shopping/EShop.jsp">Shop some more!</a>
</center>
</body>
</html>


結帳頁面簡單地從SESSION中取出購物車,然后顯示每個物品和總金額。這里的關鍵是要結束SESSION,因此在頁面中有一個session.invalidate()調用。這一處理有兩個原因。首先,如果不結束SESSION,用戶的購物車不會被初始化,如果用戶要繼續購買,車中會保留他已經支付過的商品。另外,如果用戶不結帳就離開了,則SESSION會繼續占用有效的資源直到過期。過期時間一般是30分鐘,在一個大的站點上,這樣的情況會很快導致資源耗盡。當然,這是我們不愿看到的。


注意,所有的資源分配在這個例子中是基于SESSION的。所以,你必須確保控制SERVLET不被用戶訪問,即使是意外的訪問也不允許。這可以在控制檢查到一個非法訪問時用一個簡單的重定向錯誤頁面來處理。見源代碼6。

Listing 6:
error.html 

<html>
<body>
<h1>
Sorry, there was an unrecoverable error! 

Please try <a href="/examples/jsp/shopping/EShop.jsp">again</a>.
</h1>
</body>
</html>


小結

本章的討論顯示,使用模式2,JSP和SERVLET可以在功能上最大限度的分開。正確地使用模式2,導致一個中心化的控制SERVLET,以及只完成顯示的JSP頁面。另一方面,模式2的實現很復雜。因此,在簡單的應用中,可以考慮使用模式1。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本在线不卡视频一二三区| 免费在线观看视频一区| 日韩欧美中文字幕制服| 日韩三级免费观看| 精品国产乱码久久久久久蜜臀| 精品少妇一区二区三区在线视频| 日韩女优av电影在线观看| 精品99一区二区三区| 国产欧美日韩中文久久| 中文字幕视频一区二区三区久| 日韩理论片中文av| 午夜精品久久久久久| 美女视频一区二区| 国产成人av电影在线| 91免费视频网址| 精品久久久久久亚洲综合网| 中文字幕制服丝袜一区二区三区| 亚洲精品久久久蜜桃| 美腿丝袜亚洲色图| 亚洲国产精品精华液ab| 亚洲欧美另类久久久精品| 日本午夜一本久久久综合| 国产一区二区在线观看免费 | 色老汉一区二区三区| 777午夜精品视频在线播放| 国产午夜精品在线观看| 亚洲1区2区3区4区| 一本一道久久a久久精品| 久久久精品免费观看| 亚洲综合久久久久| 不卡区在线中文字幕| 久久亚洲影视婷婷| 喷白浆一区二区| 91丝袜美女网| 国产日产精品1区| 精品一区二区三区欧美| 欧美日韩国产bt| 亚洲欧美国产77777| 成人亚洲一区二区一| 久久精品亚洲国产奇米99| 久久精品久久精品| 欧美老女人第四色| 一区二区三区四区在线播放| 一本到一区二区三区| 亚洲天堂免费在线观看视频| 成人综合在线观看| 久久久电影一区二区三区| 国产精品一卡二卡在线观看| 精品国产免费人成电影在线观看四季 | 午夜欧美2019年伦理| 欧美日韩一区小说| 日韩 欧美一区二区三区| 777欧美精品| 激情五月婷婷综合| 国产精品婷婷午夜在线观看| 波多野结衣一区二区三区| 亚洲精品视频免费看| 一道本成人在线| 日本最新不卡在线| 国产欧美日本一区二区三区| 91麻豆免费在线观看| 亚洲综合成人在线| 欧美一区二区人人喊爽| 国产美女主播视频一区| 亚洲欧美综合网| 欧美老年两性高潮| 成人精品免费视频| 日日摸夜夜添夜夜添亚洲女人| 精品伦理精品一区| 91视频91自| 麻豆精品视频在线| 亚洲人成影院在线观看| 6080午夜不卡| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 国产精品毛片无遮挡高清| 91啦中文在线观看| 国产在线不卡一卡二卡三卡四卡| 日韩理论在线观看| 国产亚洲美州欧州综合国| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 亚洲欧洲精品天堂一级| 337p亚洲精品色噜噜噜| 色综合天天综合在线视频| 精品一区二区三区免费播放| 亚洲香蕉伊在人在线观| 国产精品区一区二区三区| www国产亚洲精品久久麻豆| 欧美三级韩国三级日本一级| 99精品热视频| 成人h动漫精品| 福利电影一区二区| 国产麻豆欧美日韩一区| 韩国欧美国产一区| 狠狠狠色丁香婷婷综合激情 | 日韩女优av电影在线观看| 色8久久人人97超碰香蕉987| av电影在线观看完整版一区二区| 国产一区二区三区免费观看| 精品在线播放午夜| 久久国产精品99精品国产| 精品一区二区三区不卡| 精品无码三级在线观看视频| 国产在线播放一区二区三区| 国产不卡视频一区| www.色精品| 欧美日韩中文国产| 日韩你懂的在线观看| 国产视频一区不卡| 国产色91在线| 亚洲丝袜美腿综合| 日本怡春院一区二区| 紧缚捆绑精品一区二区| 国产成人免费视| 精品污污网站免费看| 欧美大胆人体bbbb| 亚洲欧洲一区二区在线播放| 亚洲在线观看免费视频| 日韩电影一区二区三区四区| 国产精品88av| 欧美三电影在线| 久久精品视频一区二区| 亚洲美女偷拍久久| 亚洲国产精品天堂| 国产伦精品一区二区三区免费| www.亚洲精品| 欧美电影免费提供在线观看| 国产精品水嫩水嫩| 日产精品久久久久久久性色| zzijzzij亚洲日本少妇熟睡| 欧美精品久久久久久久多人混战 | 琪琪久久久久日韩精品| 国产成人午夜视频| 日韩欧美不卡一区| 亚洲一级在线观看| 不卡影院免费观看| 欧美一区二区三区免费| 夜夜嗨av一区二区三区网页| 国产高清成人在线| xf在线a精品一区二区视频网站| 亚洲自拍欧美精品| 成人免费视频播放| 久久久不卡网国产精品二区| 日本欧美一区二区三区| 精品视频一区三区九区| 亚洲精品视频在线观看网站| 不卡av电影在线播放| 国产精品你懂的| 99亚偷拍自图区亚洲| 中文字幕精品一区二区三区精品| 久久国产精品区| 久久久久久麻豆| 国产乱人伦偷精品视频免下载 | 成人国产精品免费观看视频| 国产亚洲人成网站| 国产91丝袜在线播放九色| 国产欧美va欧美不卡在线| 国产成人av一区二区三区在线| 精品久久久久香蕉网| 成人午夜短视频| 伊人色综合久久天天| 欧美日韩亚洲综合| 免费av成人在线| 日韩午夜激情免费电影| 精品一区二区三区视频| 国产精品三级电影| 日本精品视频一区二区三区| 视频一区二区三区入口| 精品国产sm最大网站免费看| 韩国女主播一区二区三区| 国产精品午夜春色av| 欧美视频三区在线播放| 久久精品国产免费| 国产精品毛片无遮挡高清| 91伊人久久大香线蕉| 日本一区中文字幕| 中文字幕制服丝袜成人av| 欧美日韩久久一区二区| 国产99久久久国产精品免费看| 中文字幕字幕中文在线中不卡视频| 777a∨成人精品桃花网| 成人va在线观看| 久久精品噜噜噜成人av农村| 亚洲精品成人精品456| 久久香蕉国产线看观看99| 欧美三片在线视频观看| 成人av免费在线观看| 精品一区二区免费在线观看| 亚洲国产成人va在线观看天堂| 中文字幕av一区二区三区免费看| 欧美巨大另类极品videosbest| 成人av在线资源网| 国产精品一区二区久久精品爱涩| 奇米影视一区二区三区| 亚洲一区在线免费观看| 国产精品看片你懂得| 国产亚洲精品7777| 日韩精品一区在线观看| 欧美电影免费观看高清完整版在| 欧美老年两性高潮| 91精品福利视频|