JSP高级技术如何开发动态网站.docx

上传人:b****2 文档编号:13984416 上传时间:2023-06-19 格式:DOCX 页数:15 大小:20.47KB
下载 相关 举报
JSP高级技术如何开发动态网站.docx_第1页
第1页 / 共15页
JSP高级技术如何开发动态网站.docx_第2页
第2页 / 共15页
JSP高级技术如何开发动态网站.docx_第3页
第3页 / 共15页
JSP高级技术如何开发动态网站.docx_第4页
第4页 / 共15页
JSP高级技术如何开发动态网站.docx_第5页
第5页 / 共15页
JSP高级技术如何开发动态网站.docx_第6页
第6页 / 共15页
JSP高级技术如何开发动态网站.docx_第7页
第7页 / 共15页
JSP高级技术如何开发动态网站.docx_第8页
第8页 / 共15页
JSP高级技术如何开发动态网站.docx_第9页
第9页 / 共15页
JSP高级技术如何开发动态网站.docx_第10页
第10页 / 共15页
JSP高级技术如何开发动态网站.docx_第11页
第11页 / 共15页
JSP高级技术如何开发动态网站.docx_第12页
第12页 / 共15页
JSP高级技术如何开发动态网站.docx_第13页
第13页 / 共15页
JSP高级技术如何开发动态网站.docx_第14页
第14页 / 共15页
JSP高级技术如何开发动态网站.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

JSP高级技术如何开发动态网站.docx

《JSP高级技术如何开发动态网站.docx》由会员分享,可在线阅读,更多相关《JSP高级技术如何开发动态网站.docx(15页珍藏版)》请在冰点文库上搜索。

JSP高级技术如何开发动态网站.docx

JSP高级技术如何开发动态网站

JSP高级技术如何开发动态网站

--------------------------------------------------------------------------------

日期:

2006-1-239:

13:

58来源:

网络收集编辑:

henry1031作者:

henry1031

【简介】近年来,Jsp技术现在已经成为一种卓越的动态网站开发技术。

Java开发者出于各种理由喜爱使用jsp。

有人喜爱其“一次开发,处处使用”的性能,另外的人觉得jsp使java成为一种易学的服务器端scripting语言。

--------------------------------------------------------------------------------

近年来,Jsp技术现在已经成为一种卓越的动态网站开发技术。

Java开发者出于各种理由喜爱使用jsp。

有人喜爱其“一次开发,处处使用”的性能,另外的人觉得jsp使java成为一种易学的服务器端scripting语言。

但是,jsp最大的长处在它将页面的表现和页面的商业逻辑分开了。

本章中,我们将深入地讨论如何使用jsp模式2体系结构来开发网站。

这一模式可以被看作是通用模式浏览控制模式(popularModel-View-Controller,MVC)模式的服务器端实现。

Servlets有何缺陷?

当jsp成为开发动态网站的主要技术时,可能有人会问为何在jsp技术中我们不强调servlets。

Servlets的应用是没有问题的。

它们非常适于服务器端的处理和编程,并且它们会长期驻留在他们现在的位置。

但是,从结构上说,我们可以将jsp看作是servlet的一个高层的抽象实现,特别是在servlet2.2API下。

但是,你仍然不能无拘束地使用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中),用

includepage="Cart.jsp"flush="true"/>.嵌入Eshop.jsp中。

Listing1:

EShop.jsp

<%@pagesession="true"%>

MusicWithoutBorders

MusicWithoutBorders


action="/examples/servlet/ShoppingServlet"

method="POST">

CD:

Quantity:

includepage="Cart.jsp"flush="true"/>

Listing2:

Cart.jsp

<%@pagesession="true"import="java.util.*,shopping.CD"%>

<%

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

if(buylist!

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

%>

ALBUM

ARTIST

COUNTRY

PRICE

QUANTITY

<%

for(intindex=0;index

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

%>

<%=anOrder.getAlbum()%>

<%=anOrder.getArtist()%>

<%=anOrder.getCountry()%>

<%=anOrder.getPrice()%>

<%=anOrder.getQuantity()%>

action="/examples/servlet/ShoppingServlet"

method="POST">

'>

<%}%>

action="/examples/servlet/ShoppingServlet"

method="POST">

<%}%>

这里,Cart.jsp按照MVC的模式1处理基于SESSION的购物车的表现。

请看Cart.jsp开始处的代码:

<%

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

if(buylist!

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

%>

本质上,这段代码从SESSION中取出“购物车”。

如果“购物车”为空或者没有被创建,它就什么也不显示。

所以,在用户第一次访问应用时,其界面如图:

如果“购物车”不为空,用户选择的商品从车中取出,依次显示在页面上:

<%

for(intindex=0;index

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

%>

一旦生成一个物品的说明,就使用JSP按照事先设定的模板将其插入静态HTML页面。

下图显示了用户选购一些物品后的界面:

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

Listing3:

ShoppingServlet.java

importjava.util.*;

importjava.io.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

importshopping.CD;

publicclassShoppingServletextendsHttpServlet{

publicvoidinit(ServletConfigconf)throwsServletException{

super.init(conf);

}

publicvoiddoPost(HttpServletRequestreq,HttpServletResponseres)

throwsServletException,IOException{

HttpSessionsession=req.getSession(false);

if(session==null){

res.sendRedirect("http:

//localhost:

8080/error.html");

}

Vectorbuylist=

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

Stringaction=req.getParameter("action");

if(!

action.equals("CHECKOUT")){

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

Stringdel=req.getParameter("delindex");

intd=(newInteger(del)).intValue();

buylist.removeElementAt(d);

}elseif(action.equals("ADD")){

//anypreviousbuysofsamecd?

booleanmatch=false;

CDaCD=getCD(req);

if(buylist==null){

//addfirstcdtothecart

buylist=newVector();//firstorder

buylist.addElement(aCD);

}else{//notfirstbuy

for(inti=0;i

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

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

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

buylist.setElementAt(cd,i);

match=true;

}//endofifnamematches

}//endoffor

if(!

match)

buylist.addElement(aCD);

}

}

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

Stringurl="/jsp/shopping/EShop.jsp";

ServletContextsc=getServletContext();

RequestDispatcherrd=sc.getRequestDispatcher(url);

rd.forward(req,res);

}elseif(action.equals("CHECKOUT")){

floattotal=0;

for(inti=0;i

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

floatprice=anOrder.getPrice();

intqty=anOrder.getQuantity();

total+=(price*qty);

}

total+=0.005;

Stringamount=newFloat(total).toString();

intn=amount.indexOf('.');

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

req.setAttribute("amount",amount);

Stringurl="/jsp/shopping/Checkout.jsp";

ServletContextsc=getServletContext();

RequestDispatcherrd=sc.getRequestDispatcher(url);

rd.forward(req,res);

}

}

privateCDgetCD(HttpServletRequestreq){

//imagineifallthiswasinascriptlet...ugly,eh?

StringmyCd=req.getParameter("CD");

Stringqty=req.getParameter("qty");

StringTokenizert=newStringTokenizer(myCd,"|");

Stringalbum=t.nextToken();

Stringartist=t.nextToken();

Stringcountry=t.nextToken();

Stringprice=t.nextToken();

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

CDcd=newCD();

cd.setAlbum(album);

cd.setArtist(artist);

cd.setCountry(country);

cd.setPrice((newFloat(price)).floatValue());

cd.setQuantity((newInteger(qty)).intValue());

returncd;

}

}

每次用户用Eshop.jsp增加一个商品,页面就请求控制SERVLET。

控制SERVLET决定进一步的行动,并处理增加的商品。

接着,控制SERVLET实例化一个新的BEANCD代表选定的商品,并在返回SESSION前更新购物车对象。

Listing4:

CD.java

packageshopping;

publicclassCD{

Stringalbum;

Stringartist;

Stringcountry;

floatprice;

intquantity;

publicCD(){

album="";

artist="";

country="";

price=0;

quantity=0;

}

publicvoidsetAlbum(Stringtitle){

album=title;

}

publicStringgetAlbum(){

returnalbum;

}

publicvoidsetArtist(Stringgroup){

artist=group;

}

publicStringgetArtist(){

returnartist;

}

publicvoidsetCountry(Stringcty){

country=cty;

}

publicStringgetCountry(){

returncountry;

}

publicvoidsetPrice(floatp){

price=p;

}

publicfloatgetPrice(){

returnprice;

}

publicvoidsetQuantity(intq){

quantity=q;

}

publicintgetQuantity(){

returnquantity;

}

}

注意,我们的SERVLET中具有附加的智能,如果一个物品被重复选择,不会增加新的记录,而是在以前的记录上更新计数。

控制SERVLET也响应Cart.jsp中的行为,如修改数量,删除商品,还有结帐。

如果结帐,控制通过下述语句转向Checkout.jsp页面(源程序5):

Stringurl="/jsp/shopping/Checkout.jsp";

ServletContextsc=getServletContext();

RequestDispatcherrd=sc.getRequestDispatcher(url);

rd.forward(req,res);

Listing5:

Checkout.jsp

<%@pagesession="true"import="java.util.*,shopping.CD"%>

MusicWithoutBordersCheckout

MusicWithoutBordersCheckout


ALBUM

ARTIST

COUNTRY

PRICE

QUANTITY

<%

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

Stringamount=(String)request.getAttribute("amount");

for(inti=0;i

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

%>

<%=anOrder.getAlbum()%>

<%=anOrder.getArtist()%>

<%=anOrder.getCountry()%>

<%=anOrder.getPrice()%>

<%=anOrder.getQuantity()%>

<%

}

session.invalidate();

%>

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2