第6章Servlet基础内容提要6.4Servlet中的重定向和请求转发6.3Servlet的生命周期6.2Servlet的创建和配置6.1Servlet简介6.5Servlet处理数据本章主要讲解在JavaWeb开发中经常使用的组件Servlet。Servlet是在服务器端执行的Java程序,用来处理客户端发送的请求,可以动态地生成结果并发送给客户端。讲解了Servlet的生命周期,Servlet的结构和方法,使用Servlet处理页面的转向,Servlet的创建和部署以及多层架构的软件开发模式等等。6.1Servlet简介Servlet是Java类,在服务器端运行,用于处理特定的HTTP请求,并可动态生成HTTP响应。虽然Servlet可以响应任何类型的请求,但是通常用于基于Web的应用程序。Servlet属于JavaEE中间层技术,主要完成业务逻辑处理。Servlet可以读取客户端发送的表单数据或请求报头信息,经过一系列的业务处理以后,可以生成动态的结果,发送显式的数据、状态代码以及响应报头给客户端。6.1.1Servlet的结构protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//设置Servlet的MIME响应类型为普通网页response.setContentType(text/html;charset=utf-8);//获取输出流PrintWriterout=response.getWriter();//在页面上输出内容out.print(html);out.print(body);out.print(WelcometoJavaWeb!);out.print(/body);out.print(/html);}protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doGet(request,response);}一般在浏览器里输入地址请求资源的方式是Get请求,也可以在表单里指定method的值为Get来实现。Get请求通过Servlet的doGet()方法响应;Post请求通过Servlet的doPost()方法响应。可根据请求的方式决定覆盖doGet()或doPost()方法。一般可以在doGet()方法中调用doPost()方法,或者在doPost()方法中调用doGet()方法,以保证Servlet可以响应两种形式的请求。6.1.2ServletAPIJava类要想成为Servlet必须继承HttpServlet类。ServletAPI2.2的类和接口组成javax.servlet和javax.servlet.http两个包。javax.servlet包提供了控制Servlet生命周期所必需的Servlet接口,是Servlet必须实现的接口。javax.servlet.http包提供了从Servlet接口派生的专门用于处理HTTP请求的抽象类和一般的工具类。doGet()和doPost()方法的参数都包括HttpServletRequest和HttpServletResponse。Web客户端发送给Web服务器的HTTP请求消息可以分为三个部分:请求行、请求消息头、消息正文。ServletAPI中定义了一个ServletRequest接口来作为获取客户端请求信息的接口。Servlet程序通过调用ServletRequest对象的方法可以获取客户端的请求信息以及报头信息等等。HttpServletRequest是专门用于HTTP协议的ServletRequest的子接口,客户端浏览器发出的请求被封装成一个HttpServletRequest对象,包括请求的地址、请求的参数、提交的数据等等。同样,ServletAPI中定义了ServletResponse接口用于创建响应消息,HttpServletResponse是专门用于HTTP协议的ServletResponse的子接口。6.2Servlet的创建和配置1.创建继承HttpServlet抽象类的子类;2.根据请求的类型覆盖HttpServlet的方法,如doGet()或者doPost()方法;3.使用HttpServletRequest对象来获取请求信息;4.使用HttpSerlvetResponse对象生成响应结果;程序6-1search.html页面包含一个调查表单,SearchServlet.java用来处理调查表单。search.html:htmlheadmetahttp-equiv=Content-Typecontent=text/html;charset=UTF-8title表单调查/title/headbodyformaction=ResearchServletmethod=post用户名:inputtype=textname=username/br密码:inputtype=passwordname=password/brinputtype=submitvalue=提交/ inputtype=resetvalue=重置//form/body/htmlResearchServlet:….protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//获取调查表单中的用户名Stringusername=request.getParameter(username);//获取调查表单中的密码Stringpassword=request.getParameter(password);//设置Servlet的MIME响应类型,例如把Servlet响应成普通的网页response.setContentType(text/html;charset=utf-8);//获取输出流PrintWriterout=response.getWriter();//输出表单中的信息out.print(html);out.print(headtitle利用Servlet显示调查结果/title/head);out.print(body);out.print(h1);out.print(用户名:+username+br);out.print(密码:+password);out.print(/h1);out.print(/body);out.print(/html);}….6.2.2Servlet的配置为了使Servlet可以通过URL来访问或调用,需要在DynamicProject\WebContent\WEB-INF\web.xml文件中配置Servlet,即指明Serlvet和Servlet类的对应关系,以及指明Serlvert的URL访问方式。使用Eclipse创建Servlet时,web.xml文件中会自动创建对应的配置信息。servletdescription/descriptiondisplay-nameSearchServlet/display-nameservlet-nameSearchServlet/servlet-nameservlet-classcn.edu.qfnu.ch06.servlet.SearchServlet/servlet-class/servletservlet-mappingservlet-nameSearchServlet/servlet-nameurl-pattern/SearchServlet/url-pattern/servlet-mappingEclipse使用默认的类名作为Servlet的别名,使用”/类名”作为Servlet的URL访问方式。servlet标签用于配置Servlet的信息。servlet-mapping标签用于配置Servlet的访问方式。web.xml文件中可能出现多个Servlet,servlet和servlet-mapping通过servlet-name匹配。servlet-name用来定义Servlet的别名,多个Servlet之间不允许重名。servlet-class用来指定Servlet对应的Java类文件的路径,注意包名以及区分大小写。url-pattern标签用于指定Servlet的URL访问方式。Servlet的访问方式是应用上下文的路径再加上url-pattern的值。例如ch06项目的应用上下文路径是,而SearchServlet的url-patter的值是/SearchServlet,因此在地址栏里请求Servlet的完整地址为。另外,还有其它请求Servlet的方式,比如在超级链接或者是表单中。在表单中请求Servlet,即将表单提交给Servlet处理时,action值为url-pattern中除掉’/’的部分,例如:formaction=”SearchServlet”method=”post”。请求程序6-1中的search.html,并输入相关信息,如图所示。提交之后的结果如图所示。6.2.3缺省的Servlet如果某个Servlet的映射路径为“/”,那么这个Servlet就是当前Web应用程序的缺省的Servlet。凡是在web.xml配置文件中根据servlet-mapping找不到匹配的Servlet的,都将由缺省的Servlet处理,即缺省的Servlet用于处理其它Servlet都不处理的请求。6.3Servlet的生命周期Servlet生命周期一般分为初始化、运行和卸载三个阶段。1.初始化阶段Servlet容器负责加载、实例化以及初化一个Servlet。Servlet容器启动时或者客户端请求Servlet服务的时候,Servlet被加载和实例化。(1)加载当启动Servlet容器时,Servlet容器先查找web.xml文件,此文件中记录了配置的Servlet信息,根据Servlet实际对应的完整的.class文件名,Servlet容器加载对应的.class文件到内存中。可以从本机的文件系统中加载,也可以从远程文件系统或者网络资源中加载。(2)实例化Servlet容器根据加载的.class文件实例化该类的一个或多个实例。例如同一个Servlet类在初始化参数中有多个定义,或者Servlet容器需要生成一个Servlet实例池。(3)初始化Servlet容器加载并实例化Servlet后,在Servlet处理客户端请求之前,必须完成初始化。Servlet收到处理请求后,通过调用init()方法完成初始化。在web.xml文件中可以通过使用load-on-startup…/load-on-startup进行预先初始化。初始化需要读取配置信息以及其它需要执行一次的任务。init()方法可以传递ServletConfig对象,ServletConifg对象允许Servlet访问容器的配置信息的初始化参数。在整个初始化过程中,init()方法只被调用一次。2.运行阶段Servlet被初始化后,可用于处理客户