|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
Java的B/s开发是通常是javaweb开发,又叫J2EE开发,J2SE是手机开发。C#的C/s和B/s开发是说.net和Asp开发。。u在这里说明一点;资深一点的Java和C#程序员都明白一点jsByScottFerguson
Blueski编译
目次以下:
1引论
2典范的框架:Hello,World
3Servlet批评
4展现留言本
5留言本的形式
6作为使用属性的留言本
7留言本的逻辑
8结论
1引论
JSP的壮大上风在于把一种使用的商务逻辑和它的先容分别开来。用Smalltalk的面向对象的术语来讲,JSP勉励MVC(model-view-controller)的web使用。JSP的classes或beans是模子,JSP是这个视图,而Servlet是把持器。
这个例子是一个复杂的留言本,包含用户登录和留言。它被作为Resin平台的树模:
--实行脚色
--模子A留言本
--用于新用户的login.jsp
--用于已注册用户的add.jsp
--把持器GuestJsp,一个用来办理形态的servlet
2榜样的框架:Hello,World
GuestJspservlet的框架把"Hello,World"这个字符串传给login.jsp页面。这个框架为留言本设立布局。详细细节将鄙人面增补。
这个例子被编译后能够扫瞄到:
http://localhost:8080/servlet/jsp.GuestJsp
你能够看到页面上有如许的显现:Hello,world
JSP模板是以Servlet的处置入手下手然后把处置了局传给JSP页举行格局化。
以下利用了一个Servlet2.1ServletContext的特征getRequestDispatcher()。
哀求的调剂器在服务器上让servlets间接向前传送并包含了任何大概的子哀求。对SSI包括来讲这是一个更天真的代替做法。
在servlet文件中哀求的调剂器能够包括任何页面,servlet,或JSP的了局。GuestJsp将利用dispatcher.forward()来将把持传给JSP页举行格局化。
GuestJsp.java:Skeletonpackagejsp.GuestJsp;
importjava.io.*;
importjava.util.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
/**
*GuestJspisaservletcontrollinguser
*interactionwiththeguestbook.
*/
publicclassGuestJspextendsHttpServlet{
/**
*doGethandlesGETrequests
*/
publicvoiddoGet(HttpServletRequestreq,
HttpServletResponseres)
throwsServletException,IOException
{
//Savethemessageintherequestforlogin.jsp
req.setAttribute("message","Hello,world");
//gettheapplicationobject
ServletContextapp=getServletContext();
//selectlogin.jspasthetemplate
RequestDispatcherdisp;
disp=app.getRequestDispatcher("login.jsp");
//forwardtherequesttothetemplate
disp.forward(req,res);
}
}
servlet和jsp页利用HttpRequest对象中的属性举行通讯。skeleton在"message"属性中保留了"Hello,World"。
当login.jsp启动时,它将捕获到该字符串并将其打印出来。
因为Resin的JavaScript可以读取扩大的Bean模子,它能够将request.getAttribute("message")转换成为
JavaScript的对应物request.attribute.message。
login.jsp:Skeleton<%@pagelanguage=javascript%>
<head>
<title><%=request.attribute.message%></title>
</head>
<bodybgcolor=white>
<h1><%=request.attribute.message%></h1>
</body>
3Servlet的温习
关于来自于ASP或CGI背景并转向jsp的人来讲,
Servlets取代CGI剧本表现了Java在静态类加载方面的上风。servlet就是一个Java类,
它对Servlet或HttpServlet举行了扩大并安排到得当的路径中。Resin将主动加载servlet并实行它。
url/servlet/classname将request提交给Servlet哀求器。哀求器会从doc/WEB-INF/classes主动加载Java类的类名
并试图实行Servlet的service办法。
Resin将按期反省类文件以判别是不是被修正过。假如被修正过,则将用新的servlet代替旧的。
4显现留言本
在基础框架已运转后,下一步是创立model。
5留言本模子
留言本是很间接的,这里常识包括了一下API。它服从Bean模子以简化JavaScript。
一样的API能够事情于HashMap,基于文件,和数据库使用。
JSP文件只能存取public办法。以是JSP文件没法创立一个新的留言本大概增添一个新用户。
这是GuestJspservlet的义务。
jsp.Guest.javaAPIpackagejsp;
publicclassGuest{
Guest();
publicStringgetName();
publicStringgetComment();
}
Resin的JavaScript能读取Bean模子。以是利用JavaScript的JSP页面能够存取getName()和getComment()
作为属性。比方,你能够简化利用guest.name和guest.comment。
jsp.GuestBook.javaAPIpackagejsp;
publicclassGuestBook{
GuestBook();
voidaddGuest(Stringname,Stringcomment);
publicIteratoriterator();
}
Resin的JavaScript一样能够读取iterator()挪用,以是你可使用JavaScript用于...任何一个来获得用户:
for(varguestinguestBook){
...
}
GuestBook作为application属性
为了使得例子坚持复杂,GuestJsp在application(ServletContext)中存取GuestBook。作为例子,
在application中保留数据是能够承受的,但关于完整成熟的使用,最好仅利用application将数据放到别的中央。
jsp.GuestJsp.java//gettheapplicationobject
ServletContextapp=getServletContext();
GuestBookguestBook;
//TheguestBookisstoredintheapplication
synchronized(app){
guestBook=(GuestBook)app.getAttribute("guest_book");
//Ifitdoesntexist,createit.
if(guestBook==null){
guestBook=newGuestBook();
guestBook.addGuest("HarryPotter","Griffindorrules");
guestBook.addGuest("DracoMalfoy","Slytherinrules");
app.setAttribute("guest_book",guestBook);
}
}
RequestDispatcherdisp;
disp=app.getRequestDispatcher("login.jsp");
//synchronizetheApplicationsotheJSPfile
//doesntneedtoworryaboutthreading
synchronized(app){
disp.forward(req,res);
}
JSP文件自己是复杂的。它从application猎取留言本并在表中显现内容。一般,
application对象必要同步,由于一些客户端大概同时浏统一页面。
GuestJsp在jsp文件被挪用之前当心处置了同步情形。
login.jsp:DisplayGuestBook<%@pagelanguage=javascript%>
<head>
<title>HogwartsGuestBook</title>
</head>
<bodybgcolor=white>
<h1>HogwartsGuestBook</h1>
<table>
<tr><tdwidth=25%><em>Name</em><td><em>Comment</em>
<%
varguestBook=application.attribute.guest_book
for(varguestinguestBook){
out.writeln("<tr><td>"+guest.name+"<td>"+guest.comment);
}
%>
</table>
</body>
HogwartsGuestBook
NameComment
HarryPotterGriffindorRules
DracoMalfoySlytherinRules
6留言本的划定规矩(logic)--作为使用属性的留言本
留言本的划定规矩是很复杂的。假如用户没有登录,他会看到一个提醒和登录表。
登录后他会看到提醒并在一个表中到场留言。login.jsp给出了登录的页面,add.jsp给出了
增添浮名的页面。
GuestJsp在session变量中保留了划定规矩信息。
实行login来登录或add来增添留言。个中
name:用户名
password:口令
comment:留言
7留言本划定规矩...
//namefromthesession
StringsessionName=session.getValue("name");
//actionfromtheforms
Stringaction=request.getParameter("action");
//namefromthelogin.jspform
StringuserName=request.getParameter("name");
//passwordfromthelogin.jspform
Stringpassword=request.getParameter("password");
//commentfromtheadd.jspform
Stringcomment=request.getParameter("comment");
//loginstorestheuserinthesession
if(action!=null&&action.equals("login")&&
userName!=null&&
password!=null&&password.equals("quidditch")){
session.putValue("name",userName);
}
//addsanewguest
if(action!=null&&action.equals("add")&&
sessionName!=null&&
comment!=null){
guestBook.addGuest(sessionName,comment);
}
Stringtemplate;
//ifnotloggedin,uselogin.jsp
if(session.getValue("name")==null)
template="login.jsp";
//ifloggedin,useadd.jsp
else
template="add.jsp";
RequestDispatcherdisp;
disp=app.getRequestDispatcher(template);
...
login.jsp和add.jsp仅加上了分歧forms在前一个section中显现代码。
login.jsp<%@pagelanguage=javascript%>
<head>
<title>HogwartsGuestBook:Login</title>
</head>
<bodybgcolor=white>
<h1>HogwartsGuestBook</h1>
<table>
<tr><tdwidth=25%><em>Name</em><td><em>Comment</em>
<%
varguestBook=application.attribute.guest_book
for(varguestinguestBook){
out.writeln("<tr><td>"+guest.name+"<td>"+guest.comment);
}
%>
</table>
<hr>
<formaction=GuestJspmethod=post>
<inputtype=hiddenname=actionvalue=login>
<table>
<tr><td>Name:<td><inputname=Name>
<tr><td>Password:<td><inputname=Passwordtype=password>
<tr><td><inputtype=submitvalue=Login>
</table>
</form>
</body>
8结论
Resin示例演示了扩大留言本的一些办法,包含到场一些智能的工具用于form处置。但是,因为forms获得更多的只能,即便是JSP模板也变得庞大化了。
有一个结论:XTP模板。
你通过从书的数量和开发周期及运行速度来证明:net和ruby要比java简单。 |
|