仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 479|回复: 11
打印 上一主题 下一主题

[学习教程] JAVA编程:JSP初级手艺怎样开辟静态网站

[复制链接]
金色的骷髅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:21:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
到时我们不用学struts,不用学spring,不用学Hibernate,只要能把jsf学会了,完全可以替代所有的框架,包括AJAX,都知道AJAX并不是新技术,虽说我没深入学习jsf但我认为jsf应该已经能通过其它技术替代AJAX,实现无缝刷新。js|静态|初级最近几年来,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中(),jsp页面单独呼应哀求并将处置了局前往客户。这里仍旧有体现和内容的分别,由于一切的数据依托bean来处置。只管形式1能够很好的满意小型使用的必要,但却不克不及满意年夜型使用的请求。大批利用形式1,经常会招致页面被嵌进大批的script大概java代码。出格是当必要处置的贸易逻辑很庞大时,情形会变得严峻。大概关于java程序员来讲,这不算年夜的成绩。但假如开辟者是前端界面计划职员――在年夜型项目中,这十分罕见,――则代码的开辟和保护将呈现坚苦。在任何项目中,如许的形式几总会招致界说不清的呼应和项目办理的坚苦。


在中显现的形式2布局,是一种面向静态内容的完成,分离了servlet和jsp手艺。它使用了两种手艺原本的长处,接纳jsp来体现页面,接纳servlets来完成大批的处置。这里,servlet饰演一个把持者的脚色,并卖力呼应客户哀求。接着,servlet创立jsp必要的bean和对象,再依据用户的举动,决意将谁人jsp页面发送给用户。出格要注重,jsp页面中没有任何贸易处置逻辑;它只是复杂地检索servlet先前创立的bean大概对象,再将静态内容拔出预界说的模版。从开辟的概念看,这一形式具有更明晰的页面体现,分明的开辟者脚色分别,能够充实天时用开辟小组中的界面计划职员。现实上,越是庞大的项目,接纳形式2的优点就越凸起。


为了分明地懂得形式2的开辟历程,我们举一个网上音乐商铺的例子。

我们创立一个叫”音乐无版图”的发卖音乐成品的商铺。“音乐无版图”在线商铺的主界面,是一个叫“音乐无版图”的页面(代码1)。你会看到,这个页面完整着眼于用户界面,与处置逻辑有关。别的,注重别的一个jsp页面,Cart.jsp(在代码2中),用<jsp:includepage="Cart.jsp"flush="true"/>.嵌进Eshop.jsp中。



Listing1:
EShop.jsp

<%@pagesession="true"%>
<html>
<head>
<title>MusicWithoutBorders</title>
</head>
<bodybgcolor="#33CCFF">
<fontface="TimesNewRoman,Times"size="+3">
MusicWithoutBorders
</font>
<hr><p>
<center>
<formname="shoppingForm"
action="/examples/servlet/ShoppingServlet"
method="POST">
<b>CD:</b>
<selectname=CD>
<option>Yuan|TheGuoBrothers|China|$14.95</option>
<option>DrumsofPassion|BabatundeOlatunji|Nigeria|$16.95</option>
<option>Kaira|TounamiDiabate|Mali|$16.95</option>
<option>TheLionisLoose|EliadesOchoa|Cuba|$13.95</option>
<option>DancetheDevilAway|Outback|Australia|$14.95</option>
<option>RecordofChanges|Samulnori|Korea|$12.95</option>
<option>Djelika|TounamiDiabate|Mali|$14.95</option>
<option>Rapture|NusratFatehAliKhan|Pakistan|$12.95</option>
<option>CesariaEvora|CesariaEvora|CapeVerde|$16.95</option>
<option>Ibuki|Kodo|Japan|$13.95</option>
</select>
<b>Quantity:</b><inputtype="text"name="qty"SIZE="3"value=1>
<inputtype="hidden"name="action"value="ADD">
<inputtype="submit"name="Submit"value="AddtoCart">
</form>
</center>
<p>
<jsp:includepage="Cart.jsp"flush="true"/>
</body>
</html>



Listing2:
Cart.jsp

<%@pagesession="true"import="java.util.*,shopping.CD"%>
<%
Vectorbuylist=(Vector)session.getValue("shopping.shoppingcart");
if(buylist!=null&&(buylist.size()>0)){
%>
<center>
<tableborder="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(intindex=0;index<buylist.size();index++){
CDanOrder=(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>
<formname="deleteForm"
action="/examples/servlet/ShoppingServlet"
method="POST">
<inputtype="submit"value="Delete">
<inputtype="hidden"name="delindex"value=<%=index%>>
<inputtype="hidden"name="action"value="DELETE">
</form>
</td>
</tr>
<%}%>
</table>
<p>
<formname="checkoutForm"
action="/examples/servlet/ShoppingServlet"
method="POST">
<inputtype="hidden"name="action"value="CHECKOUT">
<inputtype="submit"name="Checkout"value="Checkout">
</form>
</center>
<%}%>



这里,Cart.jsp依照MVC的形式1处置基于SESSION的购物车的体现。请看Cart.jsp入手下手处的代码:

<%
Vectorbuylist=(Vector)session.getValue("shopping.shoppingcart");
if(buylist!=null&&(buylist.size()>0)){
%>

实质上,这段代码从SESSION中掏出“购物车”。假如“购物车”为空大概没有被创立,它就甚么也不显现。以是,在用户第一次会见使用时,其界面如图:


假如“购物车”不为空,用户选择的商品从车中掏出,顺次显现在页面上:

<%
for(intindex=0;index<buylist.size();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<buylist.size();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<buylist.size();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"%>
<html>
<head>
<title>MusicWithoutBordersCheckout</title>
</head>
<bodybgcolor="#33CCFF">
<fontface="TimesNewRoman,Times"size=+3>
MusicWithoutBordersCheckout
</font>
<hr><p>
<center>
<tableborder="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>
<%
Vectorbuylist=(Vector)session.getValue("shopping.shoppingcart");
Stringamount=(String)request.getAttribute("amount");
for(inti=0;i<buylist.size();i++){
CDanOrder=(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>
<ahref="/examples/jsp/shopping/EShop.jsp">Shopsomemore!</a>
</center>
</body>
</html>


结帐页面复杂地从SESSION中掏出购物车,然后显现每一个物品和总金额。这里的关头是要停止SESSION,因而在页面中有一个session.invalidate()挪用。这一处置有两个缘故原由。起首,假如不停止SESSION,用户的购物车不会被初始化,假如用户要持续购置,车中会保存他已付出过的商品。别的,假如用户不结帐就分开了,则SESSION会持续占用无效的资本直到过时。过时工夫通常为30分钟,在一个年夜的站点上,如许的情形会很快招致资本耗尽。固然,这是我们不肯看到的。


注重,一切的资本分派在这个例子中是基于SESSION的。以是,你必需确保把持SERVLET不被用户会见,即便是不测的会见也不同意。这能够在把持反省到一个不法会见时用一个复杂的重定向毛病页面来处置。见源代码6。

Listing6:
error.html

<html>
<body>
<h1>
Sorry,therewasanunrecoverableerror!

Pleasetry<ahref="/examples/jsp/shopping/EShop.jsp">again</a>.
</h1>
</body>
</html>


小结

本章的会商显现,利用形式2,JSP和SERVLET能够在功效上最年夜限制的分隔。准确地利用形式2,招致一其中心化的把持SERVLET,和只完成显现的JSP页面。另外一方面,形式2的完成很庞大。因而,在复杂的使用中,能够思索利用形式1。
市场分额,java比asp高一点,因为C#是仿照java开发的,所以哦C#能做的java都能做到,但是java能做的,C#不一定都能做到。毕竟是抄袭吗。
深爱那片海 该用户已被删除
沙发
发表于 2015-1-20 21:03:47 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
飘灵儿 该用户已被删除
板凳
发表于 2015-1-25 15:14:41 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
第二个灵魂 该用户已被删除
地板
发表于 2015-1-31 16:29:25 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
透明 该用户已被删除
5#
发表于 2015-2-2 22:16:44 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
莫相离 该用户已被删除
6#
发表于 2015-2-5 14:50:53 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
分手快乐 该用户已被删除
7#
发表于 2015-2-12 07:07:20 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
小女巫 该用户已被删除
8#
发表于 2015-2-25 19:30:22 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
简单生活 该用户已被删除
9#
发表于 2015-2-28 12:27:15 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
愤怒的大鸟 该用户已被删除
10#
发表于 2015-3-5 03:08:32 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
若相依 该用户已被删除
11#
发表于 2015-3-19 15:40:39 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
兰色精灵 该用户已被删除
12#
发表于 2015-3-28 14:28:33 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 20:49

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表