Java Web应用开发 课件 第6章 Servlet 技术_第1页
Java Web应用开发 课件 第6章 Servlet 技术_第2页
Java Web应用开发 课件 第6章 Servlet 技术_第3页
Java Web应用开发 课件 第6章 Servlet 技术_第4页
Java Web应用开发 课件 第6章 Servlet 技术_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章Servlet技术0206知识目标

了解Servlet的基本概念

了解Servlet的工作原理熟悉Servlet的优点和生命周期掌握Servlet程序的编写和部署实现Servlet的综合案例思政目标脚踏实地地做好每一步,全力以赴地做好每件事,发扬工匠精神,养成严谨的科学作风。从全局观的角度看待问题,在对待事物时,既应避免深陷一点、一叶障目,也不应该徒观大局,忽略细节。在整体利益与局部利益发生冲突时,应优先考虑整体利益。古语有云“信人者,人恒信之。”这体现了朋友之间信任的重要性,想要处理好朋友之间的关系,首先要去相信朋友,真正做到以“诚”为本才是和朋友相处的根本。6.1Servlet介绍随着Web应用业务的逐渐增多,动态Web的开发也显得越来越重要。目前,企业提供的比较常见的有ASP、PHP、JSP和Servlet等的相关技术。SUN公司提供了Servlet和JSP两种技术,用于Java的动态资源开发。6.1.1Servlet的概念Servlet(ServerApplet)是JavaServlet的简称,JavaServlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。Servlet称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,可以灵活地加载和卸下Servlet模块。Servlet主要功能在于交互式地浏览和生成数据,可以响应任何类型的请求,但大部分情况下Servlet应用于响应HTTP请求,动态生成web页面。6.1.1Servlet的概念面对一个或一组URL地址的访问请求,一个Servlet程序都能负责处理和它所对应的请求,并且产生响应内容。一个Servlet程序的基本功能如下。(1)获取客户端通过HTML的FORM表单传递的数据和链接地址URL后面的参数信息。(2)创建对客户端的响应消息内容。(3)访问服务器端的文件系统。(4)连接数据库并开发基于数据库的应用。(5)调用其他的Java类。6.1.1Servlet的概念相较于普通的Java程序,Servlet只是输入信息的来源与输出结果的目标不一致。因此,普通Java程序能实现的大多数任务需求,Server程序也都能去实现。6.1.2工作原理Servlet运行需要特定的容器,即Servlet运行时所需要的运行环境。本项目采用Tomcat作为Servlet的容器,由Tomcat为Servlet提供基本的运行环境。当Web服务器接收到一个HTTP请求时,会将请求交给Servlet容器,Servlet容器首先对所请求的URL进行解析,并根据web.xml配置文件找到相应的处理Servlet,同时将request、response对象传递给Servlet。Servlet通过request对象获取客户端请求者、请求信息以及其他信息等。6.1.2工作原理Servlet处理完请求后,会把所有需要返回的信息放入response对象中并返回客户端,Servlet容器就会刷新response对象,并将控制权重新交给Web服务器。如图6-1所示为Servlet的工作原理示意图。图6-1Servlet的工作原理示意图6.1.2工作原理当Servlet容器收到请求时,Servlet引擎就会判断这个Servlet是否为第一次访问,如果是第一次访问,Servlet引擎调用init()方法初始化这个Servlet。每个Servlet只被初始化一次,后续的请求只是新建一个线程,再调用Servlet中service()方法。当多个用户请求同时访问一个Servlet时,由Servlet容器负责为每个用户启动一个线程,这些线程的启动和销毁都由Servlet容器负责。6.1.3Servlet的优点Servlet具备Java跨平台的优点,不受软硬件环境的限制,其具体优点如下:1.可移植性好Servlet是使用Java语言来编写的,因此,它延续了Java在跨平台上的表现,可以在不同的操作系统平台和不同应用服务器平台下移植。几乎所有的主流服务器都直接或间接支持Servlet。

2.高效在传统的CGI中,客户机向服务器发出的每个请求都要生成一个新的进程。在Servlet中,每个请求将生成一个新的线程,而不是一个完整的进程。Servlet被调用时,它被载人驻留在内存中,直到更改Servlet,它才会被再次加载。3.功能强大Servlet可以使用JavaAPI核心的所有功能,这些功能包括Web和URL访问、图像处用、数据压缩、多线程JDBCRMI、序列化对象等。6.1.3Servlet的优点4、方便Servlet提供了大量的实用工用工具例程,例如,自动地解析和解码HTML表单数据、速取和设置HTTP头、处理Cookie、跟踪会话状态等。5.可重用性Servlet提供重用机制,可以给应用建立组件或用面向对象的方法封装共享功能。6.模块化JSP、Servlet、JavaBean都提供把程序模块化的途径,把整个应用划分为许多离散的模块,各模块负责一项具体的任务,使程序便于理解。每一个Servlet可以执行一个特定的任务,Servlet之间可以相互交流。6.1.3Servlet的优点7.节省投资不仅有许多廉价甚至免费的Web服务器可供个人或小规模网站使用,而且对于现有的服务器。如果它不支持Servlet,想要加上这部分功能也往往是免费的或只需要极少的投资。8.安全性Servlet可以充分利用Java的安全机制、并且可以实现类型的安全性。在Java的异常处理机制下,Servlet能够安全地处理各种错误,不会因为程序上的逻辑错误而导致整体服务器系统的毁灭。6.1.4生命周期Servlet是一种服务器端程序,它的运行环境需要Servlet容器来支持。Servlet的生命周期始于Web服务开始运行时,之后不断地处理来自浏览器的请求,然后通过Web服务器将响应结果返回给客户端,直到Web服务器停止运行,Servlet才会被终止。一个Servlet的完整生命周期一般包含加载、初始化、运行和销毁4个阶段。以下是Servlet遵循的过程。图6-2所示揭示了Servlet的生命周期。6.1.4生命周期图6-2Servlet生命周期6.1.5MVC架构模式Java的跨平台、安全性、高效性、可扩展性和易学性,导致它应用广泛。目前,软件工程中的一种比较常见的软件架构模式为MVC模式(Model-View-Controller)。MVC把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。视图层:指用户界面,用于与系统进行交互,其主要负责从用户那里获取数据和向用户展示数据。模型层:负责接收视图层请求的数据,并返回最终的处理结果,其主要完成业务逻辑处理和有关数据库的操作。控制层:接收来自视图层的请求,交给模型层处理,将处理好的结果返回给视图层。控制层:本身不涉及数据数据处理和业务逻辑处理,只是将模型层和视图层进行匹配,负责控制数据的流向。MVC架构模式的关系如图6-3所示。6.1.5MVC架构模式图6-3MVC架构模式6.2Servlet的开发JavaWeb开发一般Servlet负责数据流向的控制,并通过HttpServletResponse对象对请求做出响应。创建的Servlet必须继承HttpServlet类,并实现doGet0方法和doPost()方法。运行一个Servlet程序,Servlet源文件先会编译为字节码文件,然后将字节码文件保存到相应的Web目录中,最后设置Servlet的调用路径,即配置web.xml.文件能生效。6.2Servlet的开发【例6.1】创建继承HttpServlet类的Servlet并配置Servlet。创建和配置Servlet的具体操作步骤如下。步骤1:在MyEclipse中选择并展开ServletWeb项目,右击src文件夹,在弹出的快捷菜单中选择New-Servlet菜单命令,如图6-4所示。6.2Servlet的开发图6-4新建Servlet命令6.2Servlet的开发步骤2:打开CreateServlet窗口,在Javapackage文本框中输入包名“servlet",在Name文本框中输入Servlet名“FirstServlet",Superclass默认为“javax.servlet.HttpServlet",如图6-5所示。图6-5CreateServlet窗口6.2Servlet的开发步骤3:单击Finish按钮,如图6-6所示。Servlet创建完成,并自动生成web.xml配置文件。图6-6自动生成web.xml配置文件6.2Servlet的开发步骤4:修改FirstServlet.java中的代码,具体代码见书。使用Servlet容器默认的方式对Servlet进行初始化和销毁,因此没有勾选init()方法和destroy()方法,只包含了处理具体功能的doGet()方法和doPost()方法。这两个方法用来处理以GET或POST方式提交的请求。在doPost()方法中直接调用doGet()方法,而在doGet()方法中实现打印一个简单的HTML页面的功能。6.2Servlet的开发步骤5:配置Servlet信息的web.xml文件web.xml文件在<servlet>和<servlet-mapping>标签中配置Servlet的信息。<servlet>节点中的<servlet-name>指定Servlet的名称,与<servletmapping>节点中<servlet-name>的名称保持一致。<servlet-class>指定Servlet类的路径,有包的需要写上包名,否则Servlet引擎找不到对应的Servlet类。在<servlet-mapping>节点中<url-pattern>元素声明访问Servlet的URL映射。6.2Servlet的开发步骤6:将ServletWeb项目部署到Tomceat,启动Tomcat。在浏览器的地址栏中输入地址“http://localhost:8080/ServletWeb/FirstServlet",运行结果如图6-7所示。

图6-7运行Servlet程序6.3使用Servlet获取信息Servlet与HTTP联系密切,Servlet几乎可以处理HTTP各个方面的内容。下面主要介绍如何使用Servlet获取HTTP的信息。6.3.1获取HTTP头部信息使用Servlet获取HTTP的头部信息,这些信息一般包含在HTTP请求中。当用户访问一个页面时,会提交一个HTTP请求给服务器的Servlet引擎。【例6.2】在ServletWeb项目中创建并使用Servlet获取HTTP头部信息的类。创建Servlet(ServletHeader.java),代码如下:importjava.io.PrintWriter;importjava.util.*;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;6.3.1获取HTTP头部信息public

class

ServletHeader

extendsHttpServlet{

public

voiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException{ response.setContentType("text/html"); PrintWriterout=response.getWriter(); Enumerationenumer=request.getHeaderNames();

while(enumer.hasMoreElements()){//循环输出 Stringname=(String)enumer.nextElement(); Stringvalue=request.getHeader(name); out.println(name+"="+value+"<br>"); } }}6.3.1获取HTTP头部信息在上述代码中,创建获取HTTP头部信息的Servlet类,在该类中通过request对象的getHeaderNames()方法获取包含信息名称的枚举类型。在while循环中,通过枚举类提供的hasMoreElements(方法进行循环,并通过枚举类提供的nextElement(方法获取元素的名称,通过request对象的getHeaderO方法根据元素的名称获得其值。最后将名称和值打印输出。6.3.1获取HTTP头部信息<servlet><description>ThisisthedescriptionofmyJ2EEcomponent</description><display-name>ThisisthedisplaynameofmyJ2EEcomponent</display-name><servlet-name>ServletHeader</servlet-name><servlet-class>servlet.ServletHeader</servlet-class></servlet><servlet-mapping><servlet-name>ServletHeader</servlet-name><url-pattern>/servlet/ServletHeader</url-pattern></servlet-mapping>6.3.1获取HTTP头部信息上述代码出现在web.xml中的<web-app>和</web-app>之间。<servlet-name>标签之间定义的是Servlet的名称,<servlet-class>标签之

间是Servlet类的包名和类名,<url-pattern>

之间是Servlet的访问路径。启动Tomcat服务器。在浏览器的地址栏中输入Servlet的地址“http://localhost:8080/ServletWeb/servlet/ServletHeader",运行结果如图6-8所示。6.3.1获取HTTP头部信息图6-8获取HTTP头部信息6.3.2获取请求对象信息

通过Servlet不仅可能够获取HTTP的头部信息,还可以获取发出请求的对象自身的信息,比如用户提交请求使用的协议或用户提交表单的方法等。【例6.3】在ServletWeb项目中创建并使用Servlet获取发出请求对象自身的类。创建获取发出请求对象信息的Servlet(SelfInfo.java)。packageservlet;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassSelfInfoextendsHttpServlet{6.3.2获取请求对象信息

public

voiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException{ response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); PrintWriterout=response.getWriter(); out.println("<HTML>"); out.println("<HEAD><TITLE>请求自身对象信息</TITLE></HEAD>"); out.println("<BODY>"); out.print("用Servlet获取发出请求对象信息<br>"); out.println("表单提交method的方式:"+request.getMethod()+"<br>"); out.println("使用协议:"+request.getProtocol()+"<br>"); out.println("Remote主机:"+request.getRemoteAddr()+"<br>"); out.println("Servlet地址:"+request.getRequestURI()+"<br>"); out.println("</BODY>"); out.println("</HTML>"); }}6.3.2获取请求对象信息

在上述代码中,创建继承HttpServlet的SelfInfo类,在类的doGet()方法中获取发出请求对象的信息,即表单的提交方式、使用的协议、Remote

主机的地址以及Servlet的地址。web.xml中新增如下代码。<servlet><description>ThisisthedescriptionofmyJ2EEcomponent</description><display-name>ThisisthedisplaynameofmyJ2EEcomponent</display-name><servlet-name>SelfInfo</servlet-name><servlet-class>servlet.SelfInfo</servlet-class></servlet><servlet-mapping><servlet-name>SelfInfo</servlet-name><url-pattern>/servlet/SelfInfo</url-pattern></servlet-mapping>6.3.2获取请求对象信息上述代码在web.xml的<web-app>和</web-app>之间。<servlet

name>是Servlet

的名称,<servlet-class>

是Servlet

类的包名和类名,<url-pattern>

是Servlet

的访问路径。启动Tomcat服务器,在浏览器的地址栏中输入获取请求对象信息的地址“http://localhost:8080/ServletWeb/servlet/SelfInfo“,运行结果如图6-9所示。6.3.2获取请求对象信息图6-9获取请求对象信息6.3.3获取参数信息使用Servlet还可以获取用户提交的参数信息,这些参数可以是表单以POST或GET方式提交的数据,也可以是直接通过超链接传递的参数。【例6-4】在ServletWeb项目中使用Servlet获取用户提交的参数信息。创建用户输入信息的表单页面。6.3.3获取参数信息<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%><%Stringpath=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head>

<title>提交表单参数</title></head>6.3.3获取参数信息

<body><formaction="BodyForm"method="post"> <table> <tr> <td>身高</td> <td><inputtype="text"name="height"></td> </tr> <tr> <td>体重</td> <td><inputtype="text"name="weight"></td> </tr> <tr> <td>年龄</td> <td><inputtype="text"name="age"></td> </tr> <tr> <tdcolspan="2">

<inputtype="submit"name="提交"></td> </tr> </table></form></body></html>6.3.3获取参数信息在上述代码中,通过table表格创建用户输入信息:有身高、体重和年龄三个参数。在该页面通过form表单将用户输入的三个参数提交给BodyForm处理,来显示这些信息。6.3.3获取参数信息创建获取用户输入信息的Servlet(BodyForm.java)packageservlet;importjava.io.*;importjava.util.*;importjavax.servlet.*;importjavax.servlet.http.*;publicclassBodyFormextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); PrintWriterout=response.getWriter(); out.println("from表单提交的参数如下:<br>"); out.println("身高:"+request.getParameter("height")+"<br>"); out.println("体重:"+request.getParameter("weight")+"<br>"); out.println("年龄:"+request.getParameter("age")+"<br>"); }6.3.3获取参数信息publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ request.setCharacterEncoding("utf-8"); doGet(request,response); }}在上述代码中,创建继承HttpServlet的类BodyForm类,在该类的doGet()和都Post()方法中设置相应编码是UTF-8,由request对象的getParameter()方法获取height、weight和age这三个参数,并通过PrintWriter类的对象out输出参数的信息。6.3.3获取参数信息在web.xml中添加了如下代码<servlet><description>ThisisthedescriptionofmyJ2EEcomponent</description><display-name>ThisisthedisplaynameofmyJ2EEcomponent</display-name><servlet-name>BodyForm</servlet-name><servlet-class>servlet.BodyForm</servlet-class></servlet><servlet-mapping><servlet-name>BodyForm</servlet-name><url-pattern>/BodyForm</url-pattern></servlet-mapping>6.3.3获取参数信息上述代码新增在web.xml的<web-app>和</web-app>之间。<servlet-name>指定Servlet的名称,<servlet-class>定义Servlet类的包名和类名,<url-pattern>指定Servlet的访问路径。启动Tomcat服务器,在浏览器的地址栏中输入用户输入信息的页面的地址“http://localhost:8080/ServletWeb/body.jsp”,运行结果如图6-10所示。图6-10用户输入表单页面6.3.3获取参数信息输入信息后单击“提交”按钮,跳转到“http://localhost:8080/ServletWeb/BodyForm”页面,运行结果如6-11所示。图6-11提交信息的显示6.4调用Servlet的方法在前面讲述的Servlet

中,都是以在浏览器的地址栏中输入具体的Servlet地址的形式访问页面。实际应用中,一般很少在浏览器中输入Servlet的地址进行访问,通常是通过调用Servlet的方式进行访问JSP页面。本节主要介绍在JSP应用中调用Servlet的两种方式,一种是表单提交调用Servlet,另外一种是通过超链接调用Servlet。6.4.1表单形式调用Servlet以表单的形式调用Servlet,采用将Servlet的地址写入表单的action属性的方法,当表单提交之后会调用Servlet,然后就处理表单提交的数据。【例6-5】使用表单提交的方式调用Servlet。创建Student类(Student.java)packagebean;publicclassStudent{ privateStringname; privateStringsex; privateString[]interest; publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ =name; } publicStringgetSex(){ returnsex; }6.4.1表单形式调用ServletpublicvoidsetSex(Stringsex){ this.sex=sex; } publicString[]getInterest(){ returninterest; } publicvoidsetInterest(String[]interest){ erest=interest; } publicStringshowSex(Strings){ if(s.equals("man")){ return"男"; }else{ return"女"; } } publicStringshowInterest(String[]ins){ Stringstr=""; for(inti=0;i<ins.length;i++){ str+=ins[i]+""; } returnstr; } }6.4.1表单形式调用Servlet在上述代码中定义一个用户类,在类中定义私有成员变量name、sex和interest,并定义它们的setXXX()方法和getXXX()方法。在类中定义了显示性别的showSex()方法和将兴趣数组转换为字符串的showInterest()方法。6.4.1表单形式调用Servlet创建填写信息页面(student.jsp)。<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%><%Stringpath=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><title>学生个人信息表</title></head><body><h1>学生个人信息表</h1> <formaction="servlet/StudentServlet"method="post"> <table> <tr> <td>姓名:</td> <td><inputtype="text"name="name"/></td>6.4.1表单形式调用Servlet</tr> <tr> <td>性别:</td> <td><inputtype="radio"name="sex"checked="checked"value="man"/>男 <inputtype="radio"name="sex"value="women"/>女 </td> </tr> <tr> <td>爱好:</td> <td><inputtype="checkbox"name="interest"value="篮球"/>篮球 <inputtype="checkbox"name="interest"value="足球"/>足球 <inputtype="checkbox"name="interest"value="游泳"/>游泳 <inputtype="checkbox"name="interest"value="唱歌"/>唱歌 <inputtype="checkbox"name="interest"value="跳舞"/>跳舞 </td> </tr> <tr> <tdcolspan="2"><inputtype="submit"value="提交"/></td> </tr> </table> </form></body></html>6.4.1表单形式调用Servlet在上述代码中,创建用户输入姓名、选择性别和兴趣的页面,并通过表单form处理提交后创建StudentServlet处理表单提交的信息。packageservlet;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importbean.Student;publicclassStudentServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{response.setContentType("text/html"); response.setCharacterEncoding("utf-8");//设置编码,否则汉字显示乱码

Stringname=request.getParameter("name");//获取姓名

Stringsex=request.getParameter("sex");//获取性别6.4.1表单形式调用Servlet

String[]interest=request.getParameterValues("interest");//获取兴趣数组 Studentstudent=newStudent(); student.setName(name); student.setSex(sex); student.setInterest(interest); PrintWriterout=response.getWriter(); out.println("<HTML>"); out.println("<HEAD><TITLE>AServlet</TITLE></HEAD>"); out.println("<BODY>"); out.print("学生个人信息调查表:<br>"); out.println("姓名:"+student.getName()+"<br>"); out.println("性别:"+student.showSex(student.getSex())+"<br>"); out.println("兴趣:"+student.showInterest(student.getInterest())+"<br>"); out.println("</BODY>"); out.println("</HTML>"); out.flush(); out.close(); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ request.setCharacterEncoding("utf-8");doGet(request,response); }}6.4.1表单形式调用Servlet在上述代码中,创建继承HttpServlet的类StudentServlet,在该类中定义doGet()方法,在该方法中获取用户输入的姓名、性别和兴趣,创建User类的对象user。调用showSex()方法并将返回值赋给user的私有成员变量sex;调用showInterest()方法将获取的兴趣数组转换为字符串,然后赋值给user的私有成员变量interest。使用PrintWriter类的对象out将用户的信息在JSP页面中打印出来。6.4.1表单形式调用Servlet在web.xml文件中添加如下代码。<servlet><description>ThisisthedescriptionofmyJ2EEcomponent</description><display-name>ThisisthedisplaynameofmyJ2EEcomponent</display-name><servlet-name>StudentServlet</servlet-name><servlet-class>servlet.StudentServlet</servlet-class></servlet><servlet-mapping><servlet-name>StudentServlet</servlet-name><url-pattern>/servlet/StudentServlet</url-pattern></servlet-mapping>在上述代码中添加Servlet的配置信息:一对<servlet>和<servlet-mapping>,即设置StudentServlet的名称(StudentServlet)和类的路径(servlet.StudentServlet)以及Servlet的访问路径(/servlet/StudentServlet)。6.4.1表单形式调用Servlet在web.xml文件中添加如下代码。<servlet><description>ThisisthedescriptionofmyJ2EEcomponent</description><display-name>ThisisthedisplaynameofmyJ2EEcomponent</display-name><servlet-name>StudentServlet</servlet-name><servlet-class>servlet.StudentServlet</servlet-class></servlet><servlet-mapping><servlet-name>StudentServlet</servlet-name><url-pattern>/servlet/StudentServlet</url-pattern></servlet-mapping>在上述代码中添加Servlet的配置信息:一对<servlet>和<servlet-mapping>,即设置StudentServlet的名称(StudentServlet)和类的路径(servlet.StudentServlet)以及Servlet的访问路径(/servlet/StudentServlet)。6.4.1表单形式调用Servlet运行Tomcat,在浏览器中输“http://localhost:8080/ServletWeb/student.jsp”,运行结果如图6-12所示,输入信息后单击“提交”按钮,运行结果如图6-13所示。图6-12学生个人信息表图6-13Servlet处理6.4.1表单形式调用Servlet运行Tomcat,在浏览器中输“http://localhost:8080/ServletWeb/student.jsp”,运行结果如图6-12所示,输入信息后单击“提交”按钮,运行结果如图6-13所示。图6-12学生个人信息表图6-13Servlet处理6.4.2超链接形式调用Servlet当有用户输入的内容提交给服务器时,一般使用表单提交调用Servlet。对于没有用户输入数据的情况,一般通过超链接的方式来调用Servlet,这种情况还可以传递参数给Servlet。【例6-6】在项目中创建使用超链接调用Servlet并传递一个参数的页面。<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%><%Stringpath=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><title>超链接</title></head><body><ahref="servlet/HLinkServlet?param=link">使用超链接调用Servlet</a></body></html>6.4.2超链接形式调用Servlet在上述代码中,通过在JSP页面中使用超链接调用Servlet,并在调用Servlet的过程中传递参数param到Servlet中。创建继承HttpServlet类的HLinkServlet(HLinkServlet.java)。packageservlet;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;6.4.2超链接形式调用Servletpublic

class

HLinkServlet

extendsHttpServlet{

public

voiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException{ response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); //获取参数param Stringp=request.getParameter("param"); PrintWriterout=response.getWriter(); out.println("<HTML>"); out.println("<HEAD><TITLE>AServlet</TITLE></HEAD>"); out.println("<BODY>"); out.print("超链接获得的数据:<br>"); out.print("param参数:"+p+"<br>"); out.println("</BODY>"); out.println("</HTML>"); out.flush(); out.close(); }

public

voiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException{ request.setCharacterEncoding("utf-8"); doGet(request,response); }}6.4.2超链接形式调用Servlet在上述代码中,通过request对象的getParameter()方法获取参数param的值,并通过PintWriter类的对象out将参数信息打印到页面上。在web.xml文件中添加如下代码。<servlet><description>ThisisthedescriptionofmyJ2EEcomponent</description><display-name>ThisisthedisplaynameofmyJ2EEcomponent</display-name><servlet-name>HLinkServlet</servlet-name><servlet-class>servlet.HLinkServlet</servlet-class></servlet><servlet-mapping><servlet-name>HLinkServlet</servlet-name><url-pattern>/servlet/HLinkServlet</url-pattern></servlet-mapping>6.4.2超链接形式调用Servlet在上述代码中,通过request对象的getParameter()方法获取参数param的值,并通过PintWriter类的对象out将参数信息打印到页面上。在web.xml文件中添加如下代码。<servlet><description>ThisisthedescriptionofmyJ2EEcomponent</description><display-name>ThisisthedisplaynameofmyJ2EEcomponent</display-name><servlet-name>HLinkServlet</servlet-name><servlet-class>servlet.HLinkServlet</servlet-class></servlet><servlet-mapping><servlet-name>HLinkServlet</servlet-name><url-pattern>/servlet/HLinkServlet</url-pattern></servlet-mapping>6.4.2超链接形式调用Servlet在上述代码中配置Servlet的信息。在web.xml页面中添加一对<servlet>和<servlet-mapping,即设置HLinkedServlet的名称(HLinkServlet)和类的路径(servlet.HLinkServlet)以及Servlet的访问路径(/servlet/HLinkServlet)。启动Tomcat服务器,在浏览器的编辑地址栏中输入“http://localhost:8080/ServletWeb/hyperlink.jsp”,运行结果如图6-14所示。图6-14Servlet显示信息图6-15Servlet显示信息6.5实战练习应用实例:网上留言板。本例通过一个留言板模块来了解Servlet的使用。Servlet主要用于MVC模式中控制器部分。本例的Servlet处理数据并有一定的控制功能。处理留言板开发流程如图6-16所示。图6-16留言板开发流程6.5实战练习项目的目录结构如图6-17所示。图6-17项目的目录结构6.5实战练习(1)创建填写留言的界面(index.jsp),如图6-18所示。单击留言界面的“提交”按钮,使用servlet(AddMessageServlet)接收请求。执行效果图如图6-19所示,程序源码如下:<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%><%Stringpath=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><basehref="<%=basePath%>"><title>MyJSP'index.jsp'startingpage</title>

</head><body><formaction="AddMessageServlet"method="post">

留言者:<inputtype="text"name="author"size="20"><br>

留言标题:<inputtype="text"name="title"size="20"><br>

留言内容:<textareaname="content"rows="8"cols="20"></textarea><p>6.5实战练习<inputtype="submit"value="提交"><inputtype="reset"value="重置"><ahref="showMessage.jsp">查看留言</a></form></body></html>图6-18留言输入页面6.5实战练习在留言板,输入王淑丽同学的留言的信息,点击“提交按钮”,显示的是留言者、留言时间、留言标题和留言内容的信息。执行完提交按钮的运行结果如图6-19所示。图6-19留言显示页面6.5实战练习(2)创建接收请求保存留言的Servlet类。该servlet(AddMessageServlet.java)作为控制器,接收浏览器发送的所有请求,提交的信息和查看留言响应到showMessage.jsp页面显示。留言板信息处理Servlet文件(AddMessageServlet.java)代码如下所示。packageservlet;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.Date;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importbean.MessageBean;6.5实战练习publicclassAddMessageServletextendsHttpServlet{ publicvoiddestroy(){ super.destroy();//Justputs"destroy"stringinlog //Putyourcodehere }

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ this.doPost(request,response); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html"); PrintWriterout=response.getWriter(); //中文编码处理

Stringauthor=newString(request.getParameter("author").getBytes("ISO-8859-1"),"UTF-8"); Stringtitle=newString(request.getParameter("title").getBytes("ISO-8859-1"),"UTF-8"); Stringcontent=newString(request.getParameter("content").getBytes("ISO-8859-1"),"UTF-8"); //获取当前时间并格式化时间为指定格式

SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); Stringtoday=format.format(newDate());6.5实战练习//JavaBean保存messageBoard.jsp文件提交的数据MessageBeanmm=newMessageBean();mm.setAuthor(author);mm.setTitle(title);mm.setContent(content);mm.setTime(today);//获取session对象,HttpSession相当于JSP中的sessionHttpSessionsession=request.getSession();//通过session对象获取应用上下文ServletContext,相当于JSP中的applicationServletContextscx=session.getServletContext();//获取存储在应用上下文中的集合对象(JSP的Application对象)ArrayListwordlist=(ArrayList)scx.getAttribute("wordlist");if(wordlist==null)wordlist=newArrayList();//将封装了信息的值JavaBean存储到集合对象中wordlist.add(mm);//将集合对象保存到应用上下文中scx.setAttribute("wordlist",wordlist);response.sendRedirect("showMessage.jsp");}publicvoidinit()throwsServletException{//Putyourcodehere}}6.5实战练习showMessage.jsp页面代码如下所示。<%@pageimport="bean.MessageBean"%><%@pageimport="java.util.ArrayList"%><%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%><%Stringpath=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><basehref="<%=basePath%>"><title>MyJSP'showMessage.jsp'startingpage</title></head>6.5实战练习<body><%ArrayListwordlist=(ArrayList)application.getAttribute("wordlist");if(wordlist==null||wordlist.size()==0) out.print("没有留言可显示!");else{ for(inti=wordlist.size()-1;i>=0;i--){ MessageBeanmm=(MessageBean)wordlist.get(i);%>

留言者:<%=mm.getAuthor()%> <p>留言时间:<%=mm.getTime()%></p> <p>留言标题:<%=mm.getTitle()%></p> <p>留言内容:<textarearows="8"cols="30"readonly> <%=mm.getContent()%></textarea></p> <ahref="index.jsp">我要留言</a><hrwidth="90%"><%} }%></body></html>6.5实战练习(3)创建表示留言数据的JavaBean类(MessageBean.java)。该类中定义的每个属性定义了get和set方法,其目的是为显示留言的JSP读取数据方便。保存数据的Bean(MessageBean.java)的代码如下所示。packagebean;publicclassMessageBean{ privateStringauthor;privateStringtitle;privateStringcontent;privateStringtime;publicMessageBean(){}publicStringgetAuthor(){returnauthor;}publicvoidsetAuthor(Stringauthor){this.author=author;}publicStringgetTitle(){returntitle;}6.5实战练习publicvoidsetTitle(Stringtitle){this.title=title;}publicStringgetContent(){returncontent;}publicvoidsetContent(Stringcontent){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论