1、Servlet 编程,本章主要内容,Servlet 基础 Servlet 编程基本技能 Servlet 编程高级技能 Servlet Filter 编程,Servlet 基础 Servlet 编程基本技能 Servlet 编程高级技能 Servlet Filter 编程,Servlet 基础,Servlet定义:一种独立于操作系统平台和网络传输协议的服务器端的Java应用程序,它用来扩展服务器的功能,可以生成动态的Web页面 Servlet担当Web浏览器或其他HTTP客户程序发出请求,与HTTP服务器上的数据库或应用程序之间的中间层。,Servlet是位于Web 服务器内部的服务器端的Jav
2、a应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。,注意:Servlet由包含Java虚拟机的Web服务器进行加载,Servlet的运行方式可以看成是客户机/服务器模式,主要用来响应和处理用户的请求。Servlet结合JDBC可以进行web数据库应用,即在客户端浏览器通过调用Servlet可以浏览和操纵服务器上数据库中的数据。,Servlet 基础,Servlet 与 Applet 相比较 :相似之处: (1)它们不是独立的应用程序,没有main()方法。 (2)它们不是由用户调用,而是由另外
3、一个应用程序(容器)调用。 (3)它们都有一个生存周期,包含init()和destroy()方法。不同之处: (1)Applet运行在客户端,具有丰富的图形界面。 (2)Servlet运行在服务器端,没有图形界面。,Servlet 最大的用途是通过动态响应客户机请求来扩展服务器功能!Servlet是在Web服务器端加载和运行的程序!,Servlet 基础,Servlet 基础,Servlet工作原理 : Servlet运行在Web服务器上的Web容器里。Web容器负责管理Servlet。它装入并初始化Servlet,管理Servlet的多个实例,并充当请求调度器,将客户端的请求传递到Servl
4、et,并将Servlet的响应返回给客户端。Web容器在 Servlet 的使用期限结束时终结该 Servlet。服务器关闭时,Web容器会从内存中卸载和除去 Servlet。,Servlet 基础,Servlet基本工作流程 (1)客户机将请求发送到服务器。 (2)服务器上的Web容器实例化(装入)Servlet (3)Web容器将请求信息发送到 Servlet。 (4)Servlet 创建一个响应,并将其返回到Web容器。 (5)Web容器将响应发回客户机。 (6)服务器关闭或Servlet空闲时间超过一定限度时,调用destory()方法退出。,Servlet 基础,注意:Servlet
5、也可以配置为Web应用程序启动时自动装载。,结论:客户机与Servlet间没有直接的交互。无论客户机对Servlet的请求还是Servlet对客户端的响应,都是通过Web服务器来实现的,这就大大提高了Servlet组件的可移植性,Servlet的生命周期,每个Servlet间接地实现javax.servlet.Servlet接口方法由javax.servlet.Servlet接口定义Servlet生命周期以init()方法、service()方法和destory()方法为中心。,Servlet 基础,Servlet的生命周期,加载、实例化和初始化servlet;调用该servlet的servi
6、ce();清除servlet的响应,将控制权返回给Web服务器。,Servlet 基础,1. Servlet装入和实例化 2. 调用Servlet 3. Servlet处理请求 4. Servlet的退出,Servlet 基础,Servlet的工作流程,Servlet 基础,多个请求的处理 :为每个请求创建一个新的线程来 处理客户端的请求,必须注意线程的同步问题!,使用Servlet 的原因(1)功能强大 (2)跨平台性好 (3)开发难度低 (4)执行效率高 (5)性能优化,Servlet 基础,Servlet 编程接口,Servlet 基础,Servlet是实现复杂的业务应用逻辑的一个强大工
7、具。由于使用Java编写,Servlet可以访问整个Java API工具集。Servlet API是一个定义web客户程序与web服务器之间标准接口的Java类的集合。客户程序向web服务器发出请求,web服务器调用Servlet通过这种接口对请求提供服务。,Servlet 编程接口,Servlet 基础,Servlet API是标准的Java API的扩充,它是一个有用的可不断扩充的程序包集。Servlet API由两个包,12个接口和9个类组成,Servlet API有两个包组成: javax.servlet包含了支持协议无关的Servlet接口和类;javax.servlet.http包
8、含对HTTP协议的特别支持的Servlet接口和类;,所有的Servlet都必须实现通用Servlet接口和HttpServlet接口之一。,javax.servlet包中有七个接口,五个类1.Servlet接口 2.ServletRequest接口 3.ServletResponse接口 4.ServletConfig接口 5.ServletContext接口 6. RequestDispatcher接口 7.SingleThreadModel接口 1.GenericServlet类2. ServletInputStream类3. ServletOutputStream类4. Servlet
9、Exception类5.UnavaiableException类,Servlet接口 包含了所有的Servlet最基本的方法,实际在使用Servlet时,一般使用GenericServlet类或HTTPServlet类。,1.Servlet接口 声明: Public interface Servlet 这个接口是所有Servlet必须直接或间接实现的接口.它定义了以下的方法: init(SetvletConfig)-用于初始化Servlet getServletConfig()-获得Servlet配置相关信息 destroy()-销毁Servlet getServletInfo()-获得Ser
10、vlet的信息 service(ServletRequest req, ServletResponse res)-运行应用程序逻辑的入口,它接收2个参数,ServletRequest表示客户端请求的信息,ServletResponse表示对客户端的响应,Servlet接口的主要方法和功能Interface Servlet public abstract void init(ServletConfig); public abstract ServletConfig getServletConfig( ); public abstract string getServletInfo(); publ
11、ic abstract void service(ServletRequest, ServletResponse); public abstract void destroy();,ServletRequest接口客户向Servlet发出请求时,Servlet使用ServletRequest接口获取客户端请求信息, ServletRequest对象作为一个参数传递给service()方法,在使用HttpServlet类时,一般使用它的子接口HttpServletRequest。,ServletRequest接口定义的主要方法:Interface ServletRequest public ab
12、stract int getContentLength(); public abstract string getContentType(); public abstract string getProtcol(); public abstract string getSchema(); public abstract string getServerName (); public abstract string getServerPort (); public abstract string getRemoteAddr (); public abstract string getServer
13、Host (); public abstract string getParameter (String name); public abstring string getParameterValue (String name);,ServletResponse接口ServletResponse接口一般在Servlet 的service()方法中调用,在service()方法中可以使用ServletResponse中的方法,把数据返回给客户端, ServletResponse作为一个参数传递给service()方法的。,ServletResponse接口定义的主要方法:Interface Se
14、rvletResponse public abstract void setContentLength( int len);public abstract void setContentType(string type);public abstract ServletOutputStream getOutputStream();,GenericServlet类 GenericServlet类实现了Servlet接口,是一个实用的Servlet类,它是一个抽象类,而它的service()方法是一个抽象方法,GenericServlet的派生类必须直接或者间接实现这个方法。 它主要方法和功能为:C
15、lass GenericServlet Implements Servlet public abstract void init(ServletConfig); public abstract ServletConfig getServletConfig( ); public abstract string getServletInfo(); public abstract void service(ServletRequest, ServletResponse); public abstract void destroy();,javax.servlet.http包有五个接口和四个类,Htt
16、pServletRequest接口 HttpServletResponse接口 HttpSession接口 HttpSessionContext接口 HttpSessionBingingEvent接口 Cookie类 HttpServlet类 HttpSessionBingingEvent类 HttpUtils类,HttpServlet 编程接口,Servlet的相关类和接口,HttpServlet类: 它是一个抽象类,HttpServlet继承通用Servlet类(GenericServlet),接受来自Web站点的请求(该请求来自访问该Web站点的客户浏览器),并将处理后的响应结果发回We
17、b站点(Web站点再将响应结果发送给客户浏览器),HttpServlet类的定义,Public class HttpServlet extends GenericServlet,HttpServlet类的方法,doGet()方法: 用来处理一个HTTP GET请求,这个操作允许客户端简单的从一个HTTP服务器获得资源,对于HTTP的GET请求,它仅仅允许客户从HTTP服务器上取得(GET)资源。Public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException,
18、IOException,doPost()方法:用来处理一个HTTP POST请求。Public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException,doPut()方法:用来处理一个HTTP PUT请求。Public void doPut (HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException,doDel
19、ete()方法:用来处理一个HTTP DELETE请求。Public void doDelete (HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException,HttpServletRequest接口,HttpServletRequest代表发送到HttpServlet的请求,这个接口封装了从客户机到服务器的通信,它可以包含关于客户环境的信息和任何要从客户机发送到Servlet的数据。 HttpServletRequest接口扩展了javax.servlet.serv
20、letRequest接口,用于提供更多的功能给HttpServlet。Servlet引擎实现该接口,创建HttpServletRequest对象,将来自客户浏览器的信息传递给HttpServlet的Servlet方法。,HttpServletResponse接口,HttpServletResponse代表从HttpServlet发回客户机的响应。它通常是根据请求和Servlet访问的其他来源中的数据动态创建生成的响应,如HTML页面。,ServletConfig接口,ServletConfig代表Servlet的配置信息。 Servlet在发布到服务器上的时候,在web应用配置文件中对应一段配
21、置信息。 Servlet根据配置信息进行初始化。 配置信息的好处在于Servlet发布时可以通过配置信息灵活的调整Servlet而不需要重新改动、编译代码。,ServletConfig接口定义了一个Servlet配置对象,Servlet服务器可以用来传递信息给Servlet以便初始化Servlet。 配置信息含有初始化参数,这些参数以”名字/值“的形式成对出现,描述关于服务器的Servlet信息。,ServletContext接口,ServletContext代表Servlet的运行环境信息。为了与服务器及服务器上运行的其他程序进行交互,有必要获得服务器的环境信息。 定义了一套Servlet与
22、Servlet通信的方法,例如:得到MIME类型的文件。确定运行在服务器上的其他Servlet 或写Servlet日志文件。 Servlet引擎通过返回一个ServletContext对象来与Servlet交流, Servlet使用ServletConfig接口的getServletContext方法得到ServletContext对象。,ServletException接口,ServletException代表Servlet运行过程中掷出的意外对象。,HttpSession接口,HttpSession用来在无状态的Http协议下越过多个请求页面来维持状态和识别用户。维护HttpSession
23、的方法有Cookie或URL重写。,RequestDispatcher接口,RequestDispatcher代表请求转发器,可以将客户端请求从一个Servlet转发到另外其他的服务器资源,如其他Servlet、静态HTML页面等。,Servlet 基础 Servlet 编程基本技能 Servlet 编程高级技能 Servlet Filter 编程,编写响应HTTP请求的Servlet的步骤:(1)创建一个扩展了 javax.servlet.http.HttpServlet接口的Servlet类。 (2)重写doGet()或doPost()方法实现对HTTP请求信息的动态响应。,Servlet
24、 编程基本技能,程序31:FirstServlet.java package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FirstSer
25、vlet extends HttpServlet protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /TODO Method stub generated by Lombozresponse.setContentType(“text/html“);PrintWriter out = response.getWriter();out.println(“+ “+ “+ “ “ + “First Servlet“ + “
26、+ “+ “+ “ “+ “ “ +“Hello World!“ + “+ “ “+ “+ “);/out.printIn(“Hello World”) ,处理客户端输入,Servlet 编程基本技能,在Web程序设计中,以表单方式向服务器提交数据是最常见的方法。表单数据的提交方法有两种:Post方法和Get方法,当使用Post方法时,数据由标准的输入设备读入。当使用Get方法时,数据传递给表单数据处理程序,即附加在请求地址的后面,在浏览器的地址栏中可以看到。,处理客户端输入,用户只要简单的调用HttpServletRequest的getParameter()方法,给出变量名称即可取得该变量的
27、值。需要注意的是,变量的名称是大小写敏感的。当请求的变量不存在时,将会返回一个空字符串,Servlet 编程基本技能,生成提交数据的HTML页面: Login.html提交表单数据 欢迎登录系统 用户名:密 码:,生成处理客户端请求的Servlet:getpostdata.java package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; imp
28、ort javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class getpostdata extends HttpServlet protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException /TODO Method stub generated by Lomboz/为解决编码问题后来添加
29、response.setContentType(“text/html;charset=gb2312“); request.setCharacterEncoding(“gb2312“);/解决编码问题PrintWriter out = response.getWriter(); out.println( /a tools method to show the html code with title “n“ + “ + “get post data “ + “n“ + “n“ + “ username: “ + request.getParameter(“username“) + “n“ + “
30、 password: “ + request.getParameter(“password“) + “n“ + “n“ + “); ,处理客户端输入,处理多选项框的输入页面用户需要调用HttpServletRequest的getParameterValues()方法,给出变量名称即可取得该变量的值。,Servlet 编程基本技能,生成HTML页面: multiChoice.html多值变量提交选出你喜欢吃的水果: 苹果 西瓜 桃子葡萄,生成处理客户端请求的Servlet:MutiChoiceServlet.java package com.servlet; import java.io.IOE
31、xception; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MultiChoiceServlet extends HttpServlet protected void doPost(HttpServletReques
32、t request,HttpServletResponse response) throws ServletException, IOException /TODO Method stub generated by Lombozresponse.setContentType(“text/html;charset=gb2312“); request.setCharacterEncoding(“gb2312“);/解决编码问题PrintWriter out = response.getWriter(); String paramValues = request.getParameterValues
33、(“checkbox1“);String temp=new String(“);for(int i=0;iparamValues.length;i+)temp+=paramValuesi+“ “;out.println(“你喜欢吃的水果有:“+temp+“。“); ,程序说明:多选框对应的变量有多个值,程序调用request.getParameterValues(“checkbox1”)获得变量值数组,然后采用循环的方式将其中的每个值取出显示。,发送非HTML文档,Servlet 编程基本技能,通过Java Servlet 编程可以方便地对客户端的响应以HTML文件的形式发送到客户端的WEB浏
34、览器,然而许多站点还允许访问MIME类型的非HTML文档。,发送非HTML文档,Servlet 编程基本技能,Servlets 可以使用 MIME 类型来向浏览器传送非 HTML 文件,比如 Adobe PDF 和 Micorsoft Word。使用正确的 MIME 类型能够保证这些非 HTML 文件被正确的插件或外部程序处理显示。,发送非HTML文档,Servlet 编程基本技能,解决方案:PDF文件的MIME类型是“application/pdf”。用Servlet打开一个PDF文件,需要将 response 对象中header 的 content 类型设置成相应的MIME标志 respo
35、nse.setContentType(“application/pdf”),Servlet 编程基本技能,Servlet除了从请求对象中获取信息以外,还可以从配置文件中获取配置参数信息。,获取Servlet配置参数,Servlet 编程基本技能,Servlet配置参数由ServletConfig对象表示。在Servlet被实例化后,ServletConfig对象对任何客户端在任何时候访问都有效,但一个Servlet的ServletConfig对象不能被其他Servlet访问。 在Servlet中要得到ServletConfig对象有两种方法:在init()方法中获取(通过init的重载方法传递
36、);通过getServletConfig()方法直接获取。,用途:通过配置信息来初始化Servlet可以有效避免硬编码信息,提高Servlet的可移植性。,获取Servlet配置参数,Servlet 基础 Servlet 编程基本技能 Servlet 编程高级技能 Servlet Filter 编程,Servlet 编程高级技能,会话:从特定客户端到服务器的一系列请求称为会话。在Web服务器看来,一个会话是由在一次浏览过程中所发出的全部HTTP请求组成的。,Servlet 编程高级技能,HTTP特征: HTTP协议是一种无状态的协议,客户端每次打开一个Web 页面,它就会与服务器建立一个新的连
37、接,发送一个新的请求到服务器,服务器处理客户端的请求,返回响应到客户端,并关闭与客户端建立的连接。当客户端发起新的请求,那么它重新与服务器建立连接,因此服务器并不记录关于客户的任何信息。,Servlet 编程高级技能,记录会话信息的技术称为会话跟踪。常见会话跟踪技术有:Cookie、URL重写隐藏表单域Session,Servlet 编程高级技能,Cookie Cookie是一小块可以嵌入到HTTP请求和响应中的数据。 识别用户 避免输入用户名和密码 定制一个站点,Servlet 编程高级技能,Cookie使用过程 (1)在服务器端创建Cookie。 Cookie cookie=new Coo
38、kie(String name,String Val); String name:Cookie的名字,String Val:Cookie的值。(2)将Cookie添加到客户端response.addCookie(cookie);(3)读取cookie(客户端-服务器)request.getCookie();,Servlet 编程高级技能,示例: 显示Cookie的信息 通过Cookie实现会话跟踪,Servlet 编程高级技能,(1)在服务器端创建Cookie。 Cookie cookie = null;(2)通过HttpServletRequest对象中的getCookie()方法,从客户端
39、读取Cookie,那么它返回当前请求中Cookie对象的一个数组,返回所有Cookie。Cookie cookies= request.getCookie();,Servlet 编程高级技能,(4)判断Cookie“VisitTimes”是否存在,如果不为空,也就是已经存在,那么使用Cookie对象的getName()获取信息。 if (cookies != null) for (int i = 0; (i cookies.length; i+) if(cookiesi.getName( ).equals(“VisitTimes“) cookie=cookiesi;,Servlet 编程高级技
40、能,(5)如果Cookie不存在,需要生成一个新的Cookie(从服务器端添加到客户端)if (cookie = null)int maxAge=-1;cookie = new Cookie(“VisitTimes“,“1“);cookie.setMaxAge(maxAge); response.addCookie(cookie); ,Servlet 编程高级技能,URL重写URL重写把传入WEB的请求地址重定向到其他URL的过程。,Servlet 编程高级技能,URL重写优点隐藏实际路径提高安全性,Servlet 编程高级技能,URL重写URL重写通过在URL地址后面增加一个包含会话信息的字
41、符串来记录会话信息。URL重写将一些信息附加在URL后面,使用”?“和”&“分割。URL地址与会话信息的字符串之间用”?“隔开,如果有多个参数,参数间用”&“隔开。 示例:如书P53,Servlet 编程高级技能,HttpSession高级接口实际上是建立在 Cookie 和 URL重写这两种会话跟踪技术之上的,只不过由Servlet自动实现了关于会话跟踪的一切,不再需要程序员了解具体细节。HttpSession 接口允许 Servlet查看和管理关于会话的信息,确保信息持续跨越多个用户连接等。,使用HttpSession对象跟踪对话,HttpSession接口,HttpSession用来在无
42、状态的Http协议下越过多个请求页面来维持状态和识别用户。维护HttpSession的方法有Cookie或URL重写。,Servlet 编程高级技能,HttpSession 接口中常用方法(javax.servlet.http.HttpSession ) (1) public Boolean isNew() 如果客户机还不知道会话,则返回true,如果客户机已经禁用了Cookie,则会话在每个请求上都是新的。 (2) public String getId() 返回包含分配给这个会话的唯一标识的字符串。,Servlet 编程高级技能,(3) public void setAttribute(S
43、tring name,Object value) 将value对象以name名称绑定到会话(4)public object getAttribute(String name) 取得name的属性值,如果属性不存在则返回null,Servlet 编程高级技能,(5)public long getCreationTime() 返回会话创建时间(6)public long getLastAccessedTime() 返回在会话时间内web容器接收到客户最后发出的请求的时间(7)public void removeAttribute(String name) 从会话中删除name属性,如果不存在不会执
44、行,也不会抛处错误,Servlet 编程高级技能,使用 HttpSession 接口进行程序开发的基本步骤是: (1)获取HttpSession会话对象 HttpSession session=HttpServletRequest.request. getSession(true),Servlet 编程高级技能,(2)对HttpSession会话对象进行读或写public void setAttribute(String name,Object value)public object getAttribute(String name) (3)手工终止会话,或者什么也不做,让它自动终止。每个会话
45、对象都有一定的生存周期,超过这个周期,容器将自动将会话对象中止。,示例: HitCounter.java,Servlet 编程高级技能,上下文:服务器上的每个Web应用都会有一个背景环境对象。上下文对象提供了一个同一Web应用内的不同资源间共享信息的场所。 Javax.Servlet.ServletContext接口提供正在运行的Servlet所处的Web应用程序的上下文对象的视图,可以通过ServletConfig实例的getServletContext()方法得到该Servlet运行的上下文对象。,Servlet 编程高级技能,通过Servlet 上下文可以实现以下功能: (1)访问Web
46、应用程序资源 (2)在Servlet上下文属性中保存Web应用程序信息 (3)获取初始化参数信息 (4)提供日志支持。,ServletContext:是一个全局的存储信息的空间,服务器开始就其存在,服务器关闭,其才释放。为了节省空间,提高效率,ServletContext放用户需要共享的信息。,Servlet 编程高级技能,Servlet上下文,ServletContext:是一个全局的存储信息的空间,服务器开始就其存在,服务器关闭,其才释放。为了节省空间,提高效率,ServletContext放用户需要共享的信息。,Servlet上下文,读取web. xml内的参数,参数名参数值,读取全局参
47、数 getServletContext().getInitParameter (“参数名”);读取局部参数 getInitParameter (“参数名”),请求指派:对于复杂的处理过程,将客户端的请求传递到另一个Servlet来处理,这种像接力赛似的过程称为请求指派。为了实现请求指派。接口: javax.servlet. RequestDispatcher,Servlet 编程高级技能,Servlet间协作,RequestDispatcher接口,RequestDispatcher代表请求转发器,可以将客户端请求从一个Servlet转发到另外其他的服务器资源,如其他Servlet、静态HTM
48、L页面等。,Requestdispatcher封装了到同一web应用内的另一个资源的应用。可以通过调用RequestDispatcher的forword()方法将请求传递到其他资源,或者调用RequestDispatcher的include()方法将其他资源对此请求的响应包含进来。,Java Servlet 2.3 规范新特性:Servlet Filter,Servlet Filter 编程,注意:Filter不是Servlet,它只是Servlet接收请求前的预处理器。,一个Filter 必须实现javax.Servlet.Filter 接口,即实现下面的三个方法: (1)doFilter(ServletRequest, ServletResponse, FilterChain)。用来实现过滤行为的方法。引入的 FilterChain 对象提供了后续Filter所要调用的信息。 (2)init(FilterConfig)。 (3)destroy()。,要让每次提交(广义,所有get、post提交)的时候自动做一些事情,编写过滤器。,1、编写一个类,实现javax.servlet.Filter; 2、编写doFilter:FilterChain.doFilter(request,response);,3、 名称类类/*,