




已阅读5页,还剩105页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Servlet 一种提供动态内容 面向用户内容的方法 概要 2 1servlet概览2 2Servlet接口2 3Servlet环境2 4过滤器2 5会话2 6事件监听 2 1servlet概览 Servlet是使用JavaServlet应用程序设计接口 API 及相关类和方法的Java程序 Servlet通过创建一个框架来扩展服务器的能力 以提供在Web服务器上进行请求和响应服务 什么是Servlet 什么是Servlet容器 与其他技术的比较如何工作 什么是Servlet JavaServlets是基于Java技术的Web组件 用来扩展以请求 响应为模型的服务器的能力 提供动态内容 Servlet是使用JavaServlet应用程序设计接口 API 及相关类和方法的Java程序 因为是对象字节码 可动态地从网络加载 Servlet由容器或引擎来管理 通过请求 响应模型与Web客户进行交互 什么是Servlet容器 servlet由servlet容器管理 servlet容器也叫servlet引擎 是servlet的运行环境servlet容器是web服务器或应用服务器的一部分管理和维护servlet的整个生命周期必须支持http协议负责处理客户请求 把请求传送给适当的servlet并把结果返回给客户 虽然容器的实现可能各不相同 但容器与servlet之间的接口是由servletAPI定义好的 规定了servlet容器在servlet上要调用的方法及传递给servlet的对象类 Servlet容器的职能 用来发送请求和响应的网络服务为Servlet注册一个或多个URL 管理servlet的生命周期解码基于MIME的请求构造基于MIME的响应支持Http协议 也可以支持其他协议 如weblogic服务器支持t3协议 Servlet的特性和优势 Servlet可以和其他资源 文件 数据库 Applet Java应用程序等 交互 以生成返回给客户端的响应内容 如果需要 还可以保存请求 响应过程中的信息 采用Servlet 服务器可以完全授权对本地资源的访问 如数据库 并且Servlet自身将会控制外部用户的访问数量及访问性质Servlet可以是其它服务的客户端程序 例如 它们可以用于分布式的应用系统中 可以从本地硬盘 或者通过网络从远端硬盘激活Servlet Servlet可被链接 chain 一个Servlet可以调用另一个或一系列Servlet 即成为它的客户端 ServletAPI与协议无关 它并不对传递它的协议有任何假设 像所有的Java程序一样 Servlet拥有面向对象Java语言的所有优势 如何工作 2 2Servlet编程 编程接口Servlet的生命周期部署描述符中servlet相关部分Servlet的例子 编程接口 servlet接口 定义在javax servlet Servlet当在编写某个servlet的时必须直接或间接的实现这个接口 一般趋向于间接实现 通过从javax servlet GenericServlet或javax servlet http HttpServlet派生 在实现servlet接口时必须实现它的五个方法 servlet接口 publicvoidinit ServletConfigconfig throwsServletException一旦对servlet实例化后 容器就调用此方法 容器把一个ServletConfig对象传递给此方法 这样servlet的实例就可以把与容器相关的配置数据保存起来供以后使用 如果此方法没有正常结束就会抛出一个ServletException 一旦抛出该异常 servlet就不再执行 而随后对它的调用会导致容器对它重新载入并再次运行此方法 接口规定对任何servlet实例 此方法只能被调用一次 在任何请求传递给servlet之前 此方法可以在不抛出异常的情况下运行完毕 servlet接口 publicvoidservice ServletRequestreq ServletResponseres throwsServletException IOException只有成功初始化后此方法才能被调用处理用户请求 前一个参数提供访问初始请求数据的方法和字段 后一个提供servlet构造响应的方法 会抛出servlet异常和io异常 servlet接口 publicvoiddestroy 容器可以在任何时候终止servlet服务 容器调用此方法前必须给service 线程足够时间来结束执行 因此接口规定当service 正在执行时destroy 不被执行 servlet接口 publicServletConfiggetServletConfig 在servlet初始化时 容器传递进来一个ServletConfig对象并保存在servlet实例中 该对象允许访问两项内容 初始化参数和ServletContext对象 前者通常由容器在文件中指定 允许在运行时向sevrlet传递有关调度信息 后者为servlet提供有关容器的信息 此方法可以让servlet在任何时候获得该对象及配置信息 servlet接口 publicStringgetServletInfo 此方法返回一个String对象 该对象包含servlet的信息 例如开发者 创建日期 描述信息等 该方法也可用于容器 GenericServlet类 实现Servlet ServletConfig Serializable提供了servlet接口的基本实现部分 其service 方法被申明为abstract 因此需要被派生 init ServletConfigconf 方法把servletConfig对象存储在一个privatetransient 私有临时 实例变量里 getServletConfig 方法返回指向本对象的指针 如果重载此方法 将不能使用getServletConfig来获得ServletConfig对象 如果确实想重载 记住要包含对super config的调用 log Stringmsg 方法将servlet的名称和msg参数写到容器的日志中 HttpServlet类 扩展了GenericServlet类并对servlet接口提供了与HTTP更相关的实现protectedvoidservice HttpServletRequestreq HttpServletResponseres throwsServletException IOException该方法作为HTTP请求的分发器 任何时候都不能被重载 当请求到来时 service 方法决定请求的类型 GET POST HEAD OPTIONS DELETE PUT TRACE 并把请求分发给相应的处理方法 doGet doPost doHead doOptions doDelete doPut doTrace 每个do方法具有和第一个service 相同的形式 为了响应特定类型的HTTP请求 必须重载相应的do方法 如果servlet收到一个HTTP请求而你没有重载相应的do方法 它就返回一个说明此方法对本资源不可用的标准HTTP错误 请求处理方法 Serlvet接口只定义了一个服务方法就是service 而HttpServlet类实现了该方法并且要求调用对应的doXXX 方法 通常情况下 在开发基于HTTP的servlet时 只需要关心doGet和doPost方法 其它的方法需要开发者非常的熟悉HTTP编程 通常情况下 实现的servlet都是从HttpServlet扩展而来 doPut和doDelete方法允许开发者支持HTTP 1 1的对应特性 doHead是一个已经实现的方法 它将执行doGet但是仅仅向客户端返回doGet应该向客户端返回的头部的内容 doOptions方法自动的返回servlet所直接支持的HTTP方法信息 doTrace方法返回TRACE请求中的所有头部信息 请求处理方法 对于仅支持HTTP 1 0的容器而言 只有doGet doHead和doPost方法能被使用 因为HTTP 1 0协议没有定义PUT DELETE OPTIONS 或者TRACE请求 servlet规范要求 servlet容器至少要实现HTTP 1 0协议规范 推荐实现HTTP 1 1规范 在此基础上可以实现其它的基于请求回应模式 basedrequestresponsemodel 的协议 例如HTTPS 一个简单的实例 packagecn edu njust importjava io importjavax servlet importjavax servlet http publicclassHelloWorldextendsHttpServlet publicvoiddoGet HttpServletRequestrequest HttpServletResponseresponse throwsIOException ServletException response setContentType text html PrintWriterout response getWriter out println out println out println out println HelloWorld out println out println out println HelloWorld out println out println Servlet生命周期 servlet有良好的生存期的定义 包括如何加载 实例化 初始化 处理客户端请求以及如何被移除 生命周期由javax servlet Servlet接口的init service和destroy方法表达 Action1 加载和实例化 容器负责加载和实例化一个servlet 实例化和加载可以发生在引擎启动的时候 也可以推迟到容器需要该servlet为客户请求服务的时候 加载的时机 容器必须先定位servlet类 在必要的情况下 容器使用通常的Java类加载工具加载该servlet 可能是从本机文件系统 也可以是从远程文件系统甚至其它的网络服务 容器加载servlet类以后 它会实例化该类的一个实例 需要注意的是可能会实例化多个实例 例如一个servlet类因为有不同的初始参数而有多个定义 或者servlet实现SingleThreadModel而导致容器为之生成一个实例池 Action2 初始化 容器必须在servlet能够处理客户端请求前初始化它 初始化的目的 是读取永久的配置信息 昂贵资源 例如JDBC连接 及其它仅需执行一次的任务 通过调用它的init方法并给它传递唯一的一个 每个servlet定义一个 ServletConfig对象完成这个过程 该配置对象允许servlet访问容器的配置信息中的名称 值对 name value 初始化参数 同时给servlet提供了访问实现了ServletContext接口的具体对象的方法 该对象描述了servlet的运行环境 初始化的错误处理 初始化期间 servlet实例可能通过抛出UnavailableException或者ServletException异常表明它不能进行有效服务 如果抛出上述异常 它将不会被置入有效服务并且应该被容器立即释放 在此情况下destroy方法不会被调用因为初始化没有成功完成 在失败的实例被释放后 容器可能在任何时候实例化一个新的实例 对这个规则的唯一例外是如果失败的servlet抛出的异常是UnavailableException并且该异常指出了最小的无效时间 那么容器就会至少等待该时间指明的时限才会重新试图创建一个新的实例 Action3 处理请求 在servlet被适当地初始化后 容器就可以使用它去处理请求了 每一个请求由ServletRequest类型的对象代表 而servlet使用ServletResponse回应该请求 这些对象被作为service方法的参数传递给servlet 在HTTP请求的情况下 容器必须提供代表请求和回应的HttpServletRequest和HttpServletResponse的具体实现 需要注意的是容器可能会创建一个servlet实例并将之放入等待服务的状态 但是这个实例在它的生存期中可能根本没有处理过任何请求 处理请求的多线程问题 缺省的情况下 容器可能同时将多个客户端的请求发送给一个实例的service方法 这就意味着开发者必须确保编写的servlet可以处理并发问题 如想防止这种缺省的行为 那么可以让编写的servlet实现SingleThreadModel 实现这个类可以保证一次只会有一个线程在执行service方法并且一次性执行完 容器可以通过将请求排队或者维护一个servlet实例池满足这一点 如果开发者使用synchronized关键字定义service方法 或者是doGet和doPost 容器将排队处理请求 这是由底层的java运行时系统要求的 强烈推荐不要同步service方法或者HTTPServlet的诸如doGet和doPost这样的服务方法 处理请求中的异常 可能抛出ServletException或者UnavailableException异常 ServletException表明在处理请求的过程中发生了错误 容器应该使用合适的方法清除该请求 UnavailableException表明servlet不能对请求进行处理 可能是暂时的 也可能是永久的 如果指明是永久性的 那么容器必须将servlet从服务中移除 调用它的destroy方法并释放它的实例 如果指明是暂时的 那么容器可以选择在异常信息里面指明的这个暂时无法服务的时间段里面不向它发送任何请求 Action4 服务结束 Servlet规范并没有对容器将一个加载的servlet保存多长时间作出要求 因此一个servlet实例可能只在容器中存活了几毫秒 当然也可能是其它更长的任意时间 但是肯定会短于容器的生存期 当容器决定将之移除时 原因可能是保存内存资源或者自己被关闭 那么它必须允许servlet释放它正在使用的任何资源并保存任何永久状态 这个过程通过调用destroy方法达到 容器在能够调用destroy方法前 它必须允许那些正在service方法中执行的线程执行完或者在服务器定义的一段时间内执行 这个时间段在容器调用destroy之前 一旦destroy方法被调用 容器就不会再向该实例发送任何请求 如果容器需要再使用该servlet 它必须创建新的实例 destroy方法完成后 容器必须释放servlet实例以便它能够被垃圾回收 部署描述符中servlet相关部分 元素元素 元素 servlet元素必须含有servlet name元素和servlet class元素 或者servlet name元素和jsp file元素 描述如下 servlet name元素用来定义servlet的名称 该名称在整个应用中必须是惟一的 servlet class元素用来指定servlet的完全限定的类名称 jsp file元素用来指定应用中JSP文件的完整路径 这个完整路径必须由 开始 init param元素是可选元素 有param name param value两个子元素 元素 元素为一个servlet实例提供一个URLpattern 元素必须包含元素和元素 元素必须和在web xml文件某处元素定义的元素一致 示例 Servlet开发示例 编写一个简单的Servlet 名为HelloServlet 为例说明开发Servlet的过程 编写Servlet代码编译Servlet代码编辑部署描述符web xml运行测试 编写Servlet代码 importjavax servlet importjavax servlet http importjava io importjava util publicclassHelloServletextendsHttpServlet publicvoidinit ServletConfigconfig throwsServletException super init config publicvoidservice HttpServletRequestreq HttpServletResponseres throwsServletException IOException StringclientIPAddress req getRemoteAddr res setContentType text html ServletOutputStreamout res getOutputStream out println html out println head title HelloWorld title head out println body out println h1 Hello Youcomefrom clientIPAddress h1 out println body html 编译Servlet代码 安装JDK1 5以后版本并设置环境变量把编译servlet所需的servlet jar加入CLASSPATH编译servlet把HelloServlet class拷贝到应用程序目录 example web inf class 建议采用ant自动完成上述工作 ant一种基于java的构建工具 能极大提高开发效率 编辑部署描述符web xml HelloWorldHelloServletHelloWorld hello 测试运行 对HelloServlet进行测试 打开浏览器 键入http localhost 8080 example hello其中localhost是运行tomcatweb服务器的机器名称 如果一切正常 在浏览器中将返回一个页面 输出 Hello Youcomefrom192 168 0 1 其中192 168 0 1是运行浏览器的机器IP地址 2 3ServletContext ServletContext接口初始化参数环境属性访问资源 ServletContext接口 javax servlet ServletContext接口定义了一系列方法用于与相应的servlet容器通信每个JVM中的每一个web app只能有一个ServletContextServlet实例的getServletContext方法 得到该Servlet运行其中的这个环境对象使用ServletContext对象 servlet能够初始化参数 获得文件的MIME类型 分派请求 或者是向日志文件写日志 访问资源等 初始化参数 ServletContext可以用来传递参数信息可以调用ServletContext getInitParameterNames 返回一个初始化参数的枚举对象 java util Enumeration 或直接指定一个参数名来得到特定的参数值 ServletContext getInitParameter Stringname 环境属性 把对象通过名称绑定到环境中context setAttribute Stringname Objectobject 将把object对象绑定到名字name 存放在Servlet环境中 可供同一环境中的其他Servlet共享 其他Servlet可以通过context getAttribute Stringname 得到一个环境中的对象 或通过context removeAttribute Stringname 在环境中移除一个对象 访问资源 getResourcePaths 和getResource 可访问资源publicjava util SetgetResourcePaths java lang Stringpath 返回一个存储web app中所有资源路径的集合 如果子目录为空 返回null 路径以 结尾表示一个子目录 并以 开头表示一个对于web app的相对路径 用来获取在这个web应用中能够访问的所有的资源列表不能用来获取动态内容 getResourcePaths 的例子 例子 welcome html catalog index html catalog products html catalog offers books html catalog offers music html customer login jsp WEB INF web xml WEB INF classes com acme OrderServlet class getResourcePaths 返回Set welcome html catalog customer WEB INF getResourcePaths catalog 返回Set catalog index html catalog products html catalog offers getResource URLgetResource java lang Stringpath MalformedURLException返回由path指定的资源路径对应的一个URL对象 该path必须以 开头并作为当前目录的相对位置 该资源允许是一个本地资源或者是一个远程文件系统 这些资源可以在数据库中 或者在一个 war文件中 servlet容器必须实现URL句柄和URLConnection对象 这些对象对于资源访问是必需的 如果没有匹配的资源 该方法返回null 不能用来获取动态内容 例如如果相对路径指向一个jsp文件 则获取的是jsp的源码 而不是执行的结果 2 4过滤 什么是过滤器过滤器的功能过滤器接口过滤器生命周期过滤器的例子 什么是过滤器 Servlet过滤器是在JavaServlet规范2 3中定义的 它能够对Servlet容器的请求和响应对象进行检查和修改 Servlet过滤器本身并不产生请求和响应对象 它只能提供过滤作用 Servlet过滤能够在Servlet被调用之前检查Request对象 修改RequestHeader和Request内容 在Servlet被调用之后检查Response对象 修改ResponseHeader和Response内容 Servlet过滤负责过滤的Web组件可以是Servlet JSP或者HTML文件 即动态或静态的web资源 Servlet过滤器的特点 Servlet过滤器可以检查和修改ServletRequest和ServletResponse对象Servlet过滤器可以被指定和特定的URL关联 只有当客户请求访问该URL时 才会触发过滤器Servlet过滤器可以被串联在一起 形成管道效应 协同修改请求和响应对象 过滤器链 Servlet过滤器的作用 查询请求并作出相应的行动 阻塞请求 响应对 使其不能进一步传递 修改请求的头部和数据 用户可以提供自定义的请求 修改响应的头部和数据 用户可以通过提供定制的响应版本实现 与外部资源进行交互 Servlet过滤器的适用场合 认证过滤登录和审核过滤图像转换过滤数据压缩过滤加密过滤资源访问触发事件过滤XSLT过滤 过滤器编程 建立一个过滤器涉及下列五个步骤 1 建立一个实现Filter接口的类 2 在doFilter方法中实现过滤行为 3 调用FilterChain对象的doFilter方法 4 对相应的servlet和JSP页面注册过滤器 5 禁用激活器servlet 建立一个实现Filter接口的类 所有的Servlet过滤器类都必须实现javax servlet Filter接口 这个接口含有3个过滤器类必须实现的方法 init doFilter destroy init publicvoidinit FilterConfigconfig thowsServletExceptioninit方法只在此过滤器第一次初始化时执行 不是每次调用过滤器都执行它 对于简单的过滤器 可提供此方法的一个空体 但有两个原因需要使用init 首先 FilterConfig对象提供对servlet环境及web xml文件中指派的过滤器名的访问 因此 普遍的办法是利用init将FilterConfig对象存放在一个字段中 以便doFilter方法能够访问servlet环境或过滤器名 其次 FilterConfig对象具有一个getInitParameter方法 它能够访问部署描述符文件 web xml 中分配的过滤器初始化参数 doFilter publicvoiddoFilter ServletRequsetrequest ServletResponseresponse FilterChainchain thowsServletException IOException当调用一个过滤器时 就执行本方法 包含大部分过滤逻辑 第一个参数为与传入请求有关的ServletRequest 对于简单的过滤器 大多数过滤逻辑是基于这个对象的 如果处理HTTP请求 并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法 就要把此对象构造成HttpServletRequest doFilter 第二个参数为ServletResponse 除了在两个情形下要使用它以外 通常忽略这个参数 首先 如果希望完全阻塞对相关servlet或JSP页面的访问 可调用response getWriter并直接发送一个响应到客户机 其次 如果希望修改相关的servlet或JSP页面的输出 可把响应包含在一个收集所有发送到它的输出的对象中 然后 在调用serlvet或JSP页面后 过滤器可检查输出 如果合适就修改它 之后发送到客户机 最后一个参数为FilterChain对象 对此对象调用以激活与servlet或JSP页面相关的下一个过滤器 如果没有另一个相关的过滤器 则对doFilter的调用激活servlet或JSP本身 destroy publicvoiddestroy 大多数过滤器简单地为此方法提供一个空体 不过 可利用它来完成诸如关闭过滤器使用的文件或数据库连接池等清除任务 将过滤行为放入doFilter方法 doFilter方法为大多数过滤器的关键部分 每当调用一个过滤器时 都要执行doFilter 对于大多数过滤器来说 doFilter执行的步骤是基于传入信息的 因此 可能要利用作为doFilter的第一个参数提供的ServletRequest 这个对象常常构造为HttpServletRequest类型 以提供对该类的更特殊方法的访问 调用FilterChain对象的doFilter方法 Filter接口的doFilter方法以一个FilterChain对象作为它的第三个参数 在调用该对象的doFilter方法时 激活下一个相关的过滤器 这个过程一般持续到链中最后一个过滤器为止 在最后一个过滤器调用其FilterChain对象的doFilter方法时 激活servlet或页面自身 但是 链中的任意过滤器都可以通过不调用其FilterChain的doFilter方法中断这个过程 在这样的情况下 不再调用JSP页面的serlvet 并且中断此调用过程的过滤器负责将输出提供给客户机 对适当的servlet和JSP页面注册过滤器 部署描述符文件的2 3版本引入了两个用于过滤器的元素 分别是 filter和filter mapping filter元素向系统注册一个过滤对象filter mapping元素指定该过滤对象所应用的URL filter元素 filter元素位于部署描述符文件 web xml 的前部 所有filter mapping servlet或servlet mapping元素之前 filter元素具有如下六个可能的子元素 1 icon这是一个可选的元素 它声明IDE能够使用的一个图象文件 2 filter name这是一个必需的元素 它给过滤器分配一个选定的名字 3 display name这是一个可选的元素 它给出IDE使用的短名称 4 description这也是一个可选的元素 它给出IDE的信息 提供文本文档 5 filter class这是一个必需的元素 它指定过滤器实现类的完全限定名 6 init param这是一个可选的元素 它定义可利用FilterConfig的getInitParameter方法读取的初始化参数 单个过滤器元素可包含多个init param元素 filter元素的例子 请注意 过滤是在serlvet规范2 3版中初次引入的 因此 web xml文件必须使用DTD的2 3版本 MyFiltermyPackage FilterClass filter mapping元素 filter mapping元素位于web xml文件中filter元素之后serlvet元素之前 它包含三个可能的子元素filter name这个必需的元素必须与用filter元素声明时给予过滤器的名称相匹配 url pattern这个必需的元素 此元素声明一个以斜杠 开始的模式 它指定过滤器应用的URL 所有filter mapping元素中必须提供url pattern或servlet name 但不能对单个filter mapping元素提供多个url pattern元素项 如果希望过滤器适用于多个模式 可重复整个filter mapping元素 servlet name此元素给出一个名称 此名称必须与利用servlet元素给予servlet或JSP页面的名称相匹配 不能给单个filter mapping元素提供多个servlet name元素项 如果希望过滤器适合于多个servlet名 可重复这个filter mapping元素 filter mapping元素的例子 MyFiltermyPackage FilterClassMyFilter someDirectory SomePage jsp 禁用激活器servlet 在对资源应用过滤器时 可通过指定要应用过滤器的URL模式或servlet名来完成 如果提供servlet名 则此名称必须与web xml的servlet元素中给出的名称相匹配 如果使用应用到一个serlvet的URL模式 则此模式必须与利用web xml的元素servlet mapping指定的模式相匹配 防止用户利用缺省servletURL绕过过滤器设置 指定servlet名过滤 假如利用filter和filter mapping指示名为SomeFilter的过滤器应用到名为SomeServlet的servlet 则如下 SomeFiltersomePackage SomeFilterClassSomeFilterSomeServlet 指定serlvet的URL模式过滤 用servlet和servlet mapping规定URLhttp host webAppPrefix Blah应该调用SomeSerlvet 如下所示 SomeFiltersomePackage SomeFilterClassSomeFilter Blah Servlet过滤器对请求的过滤 A Servlet容器创建一个过滤器实例B 过滤器实例调用init方法 读取过滤器的初始化参数C 过滤器实例调用doFilter方法 根据初始化参数的值判断该请求是否合法D 如果该请求不合法则阻塞该请求E 如果该请求合法则调用chain doFilter方法将该请求向后续传递 Servlet过滤器对响应的过滤 A 过滤器截获客户端的请求B 重新封装ServletResponse 在封装后的ServletResponse中提供用户自定义的输出流C 将请求向后续传递D Web组件产生响应E 从封装后的ServletResponse中获取用户自定义的输出流F 将响应内容通过用户自定义的输出流写入到缓冲流G 在缓冲流中修改响应的内容后清空缓冲流 输出响应内容 过滤器的生命周期 1 启动服务器时加载过滤器的实例 并调用init 方法来初始化实例 2 每一次请求时都只调用方法doFilter 进行处理 3 停止服务器时调用destroy 方法 销毁实例 Servlet过滤器使用的注意事项 A 由于Filter FilterConfig FilterChain都是位于javax servlet包下 并非HTTP包所特有的 所以其中所用到的请求 响应对象ServletRequest ServletResponse在使用前都必须先转换成HttpServletRequest HttpServletResponse再进行下一步操B 在web xml中配置Servlet和Servlet过滤器 应该先声明过滤器元素 再声明Servlet元素 Servlet过滤器的例子 EncodingFilter java把用户的提交信息用GB2312进行重新编码 导入必要的类importjavax servlet FilterChain importjavax servlet ServletRequest importjavax servlet ServletResponse importjava io IOException importjavax servlet Filter importjavax servlet http HttpServletRequest importjavax servlet http HttpServletResponse importjavax servlet ServletException importjavax servlet FilterConfig publicclassEncodingFilterimplementsFilter privateStringtargetEncoding gb2312 protectedFilterConfigfilterConfig Servlet过滤器的例子 init 从部署描述符中读取encoding指定的编码方式 publicvoidinit FilterConfigconfig throwsServletException this filterConfig config line1this targetEncoding config getInitParameter encoding line2 Servlet过滤器的例子 doFilter 执行过滤操作 改变编码方式 publicvoiddoFilter ServletRequestsrequest ServletResponsesresponse FilterChainchain throwsIOException ServletException HttpServletRequestrequest HttpServletRequest srequest 把请求用指定的方式编码request setCharacterEncoding targetEncoding 把处理发送到下一个过滤器chain doFilter srequest sresponse Servlet过滤器的例子 destroy 销毁之前 释放资源 publicvoiddestroy this filterConfig null 相应的部署描述符 encodingEncodingFilterencodinggb2312encoding 2 5会话 会话和会话管理会话追踪机制会话编程实例 会话和会话管理 会话是指一个用户在客户端登录 为达到某个目的与服务器端进行多次交互 最后退出应用系统的全过程 会话管理是对用户会话全过程中涉及的会话状态保存与恢复 会话信息的采集与管理的一系列活动 会话机制 一个web容器必须支持HTTP协议会话HTTP是一种无状态的协议需要一种服务器端的机制 维持会话状态信息服务器使用一种类似于散列表的结构来保存信息 会话机制 是 否 类似散列表的会话管理 会话机制 会话追踪过程可划分为 客户端发送会话标识会话识别过程会话状态保存和获取会话标识发送给客户端 会话追踪机制 常用的会话追踪机制有 cookiesSSLSessionsURL重写表单隐藏 cookies HTTPcookies是最常用的会话跟踪机制 所有的servlet引擎都必须支持这种方法 原理 引擎把用户会话ID保存在cookie中 发送该cookie到客户端 客户端就会在以后的请求中把这个cookie返回给服务器 cookies IE的Cookie默认是保存在C DocumentsandSettings Cookies目录下的 扩展名为 txt 所以可以直接用记事本打开 第1行第2行第3行第4行第5行第6行第7行第8行第9行 Cookie名称 Cookie的值 Cookie所属站点的地址 标记值 过期时间的低位 过期时间的高位 创建时间的低位 创建时间的高位 总是为 Cookie记录分隔符 SSLSessions SSL 安全套接字层 是HTTPS协议采用的一种加密技术 内建了会话跟踪功能 从一个客户端来的多个请求允许用一个含糊的标识 而servlet引擎就用这个数据定义一个SessionHTTPS不是规范要求servlet必须支持的协议 URL重写 URL重写是最低性能的通用会话跟踪方法 当一个客户端不能接受cookie时 URL重写就会作为基本的会话跟踪方法URL重写把sessionid写入URL中 这样的URL会被引擎解析和某个session相关联 一个例子 表单隐藏 隐藏表单字段的方法 是利用HTML内hidden的属性 把客户端的信息 在用户不察觉的情形下 偷偷地随着请求一起传送给到服务器处理可以下列的方法来做隐藏表单字段的会话追踪 优点 session数据传送到服务器端时 并不象GET的方法 会将session数据保露在URL之上 缺点 用户直接观看HTML的源文件 session数据将会暴露无疑 Servlet的会话追踪机制 是基于Cookie或URL重写技术 融合了这两种技术的优点 当客户端允许使用Cookie时 内建session对象使用Cookie进行会话追踪如果客户端禁用Cookie 则选择使用URL重写 会话管理的范型 创建会话在会话中存储对象从会话中提取对象关闭会话 创建会话 ServletAPI规范定义了一个简单的HttpSession接口 通过它我们可以方便地实现会话跟踪在Servlet的请求处理程序中 调用HttpServletRequest的getSession 方法 如果有会话则返回当前会话 没有则创建一个新会话也可以调用getSession true 来执行同样的功能 或者调用getSession false 去访问一个现有的会话 而不是新创建一个会话 如果没有合法的会话则返回null HttpSessionsession request getSession true 存储和访问会话属性 HttpSession提供了存储和访问标准会话属性的方法 标准会话属性包括会话标识符 应用数据 创建时间 上次访问时间等 都以 名字 值 对的形式保存 HttpSession接口还提供了一种把对象存储到内存 在同一用户的后继请求中提取这些对象的标准办法 在会话中保存数据的方法setAttribute Strings Objecto 从会话提取原来所保存对象的方法getAttribute Strings 关闭会话 显式关闭HttpSession invalidate 方法来关闭它隐式关闭 会话超时 等待超时后的自动操作 默认的超时时间间隔是1800秒 在servlet容器将其设置为无效之前 servlet可以使用setInactiveInterval intseconds 方法在客户请求之间控制这个时间间隔 设置负值可以确保会话永远不会超时 session的常用方法 1 getAttribute 从session中获取以前存储的值2 getAttributeNames 返回session中所有属性的名称3 setAttribute 将键与值关联起来 存储进session4 removeAttribute 删除session中存储的对应键的值5 invalidate 删除整个session及其存储的键值6 logout 注销当前用户7 getId 获取每个session对应的唯一ID8 getCreationTime 获取session创建的时间9 getLastAccessedTime 获取session最后被访问的时间10 getMaxInactiveInterval 在用户没有访问的情况下 会话在被自动废弃之前应该保持多长时间 会话机制的例子 使用session的一个例子 拥有购物车的在线商店HttpSessionsession request getSession ShoppingCartcart synchronized session cart ShoppingCart session getAttribute shop if cart null cart newShoppingCart session setAttribute shop cart 获取或创建会话 检索名为 shop 的购物车 不存在则创建 并保存会话 2 6事件监听 在Servlet2 3以后规范中添加了一些监听web应用中重要事件的能力 这项功能可以让我们根据事件的状态更有效的对资源进行管理和自动化进行 servlet的事件监听 包含以下部分 事件的分类和Listener接口典型的事件监听过程事件监听的声明和调用事件监听编码和发布向导事件监听的方法和相关的类事件监听器事件类型和监听器接口监听器实例 事件的分类和Listener接口 Servlet事件有两个级别 Application级别事件 包含着运行应用程序的虚拟机级别的相关资源和状态 即和servlet的Context对象相关 Session级别的事件 包含着一个单一用户的session的一系列请求的相关资源和状态 即Http的Session对象 在上面两个级别的事件 又可分别分为两种 生命周期的改变属性的改变可以为上面四种事件创建一个或多个监听类 一个单一的监听类可以监视多种事件 事件的分类和Listener接口 创建一个事件类可以从javax servlet包或javax servlet http包中实现合适的接口 下表中列出了四种事件相关的接口 ServletContext事件 列出了Servlet上下文事件的类型 事件监听器类必须实现以响应每个Servlet上下文事件的接口 以及Servlet上下文事件发生时调用的方法 HTTP会话事件 事件监听器编程 实现上述四种类型的接口 一个或多个 创建不含任何参数的公共构造方法 例如 publicclassMyListenerimplements Listener 公共构造方法pub
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河南省洛阳市嵩县2024-2025学年七年级下学期期末历史试题(含答案)
- 2025年福建省泉州市第六中学九年级最后一考数学试题(含部分答案)
- 食品物流行业发展前景研究报告
- 《道德经》的智慧启示知到智慧树答案
- “大庆精神”主题非遗文化剪纸知到智慧树答案
- 2025年哈尔滨房屋租赁合同范本
- JT-T 1178.2-2019 营运货车安全技术条件 第2部分:牵引车辆与挂车 含2025年第1号修改单
- 汇川区建设安全知识培训课件
- 水质监测基础知识培训课件
- 建筑工程施工安全技术培训方案
- 助产专业介绍
- 2025年职业卫生培训试题及答案
- 新学期教学工作会议上校长讲话:把功夫下在课堂里把心思放在学生上把质量落到细节中
- GB/T 31717-2015病媒生物综合管理技术规范环境治理蚊虫
- GB/T 24267-2009建筑用阻燃密封胶
- 水利工程设计变更表格
- 上海交通大学学生生存手册
- 收益还原法课件
- 执业风险与棘手医患纠纷防范与处理
- 西藏民主改革60周年模板课件
- DBJ50∕T-342-2019 工程建设对既有建(构)筑物安全影响评估标准
评论
0/150
提交评论