实验4 JavaBean和Servlet.docx
- 文档编号:26194325
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:15
- 大小:49.08KB
实验4 JavaBean和Servlet.docx
《实验4 JavaBean和Servlet.docx》由会员分享,可在线阅读,更多相关《实验4 JavaBean和Servlet.docx(15页珍藏版)》请在冰豆网上搜索。
实验4JavaBean和Servlet
实验四JavaBean和Servlet
一、实验目的:
1、掌握JavaBean和Servlet的使用方法。
2、掌握JavaBean和Servlet的实现过程。
二、实验内容:
之前看的范例程序,其流程、逻辑、和数据展现都放在JSP,这种设计方式称为page-centric架构,或Model-1架构(图1),现在开始撰写的范例会将控制权交给servlet,以servlet为控制中心,掌控程序的流程以及HTML/JSP网页的分派,这是一种servlet-centric的架构,也称为Model-2架构(图2),其实也就是MVC(Model-View-Controller)架构的基础。
图1.page-centric架构
图2.servlet-centric架构
这次的学习重点:
∙了解如何设计JavaBeans。
∙了解如何在JSP中使用JavaBeans(存取JavaBeans的属性和方法)。
∙了解servlet如何分派JSP网页。
范例:
JSP呼叫JavaBeans
1基础知识
这里所说的JavaBeans只是一般的Java类别,跟EJB(EnterpriseJavaBeans)是两种不同的东西,请勿混淆了。
那么,servlet也是Java类别,它跟JavaBeans又有什么不同呢?
JavaBeans只是普通的类别
Servlet的Java类别是继承自javax.servlet.HttpServlet,因此具有接收HTTPrequest和送出HTTPresponse等网站应用程序的基本功能,而JavaBeans则只是单纯的类别,它可以继承自任何类别,但无法处理HTTP讯息,它在网站应用程序中的角色通常是作为参数对象(在JSP和servlet之间传递,以共享信息)或工具类别,作为参数对象时,通常代表种数据,因此被称为valuebean,作为工具类别时,则称为utilitybean。
怎样的类别可以称为JavaBeans?
只要你遵守JavaBeans规范中所建议的命名和设计惯例,而且你以bean的方式使用它,那么它就可以称为一个bean。
[1]
类别通常以"动词+Bean"的方式命名,例如:
UserInfoBean,CheckStockBean....等。
这是一种惯例,虽然没有强制非这样命名不可,但是它有好处:
清楚,别的程序设计师一眼就可以看出这是个bean。
JSP如何使用JavaBeans?
要让JSP能够使用你的bean,你的bean必须提供一组属性,JSP便可以透过特殊的标签来存取这个bean的属性。
所谓的属性,其实是一组getter和settermethods,两者统称为accessmethods(访问方法),透过这组访问方法来间接地存取类别的私有成员,当然,这组访问方法必须宣告为public。
例如,有个bean类别EmployeeBean,它要提供一个年龄的属性给外界(JSP)存取,此类别的定义如下:
publicclassEmployeeBean{
privateintage;
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
self.age=age;
}
}
在JSP里面使用时,是这么个写法:
useBeanid="emp"class="com.huanlin.EmployeeBean"scope="request"/> setPropertyname="emp"property="age"value="25"/> 员工的年龄是: getPropertyname="emp"property="age"/> 其中 ∙ useBean>卷标就是指明要使用一个bean对象,id代表该对象的名称,class指明了要使用什么类别的bean,scope则代表对象的生命周期。 ∙ setProperty>卷标用来设定bean的属性值,property指明了要设定哪个属性,value就是数值,要别注意的是,HTML窗体传入的数据一定是字符串,但我们的age属性却是整数,这个部分的转换会由Webcontainer帮我们处理掉。 ∙ getProperty>卷标是用来取得bean的属性值。 请特别注意两点: 1.属性的大小写。 在JSP里面,属性的名称是完全小写的"age",但是getter和settermethods的名称却是getAge()和setAge(),这种名称的转换对应规则是固定的,照这个规则来命名,Webcontainer就能够找到正确的访问方法。 2.对于OOP观念不熟的人来说,可能会误以为在JSP里面存取的"age"属性,就是类别定义里面的那个宣告为private成员(age),其实两者只有字面上相同而已,实际运作是可以毫无关联的,因为JSP完全是透过getter和setter方法来存取属性,况且外界本来就无法存取类别的私有成员。 基本知识介绍到此,接下来是实作,如果有未详尽之处,请自行参阅相关书籍。 2撰写JavaBean 我们把上次的教学文件的最后一个范例,也就是判断质数的JSP程序拿来修改,其中的isPrimeNumber函式很明显可以独立出来(以便重复使用),放到一个类别里面,我把这个类别命名为CheckPrimeBean。 程序代码如表1所示。 表1.PrimeValidator.java //檔名: CheckPrimeBean.java //编译: javac-d..\classesCheckPrimeBean.java //=============================================== packagecom.huanlin.util; publicclassCheckPrimeBean{ privateintnumber; publicStringgetNumber(){ returnInteger.toString(number);//整数转成字符串 } publicvoidsetNumber(Strings){ try{ number=Integer.parseInt(s);//字符串转成整数 } catch(NumberFormatExceptione){ number=-1; } } publicbooleanisValidNumber(){//检查输入的数字是否合法 if((number<2)||(number>10000)) returnfalse; returntrue; } publicbooleanisPrimeNumber(){//判断是否为质数 for(inti=2;i<=number/2;i++){ if(number%2==0) returnfalse; } returntrue; } } 几点说明: 1.这里使用了具名的套件(namedpackage),套件名称是com.huanlin.util,表示你将来布署的.class档案也要有相同的路径结构,也就是编译出来的档案及路径名称会是"com\huanlin\util\CheckPrimeBean.class"。 在编译这个档案时,编译程序会根据你的package名称帮你自动建立好对应的目录。 ( 2.在安排档案目录的结构时,我把原始码和编译过的类别文件分开目录存储,档案目录结构像是这个样子: sources\CheckPrimeBean.java classes\com\huanlin\util\CheckPrimeBean.class 也就是这个范例的目录下会有两个目录: sources和classes,分别存放原始码和编译过的档案。 因为这个缘故,在编译时必须特别指定输出的档案目录,这部分请参考表1的第2行批注。 3.这个类别的使用方式,是先设定number这个属性,然后呼叫isValidNumber()检查输入的数字是否为有效的整数,最后才由isPrimeNumber()判断是否为质数。 关于package 你也许会发现,即使不写package那行,程序也可以通过编译,但由于这个bean是要用在JSP里面的,如果你不为 package命名的话,在JSP里面使用这个bean时,Webcontainer会找不到这个bean。 请到相关书籍中找寻package的相关说明。 3在JSP中使用JavaBeans 原本在JSP里面的一些Java程序代码被抽离成独立的CheckPrimeBean类别之后,程序代码就清爽些了,修改后的JSP檔名取做 CalcPrime2.jsp,参考表2。 表2.CalcPrime2.jsp <%--检查某个数字是否为质数的JSP程序--%> <%@pagelanguage="java"contentType="text/html;charset=big5"%> <% request.setCharacterEncoding("big5"); Stringnum=request.getParameter("number");//取得HTTPrequest的参数 %> useBeanid="checker"class="com.huanlin.util.CheckPrimeBean"scope="request"/> setPropertyname="checker"property="number"value="<%=num%>"/> <%if(! checker.isValidNumber()){%> <%response.setHeader("Refresh","5;URL=prime2.htm");%> 请输入2~10000之间的整数。 五秒后将自动回到prime2.htm。 <%return;}%><%--显示错误讯息后结束,亦即后续的指令不会被处理--%> <%if(checker.isPrimeNumber()){%> <%=num%>是质数 <%}else{%> <%=num%>不是质数 <%}%> 关于在JSP使用bean的方法,之前都有提过了,只有一点值得特别说明,就是 setProperty>这行的value属性(attribute),请注意它使用了<%=..%>卷标来将一个变量的值传入value属性。 其实它还可以这样写: setPropertyname="checker"property="number"param="number"/> 也就是不明白指定value,而改用param这个属性,让Webcontainer在处理JSP指令时自动帮我们带入"number"这个HTML窗体传入的参数。 由于我们的HTML窗体的参数名称和bean的属性名称都叫做"number",JSP也允许我们将 param省略不写,像这样: setPropertyname="checker"property="number"/> 这样就更简洁了。 如果你觉得这样写语意不明,或者考虑到某些程序设计师不知道有这种写法,那就还是把param写上去好了。 4布署与执行 1.把sources目录下的prime2.htm和CalcPrime.jsp复制到Tomcat的webapps\myapp\目录下。 2.把classes目录整个复制到Tomcat的webapps\myapp\WEB-INF\目录下。 3.在浏览器的网址列输入"http: //127.0.0.1: 8080/myapp/prime2.htm"。 范例: Servlet呼叫JSP Servlet要呼叫(说得精确一点应该是: 分派JSP页面)JSP,跟在JSP中使用JavaBeans比起来要简单多了,主要只是网页转送的技巧而已,此技巧在设计图2的架构时会用得着。 1撰写servlet Servlet程序代码列于表3。 表3.HelloWorldServlet.jsp importjava.io.*; importjavax.servlet.*; importjavax.servlet.http.*; publicclassHelloWorldServletextendsHttpServlet{ publicvoidservice(HttpServletRequestrequest, HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=big5"); request.setCharacterEncoding("big5"); StringtheMessage="Hello,World! "; StringtargetURL="/HelloFromServlet.jsp"; request.setAttribute("message",theMessage); RequestDispatcherrd; rd=getServletContext().getRequestDispatcher(targetURL); rd.forward(request,response); } } 程序代码有几个地方值得特别注意: 1.之前的servlet范例程序都是用doGet来处理客户端的HTTPrequest,这里则改用service。 2.request.setAttribute()。 3.RequestDisatcher类别。 4.getServletContext()。 5.ServletContext类别的getRequestDispatcher()方法。 6.RequestDispatcher类别的forward()方法。 请试着从你手边的书籍或网络资源中寻找相关的说明,以了解程序运作的原理。 2撰写JSP 表3.HelloFromServlet.jsp <%@pagelanguage="java"contentType="text/html;charset=big5"%> <%Stringmsg=(String)request.getAttribute("message");%> 从servlet传来的讯息: <%=msg%> 之前的servlet程序中有用到request.setAttribute(),这里则使用了request.getAttribute(),从这里可以看得出来,servlet和JSP之间是透过request对象来储存及传递给对方的参数。 程序的运作过程如下: 1.客户端送出HTTPrequest,请求的网址为"http: //127.0.0.1: 8080/myapp/HelloWorldServlet"。 2.HelloWorldServlet收到请求之后,透过request.setAttribute()把要传递给JSP的参数字符串"Hello,World! "储存在request对象里。 3.HelloWorldServlet透过ServletContext建立RequestDispatcher对象,并指定欲分派的网址。 4.HelloWorldServlet呼叫 RequestDispatcher的forward()方法,把这次的HTTPrequest转送至另一个网页,也就是HelloFromServlet.jsp。 5.JSP先透过request.getAttribute()取得request对象中的属性值,该属性值是在步骤2中,由servlet指定的。 最后再该属性值搭配HTML卷标显示出来。 我把整个过程画成一个UML循序图(图3),你可以搭配上面的文字描述来了解程序的运作过程。 图3.Servlet分派JSP网页的过程(sequencediagram) 3布署与执行 1.在Tomcat的webapps目录下建立目录结构: myapp\WEB-INF\classes\。 请注意大小写是有区别的。 2.将HelloFromServlet.jsp复制到myapp目录下。 3.编译HelloWorldServlet.java,并将编译后产生的HelloWorldServlet.class复制到myapp\WEB-INF\classes\目录下。 4.编辑myapp\WEB-INF\web.xml档案,内容如下: 表4.web.xml xmlversion="1.0"encoding="ISO-8859-1"? > DOCTYPEweb-app PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN" " HelloWorldServlet HelloWorldServlet 5.开启浏览器,在网址列输入URL"http: //127.0.0.1: 8080/myapp/HelloWorldServlet"。 范例: Servlet、JavaBeans、与JSP的组合 此范例跟3.0的范例其实很像,都是由Servlet传递参数给JSP,再由JSP取出参数并显示出来,只是3.0的范例的参数是字符串,而这里要示范的是以JavaBeans对象当作参数来传递共享信息。 程序的目录结构如图4所示: 图4.目录结构 编译后的Javaclass档案都输出至classes目录下,而由于HelloServlet2.java需要参考UserInfoBean.java,所以在编译时要必须使用-class参数,否则会找不到类别,为了方便起见,我们用一个批处理文件Make.bat帮我们编译所有的Java类别。 1撰写JavaBean 我们打算用一个UserInfoBean类别来储存一个用户的相关信息,并且在servlet和JSP之间传递这个对象,以达到沟通和信息共享的目的。 为了示范方便,这个类别只提供了一个属性: userName,程序代码列在表5。 表5.UserInfoBean.java //檔名: UserInfoBean.java //编译: javac-d..\classesUserInfoBean.java packagecom.huanlin; publicclassUserInfoBean{ privateStringuserName; publicvoidsetUserName(StringuserName){ this.userName=userName; } publicStringgetUserName(){ returnthis.userName; } } 2撰写Servlet 表6.HelloServlet2.jsp //档案: HelloServlet2.java //编译: 参考Make.bat importjava.io.*; importjavax.servlet.*; importjavax.servlet.http.*; importcom.huanlin.UserInfoBean; publicclassHelloServlet2extendsHttpServlet{ publicvoidservice(HttpServletRequestrequest, HttpServletResponseresponse) throwsServletException,IOException{ //下面两行让中文字能正确显示 response.setContentType("text/html;charset=big5"); request.setCharacterEncoding("big5"); //建立userInfo对象,并指定一个session的attribute与之系结 UserInfoBeanuserInfo=newUserInfoBean(); userInfo.setUserName("令狐冲"); HttpSessionsession=request.getSession(); session.setAttribute("userInfo",userInfo); //前往指定的网页 RequestDispatcherrd; rd=getServletContext().getRequestDispatcher("/HelloFromServlet2.jsp"); rd.forward(request,response); } } session.setAttribute()会将UserInfoBean对象的参考存入sess
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验4 JavaBean和Servlet 实验 JavaBean Servlet