• 1. 第三章 Servlet 编程
  • 2. 本章主要内容Servlet 基础 Servlet 编程基本技能 处理客户端输入 发送非HTML文档 获取Servlet 配置参数 会话管理 Servlet上下文 Servlet间协作 Servlet Filter 编程 Servlet Listener 编程
  • 3. 内容Servlet 基础√ Servlet 编程基本技能 处理客户端输入 发送非HTML文档 获取Servlet 配置参数 会话管理 Servlet上下文 Servlet间协作 Servlet Filter 编程 Servlet Listener 编程
  • 4. 一、Servlet 基础Servlet定义:一种独立于操作系统平台和网络传输协议的服务器端的Java应用程序,它用来扩展服务器的功能,可以生成动态的Web页面 注意:Servlet不是从命令行启动的,而是由包含Java虚拟机的Web服务器进行加载
  • 5. Servlet 与 Applet 相比较 : 相似之处: (1)它们不是独立的应用程序,没有main()方法。 (2)它们不是由用户调用,而是由另外一个应用程序(容器)调用。 (3)它们都有一个生存周期,包含init()和destroy()方法。 不同之处: (1)Applet运行在客户端,主要为了实现浏览器与客户的强大交互,具有丰富的图形界面。 (2)Servlet运行在服务器端,用于扩展服务器的功能,没有图形界面。一、Servlet 基础
  • 6. 总结: Servlet 最大的用途是通过动态响应客户机请求来扩展服务器功能!!!!一、Servlet 基础
  • 7. Servlet工作原理 : Servlet运行在Web服务器上的Web容器里。Web容器负责管理Servlet。它装入并初始化Servlet,管理Servlet的多个实例,并充当请求调度器,将客户端的请求传递到Servlet,并将Servlet的响应返回给客户端。Web容器在 Servlet 的使用期限结束时终结该 Servlet。服务器关闭时,Web容器会从内存中卸载和除去 Servlet 一、Servlet 基础
  • 8. 总结: 客户机与Servlet间没有直接的交互。无论客户机对Servlet的请求还是Servlet对客户端的响应,都是通过Web服务器来实现的,这就大大提高了Servlet组件的可移植性 一、Servlet 基础
  • 9. Servlet基本工作流程 (1)客户机将请求发送到服务器。 (2)服务器上的Web容器实例化(装入)Servlet (3)Web容器将请求信息发送到 Servlet。 (4)Servlet 创建一个响应,并将其返回到Web容器。 (5)Web容器将响应发回客户机。 (6)服务器关闭或Servlet空闲时间超过一定限度时,调用destory()方法退出。客户Web容器Servlet一、Servlet 基础
  • 10. Servlet工作流程说明: 1 Sevlet装入和初始化:第一次请求 Servlet时,服务器将动态装入并实例化。Servlet调用init()方法执行初始化;inint只调用一次。 2 调用Servlet 每个Servlet都对应一个URL地址,可以显式URL调用,或者嵌入到HTML中从Web应用程序调用。 3 处理请求:当容器接收到Servlet的请求,Web容器会产生一个新的线程来调用Service方法:Service根据HTTP请求类型(GET,POST等),然后调用相应的 方法一、Servlet 基础
  • 11. 4、多个请求的处理 :为每个请求创建一个新的线程来处理客户端的请求 5、退出:Web应用程序关闭,服务器将Servlet实例从内存移除,移除之前调用destroy()方法Servlet工作流程说明续:一、Servlet 基础
  • 12. Servlet 编程接口 一、Servlet 基础
  • 13. 内容Servlet 基础 Servlet 编程基本技能√ 处理客户端输入 发送非HTML文档 获取Servlet 配置参数 会话管理 Servlet上下文 Servlet间协作 Servlet Filter 编程 Servlet Listener 编程
  • 14. 编写响应HTTP请求的Servlet的步骤: (1)创建一个扩展了 javax.servlet.http.HttpServlet接口的Servlet类。 (2)重写doGet()或doPost()方法实现对HTTP请求信息的动态响应。 二、第一个Servlet
  • 15. 程序3-1: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 FirstServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //TODO Method stub generated by Lomboz response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("" + "" + "" + " " + "First Servlet" + "" + "" + "" + "
    " + "

    " +"Hello World!" + "

    " + "
    " + "" + ""); } }
  • 16. (本页无文本内容)
  • 17. 程序3-2:Web.xml First com.servlet.FirstServlet First /first index.jsp 404 /error.jsp
  • 18. 内容Servlet 基础 Servlet 编程基本技能 处理客户端输入√ 发送非HTML文档 获取Servlet 配置参数 会话管理 Servlet上下文 Servlet间协作 Servlet Filter 编程 Servlet Listener 编程
  • 19. 三、处理客户端输入 在Web程序设计中,以表单方式向服务器提交数据是最常见的方法。表单数据的提交方法有两种:Post方法和Get方法, 当使用Post方法时,数据由标准的输入设备读入。 当使用Get方法时,数据由CGI变量QUERY_STRING传递给表单数据处理程序,即附加在请求地址的后面,在浏览器的地址栏中可以看到。 对于POST方法或GET方法提交的数据,Servlet处理方法都一样。 用户只要简单的调用HttpServletRequest的getParameter()方法,给出变量名称即可取得该变量的值。 需要注意的是,变量的名称是大小写敏感的。当请求的变量不存在时,将会返回一个空字符串 如果客户端提交的是中文,可能会出现乱码, getParameter();getParameterValues();getParameterName()
  • 20. 内容Servlet 基础 Servlet 编程基本技能 处理客户端输入 发送非HTML文档√ 获取Servlet 配置参数 会话管理 Servlet上下文 Servlet间协作 Servlet Filter 编程 Servlet Listener 编程
  • 21. 随着Internet应用的不断扩展,为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型 Servlets 可以使用 MIME 类型来向浏览器传送非 HTML 文件,比如 Adobe PDF 和 Micorsoft Word。使用正确的 MIME 类型能够保证这些非 HTML 文件被正确的插件或外部程序处理显示。 解决方案:需要将 response 对象中header 的 content 类型设置成 相应的MIME标志 res.setContentType(“application/pdf”) //打开pdf res.setContentType(“application/msword”) //打开Word res.setContentType(“application/vnd.ms-excel”) //打开excel 如果不想再浏览器内部打开,想单独打开 res.setContentType(“Content-disposition”,”attachment; filename=example.pdf”)四、发送非HTML文档
  • 22. 内容Servlet 基础 Servlet 编程基本技能 处理客户端输入 发送非HTML文档√ 获取Servlet 配置参数√ 会话管理 Servlet上下文 Servlet间协作 Servlet Filter 编程 Servlet Listener 编程
  • 23. Servlet配置参数由ServletConfig对象表示。在Servlet被实例化后,ServletConfig对象对任何客户端在任何时候访问都有效,但一个Servlet的ServletConfig对象不能被其他Servlet访问。 在Servlet中要得到ServletConfig对象有两种方法: 在init()方法中获取(通过init的重载方法传递); 通过getServletConfig()方法直接获取。 获取参数的方法:调用ServletConfig 中的getInitParameter()。五、获取Servlet 配置参数用途:通过配置信息来初始化Servlet可以有效避免硬编码信息,提高Servlet的可移植性。
  • 24. 内容Servlet 基础 Servlet 编程基本技能 处理客户端输入 发送非HTML文档 获取Servlet 配置参数 会话管理√ Servlet上下文 Servlet间协作 Servlet Filter 编程 Servlet Listener 编程
  • 25. HTTP特征:HTTP协议是一种无状态的协议,客户端每次打开一个Web 页面,它就会与服务器建立一个新的连接,发送一个新的请求到服务器,服务器处理客户端的请求,返回响应到客户端,并关闭与客户端建立的连接。当客户端发起新的请求,那么它重新与服务器建立连接,因此服务器并不记录关于客户的任何信息。 六、会话管理在许多应用中,服务器往往需要记录特定客户端与服务器之间的一些列请求响应之间特定信息,如网上商店。
  • 26. 会话:从特定客户端到服务器的一些列请求称为会话。一次会话是从客户打开浏览器开始到关闭浏览器结束。六、会话管理会话跟踪:记录会话信息的技术。 会话跟踪技术:通常为每一个客户分配一个某种标识,并将这些标识保存在客户端上,以后客户端发给服务器的每一个HTTP请求提供这些标识来实现,不能使用IP,为什么?Cookie、URL重写、Session
  • 27. Cookie :保存到客户端的一个文本,以“名-值”对的形式保存数据六、会话管理(Cookie)服务器写到客户端的内容 只能是文本内容 客户端可以阻止服务器端写入 Cookie分为两种:窗口/子窗口;文本 一个Servlet/jsp设置的Cookie可以被同一路径下面或子路径下面的Servlet/jsp读到。(路径=URL,路径!=真实的文件路径)
  • 28. URL重写 :在URL后面增加一个包含会话信息的字符串来记录会话信息。URL地址与会话信息的字符串之间用“?”隔开,多个参数,参数间用“&” 如:http://localhost:8080/test/name=sys&age=20六、会话管理(URL重写)如果浏览器不支持Cookie,可以通过URL重写来实现
  • 29. 使用HttpSession接口进行程序开发的基本步骤: (1)获取HttpSession (2)对HttpSession对象进行读或写 (3)手工终止HttpSession;或者什么也不做让它自动终止。每个HttpSession对象都有一定的生存周期,超过这个周期,容器自动将HttpSession终止六、会话管理(Session 续)HttpSession接口方法: isNew():是否新创建的 getId():返回sessionId setAttribute():将指定的名称将对象绑定到会话 getAttribute():返回绑定到此会话的对象 setMaxInactiveInterval():客户机最大请求时间 Invalidate():终止当前会话HttpSession 接口允许 Servlet查看和管理关于会话的信息,确保信息持续跨越多个用户连接等。 HttpSession高级接口实际上是建立在 Cookie 和 URL重写这两种会话跟踪技术之上的,只不过由Servlet自动实现了关于会话跟踪的一切,不再需要程序员了解具体细节。
  • 30. Session :将客户与服务器之间的交互信息记录在服务器上。如果浏览器不支持Cookie,通过URL重写,将sessionid追加到美国URL末尾,服务器在sessionid与其存储有关的会话数据之间建立关联。 会话终止:客户端在一定的时间内没有操作,服务器会终止会话。六、会话管理(Session)如果浏览器支持Cookie,创建Session时会将sessionID保存在Cookie如果浏览器不支持Cookie,使用URL重写方式来实现 方法: response.encodeURL 1)转码 2)URL后面加sesssionID
  • 31. 内容Servlet 基础 Servlet 编程基本技能 处理客户端输入 发送非HTML文档 获取Servlet 配置参数 会话管理 Servlet上下文√ Servlet间协作 Servlet Filter 编程 Servlet Listener 编程
  • 32. 上下文:服务器上的每个Web应用都会有一个背景环境对象。上下文对象提供了一个同一Web应用内的不同资源间共享信息的场所。 用于保存整个application的生命周期内都可以访问的数据 Javax.Servlet.ServletContext接口提供正在运行的Servlet所处的Web应用程序的上下文对象的视图,可以通过getServletContext()方法得到该Servlet运行的上下文对象。 通过ServletContext的get/setAttribute方法取得/设置相关信息七、Servlet上下文
  • 33. 通过Servlet 上下文可以实现以下功能: (1)访问Web应用程序资源 getResource() getResourceAsStream访问Web应用程序内的静态资源文件 (2)在Servlet上下文属性中保存Web应用程序信息 getAttribute(),setAttribute(),removeAttribute() (3)获取初始化参数信息 getInitParameterNames(),getInitParameter(String s) (4)提供日志支持。 ServletContext.log(String s),ServletContext.log(String msg,Throwalble throwable)七、Servlet上下文(续)
  • 34. 内容Servlet 基础 Servlet 编程基本技能 处理客户端输入 发送非HTML文档 获取Servlet 配置参数 会话管理 Servlet上下文 Servlet间协作√ Servlet Filter 编程 Servlet Listener 编程
  • 35. 请求指派:在一个Servlet处理完毕后,将客户端的请求传递到另外一个Servlet来处理。八、 Servlet间协作Web容器接收到客户端的请求后,它负责创建request和response对象,然后将这两个对象以参数的形式传递给与URL地址相关联的Servlet的Service方法处理。对于复杂的处理过程,仅仅通过一个Servlet来实现对于请求的处理往往比较困难,经常需要几个Servlet间共同协作完成对于请求的处理 Requestdispatcher 封装了到同一Web应用内的另外一个资源的应用。通过Requestdispatcher的forward()方法将请求传递到其他资源或include()方法将其他资源对此请求的响应包含进来
  • 36. 内容Servlet 基础 Servlet 编程基本技能 处理客户端输入 发送非HTML文档 获取Servlet 配置参数 会话管理 Servlet上下文 Servlet间协作 Servlet Filter 编程√ Servlet Listener 编程
  • 37. Java Servlet 2.3 规范新特性:Servlet Filter Filter拦截请求和响应,以便查看、提取或以某种方式操作正在客户和服务器之间交换的数据。注意:Filter不是Servlet,它只是Servlet接收请求前的预处理器。 九、 Filter客户请求FilterSevlet
  • 38. Filter主要用在以下几个方面 : (1)访问特定资源(Web 页、JSP 页、Servlet)时的身份验证。 (2)访问资源的记录跟踪。 (3)访问资源的转换。九、 Filter 续(1)
  • 39. 九、 Filter续(2)一个Filter 必须实现javax.Servlet.Filter 接口,即实现下面的三个方法: (1)doFilter(ServletRequest, ServletResponse, FilterChain)。用来实现过滤行为的方法。引入的 FilterChain 对象提供了后续Filter所要调用的信息。 (2)init(FilterConfig)。 (3)destroy()。
  • 40. Filter映射设置
  • 41. 程序3-25: Web.xml(片段) ......... TimeTrackFilter com.servlet.TimeTrackFilter TimeTrackFilter /Main ........
  • 42. 内容Servlet 基础 Servlet 编程基本技能 处理客户端输入 发送非HTML文档 获取Servlet 配置参数 会话管理 Servlet上下文 Servlet间协作 Servlet Filter 编程 Servlet Listener 编程√
  • 43. 十、Servlet Listener 编程事件:指Web应用下上文的创建销毁、会话对象的创建销毁以及会话属性信息的变化等 通过事件监听,Listener对象可以在事情发生前、发生后进行一些必要的处理。 Listener实现了Web应用的事件驱动,使得Web应用不仅可以被动的处理客户端发出的请求,而且可以主动对Web容器的变化进行响应。Java Listener 2.4 规范新特性:用来主动监听Web容器的事件
  • 44. Listener接口Event类ServletContextListenerServletContextEventServletContextAttributeListenerServletContextAttributeEventHttpSessionListenerHttpSessionEventHttpSessionActivationListenerHttpSessionAttributeListenerHttpSessionBindingEventHttpSessionBindingListenerServletRequestListenerServletRequestEventServletRequestAttributeListenerServletRequestAttributeEventServlet规范中支持的Listener接口和Event类 十、Servlet Listener 编程 续
  • 45. 十、Servlet Listener 编程 续ServletContextListener和ServletContextEvent ServletContextEvent代表Web应用上下文事件,Web创建和销毁 ServletContextListener接口的方法 void contextInitiallized(ServletContextEvent sce),通知Listener对象,Web应用被加载及初始化 void contextDestroyed (ServletContextEvent sce),通知Listener对象,Web应用被销毁 ServletContextEvent常用的方法:getServletContext(),Listener通常利用此方法来获取Servlet上下文信息。 ServletContextAttributeListener和ServletContextAttributEvent ServletContextAttributEvent代表Web上下文属性事件,包括增加属性、修改属性和删除属性 ServletContextAttributeListener接口的方法 void attributeAdded( ServletContextAttributEvent scab),当有对象加入Application的范围,通知Listern对象 void attributeRemoved( ServletContextAttributEvent scab ),若有对象从Application范围移除,通知Listener对象 void attributeReplaced( ServletContextAttributEvent scab ),若在 Application范围中,有对象取代另一个对象时,通知Listener对象 ServletContextAttributEvent常用方法: String getName();Object getValue();
  • 46. HttpSessionBindingListener和HttpSessionBindingEvent HttpSessionBindingEvent代表会话绑定事件,当对象加入到Session范围(即调用HttpSession对象的SetAttribute())或从Session范围移出(调用调用HttpSession对象的removeAttribute() )时,都会触发该事件,Web容器会发送消息给HttpSessionBindingListener对象 HttpSessionBindingListene接口方法 void valueBound( HttpSessionBindingEvent event),通知Listener对象,有新的的对象加入Session void valueUnbound( HttpSessionBindingEvent event ),通知Listener对象,有对象从Session中删除 注意: HttpSessionBindingListener不需要在Web.xml中设定的监听器 HttpSessionAttributeListener和HttpSessionBindingEvent HttpSessionAttributeListener监听HttpSessionBindingEvent事件 HttpSessionAttributeListener接口方法 attruibuteAdded( HttpSessionBindingEvent event ),当在Session增加一个属性时,Web容器调用该方法 attruibuteRemoved ( HttpSessionBindingEvent event ),当在Session删除一个属性时,容器会调用此方法 attributeReplacede ( HttpSessionBindingEvent event ),当在Session中的属性被重新设置时,We容器会调用此方法十、Servlet Listener 编程 续
  • 47. 十、Servlet Listener 编程 续HttpSessionListener和HttpSessionEvent HttpSessionEvent是指Session对象的生命周期事件,包括Session的创建和销毁事件 HttpSessionListener接口的方法 sessionCreated( HttpSessionEvent se),当创建一个Session时,Web容器调用此方法 sessionDestroyed( HttpSessionEvent se ),当销毁一个Session时,Web容器会调用此方法。 HttpSessionActivationListener接口 接口主要用于服务器集群情况下。同一个session转移到不同的jvm的情形 ServletRequestListener接口 对Servlet的Request生命周期事件进行监听,用法与ServletContextListener相似 ServletRequesAttributetListener接口 对Servlet的Request属性变化事件进行响应,用法与ServletContextAttruibuteLister相似
  • 48. 所有关于Listener的配置信息都存储在Web应用的部署描述文件Web.xml中,Web容器通过此文件中的信息来决定当某个特定事件发生时,将自动创建对应的Listener对象的实例并调用相应的接口方法进行处理。
  • 49. 程序3-27:Web.xml(部分) ……… CounterPath count.txt ……………… ServletContextListener com.servlet.CounterListener ………………