Servlet应用开发高级技术.ppt_第1页
Servlet应用开发高级技术.ppt_第2页
Servlet应用开发高级技术.ppt_第3页
Servlet应用开发高级技术.ppt_第4页
Servlet应用开发高级技术.ppt_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

第二讲:Servlet 高级编程 过滤/应用和会话事件(1),陈旺虎,Servlets高级编程,Servlet 过滤 概述 实例学习 Eclipse编写Servlet过滤 应用和会话事件 概述 Eclipse编写实现时间监听,Servlets高级编程,Servlet 过滤 概述 实例学习 Eclipse编写Servlet过滤 应用和会话事件 概述 Eclipse编写实现时间监听,学习目标,掌握过滤器(filters)的处理流程 了解实现Servlet过滤器的API和接口 掌握过滤器创建方法 实例学习,Servlet过滤器及其用途,过滤器(Filter) 在HttpServletRequest和 HttpServletResponse对象被传递给Servlet之前,对其进行必要的处理 过滤器的用途举例 记录到来的请求信息,以及其发起机器的IP地址 作为加密/解密的设备 用户的认证、数据的压缩和用户输入的验证等,Web应用中的Servlet Filters,Servlet filters可截取在 Web客户端和 Web资源之间进/出的HTTP消息 在一个HTTP请求到达一个Web资源(Servlet)之前,一个或多个filters可对其进行截取和修改 在一个Web资源使用一个请求转发器转发或者包含另一Web资源时,过滤器也可运行,Filters的典型应用,Servlet 过滤规范给出的典型应用: 认证filters 登录和审计filters 图像转换filters 数据压缩 filters 加密filters 触发资源访问事件的Filters 转换XML内容的XSLT filters 缓存filters,Filter的处理流程,响应,Filter链处理,Filters能够被配置成为一条过滤链 一个FilterChain对象描述该链 Filters可以通过内嵌的调用来激活 Servlet容器调用Filter链中第一个filter的doFilter()方法 类: 实现接口javax.servlet.Filter 参数: 请求,ServletRequest 响应,ServletResponse 过滤链,FilterChain,过滤链中的第一个filter调用doFilter(),并激活其中的下一个filter 类: javax.servlet.FilterChain 参数: 请求,ServletRequest 响应,ServletResponse 过滤链的最后一个入口是Web资源,Filter链处理,doFilter()嵌套调用,(1),(2),(3),Filter实现,创建一个类,实现接口 javax.servlet.Filter 实现方法: init() doFilter() destroy() 配置,Web.xml 定义filter, 映射该filter到 servlet, 如果一个filter在多个servlet上起作用,可以将该filter映射到一个URL pattern,使得满足该模式的所有请求将被过滤 例如:/*,Filter API简介,编写一个filter时,主要需要实现下面的三个接口(包javax.servlet中): Filter FilterConfig FilterChain,Filter 接口,javax.servlet.Filter是编写filter必须实现的接口 一个filter 的生命周期通过该接口的三个方法来体现: init, doFilter和destroy public void init(FilterConfig filterConfig) public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) public void destroy(),Init方法,一个filter在servlet容器调用其init方法时,开始其生命周期 Servlet容器只调用一次init方法,调用发生在容器完成该filter的实例化时 Servlet容器将通过FilterConfig对象,获取该filter的配置信息,doFilter,doFilter方法具体执行过滤过程 用户每次请求一个filter被映射到的Web资源(例如Servlet)时,Servlet容器将调用该filter的doFilter方法 调用doFilter时,Servlet容器将会传递一个 HttpServletRequest对象、 HttpServletResponse对象和 FilterChain对象 可以操纵前两个对象,例如:给HttpServletRequest请求增加一个属性( setAttribute) FilterChain对象被用于将控制传递到下一个资源 doFilter方法与Servlet的service方法类似,destroy,Servlet容器调用 destroy方法来通知该filter,将要被销毁,因此,该filter能够进行一些必要的处理操作。,FilterConfig接口,FilterConfig对象提供一个filter的配置信息 该对象允许获取ServletContext对象 向filter传递初始参数,该过程依赖于其部署描述中定义的初始参数 FilterConfig接口有四个方法: public String getFilterName() public String getInitParameter(String parameterName) public java.util.Enumeration getInitParameterNames() public ServletContext getServletContext(),FilterChain接口,FilterChain对象由Servlet容器传递给filter类的doFilter方法 FilterChain接口只有一个方法doFilter public void doFilter(HttpServletRequest request, HttpServletResponse response) 总是需要调用FilterChain接口的doFilter方法来将控制传递到下一个filter 如果仅使用一个filter, doFilter方法将控制传递到下一个资源,该资源可以是要进行过滤的servlet. 调用该方法失败,将使整个程序流程结束,实例:一个基本的Filter,该实例仅通过打印消息展示Filter的生命周期 说明:filter的doFilter方法调用FilterChain对象的doFilter方法,BasicFilter类,import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class BasicFilter implements Filter private FilterConfig filterConfig; public void init(FilterConfig filterConfig) throws ServletException System.out.println(“Filter initialized“); this.filterConfig = filterConfig; ,public void destroy() System.out.println(“Filter destroyed“); this.filterConfig = null; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException System.out.println(“doFilter“); chain.doFilter(request, response); ,实例:一个基本的Filter(续),为使上述filter工作,需要告诉Servlet容器,要过滤哪个或者哪些servlet。该过程通过在部署描述文件中使用和元素来完成 上述两个元素必须出现在任何和元素之前,部署描述, Basic Filter BasicFilter , Basic Filter FilteredServlet SessionLifeCycleEventDemo FilteredServlet FilteredServlet ,在多个Servlet上应用Filter,对每个servlet重复元素 例如:在FilteredServlet和FilteredServlet2上应用Filter的部署描述 Basic Filter FilteredServlet Basic Filter FilteredServlet2 ,使用URL模式映射Filter,将一个filter映射到一个URL模式,可使用部署描述文件中的 元素 作为一种替代方法,可使用/*使得该filter对所有的静态和动态资源起作用,例如:,实例 - LoggingFilter,一个简单的filter实例,将用户的IP地址写入日志文件 import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class LoggingFilter implements Filter private FilterConfig filterConfig = null; public void destroy() System.out.println(“Filter destroyed“); this.filterConfig = null; ,实例 - Logging Filter(续),public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException System.out.println(“doFilter“); / 记录用户IP ServletContext servletContext = filterConfig.getServletContext(); servletContex.log(request.getRemoteHost(); chain.doFilter(request, response); public void init(FilterConfig filterConfig) throws ServletException System.out.println(“Filter initialized“); this.filterConfig = filterConfig; ,LoggingFilter部署描述, Logging Filter LoggingFilter , Logging Filter FilteredServlet FilteredServlet FilteredServlet ,LoggingFilter作用的Servlet,import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class FilteredServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(“text/html“); PrintWriter out = response.getWriter(); out.println(“); out.println(“); out.println(“User Counter“); out.println(“); out.println(“); out.println(“IP:“ + request.getRemoteHost(); out.println(“); out.println(“); ,Filter 配置,可传递一些初始参数给一个filter, 这些参数在FilterConfig对象中,被传递给Filter接口的init方法 初始参数在部署描述中以元素定义,该元素是的子元素,实例:访问初始参数,下面的部署描述符描述了一个叫MyFilter的过滤器,有两个初始参数: adminPhone和 adminEmail. MyFilter MyFilter , adminPhone 0414789098 adminEmail ,实例:访问初始参数,可以访问AdminPhone和AdminEmail的值 ,使用doFilter方法:,实例:用户输入检查的过滤器,如果用户的输入不正确,通常需要发送一个错误消息,告诉用户需要正确的输入 如果输入不完全错误,例如,需要增加或者剪除空格,需要使用trim函数来校正输入数据 String firstName = request.getParameter(“firstName“); if (firstName != null) firstName = firstName.trim();,实例:用户输入检查的过滤器,可以编写过滤器来对每个参数执行trim函数,参数保存在HttpServletRequest对象中,trim要在参数被servlet接收前完成 可以改变参数的值,方法如下: 将修剪过的参数值作为属性,参数名作为属性名 然后,在servlet中,获取修剪后的输入属性,TrimFilter,import java.io.*; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import java.util.Enumeration; public class TrimFilter implements Filter private FilterConfig filterConfig = null; public void destroy() System.out.println(“Filter destroyed“); this.filterConfig = null; ,public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException System.out.println(“Filter“); Enumeration enum = request.getParameterNames(); while (enum.hasMoreElements() String parameterName = (String) enum.nextElement(); String parameterValue = request.getParameter(parameterName); request.setAttribute(parameterName, parameterValue.trim(); chain.doFilter(request, response); public void init(FilterConfig filterConfig) throws ServletException System.out.println(“Filter initialized“); this.filterConfig = filterConfig; ,servlet的功能: 发送一个HTML表单,该表单有四个输入框:firstName, lastName, userName, 和password,然后调用doGet方法 当doPost方法被调用时,显示用户输入 import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class TrimFilteredServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(“text/html“); PrintWriter out = response.getWriter(); out.println(“);,实例(续): 用户输入检查过滤器,out.println(“); out.println(“User Input Form“); out.println(“); out.println(“); out.println(“); out.println(“Please enter your details.“); out.println(“); out.println(“); out.println(“); out.println(“); out.println(“First Name:“); out.println(“); out.println(“); out.println(“); out.println(“Last Name:“); out.println(“); out.println(“); out.println(“);,out.println(“User Name:“); out.println(“); out.println(“); out.println(“); out.println(“Password:“); out.println(“); out.println(“); out.println(“); out.println(“); out.println(“); out.println(“); out.println(“); out.println(“); out.println(“); out.println(“); out.println(“); ,public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException String firstName = (String) request.getAttribute(“firstName“); String lastName = (String) request.getAttribute(“lastName“); String userName = (String) request.getAttribute(“userName“); String password = request.getParameter(“password“); response.setContentType(“text/html“); PrintWriter out = response.getWriter(); out.println(“); out.println(“); out.println(“Displaying Values“); out.println(“); out.println(“); out.println(“); out.println(“Here are your details.“); out.println(“);,out.println(“); out.println(“First Name:“); out.println(“ + firstName + “); out.println(“); out.println(“); out.println(“Last Name:“); out.println(“ + lastName + “); out.println(“); out.println(“); out.println(“User Name:“); out.println(“ + userName + “); out.println(“); out.println(“); out.println(“Password:“); out.println(“ + password + “); out.println(“); out.println(“); out.println(“); out.println(“); ,部署描述符, Trim Filter TrimFilter , Trim Filter TrimFilteredServlet TrimFilteredServlet TrimFilteredServlet ,运行结果初始,运行结果提交后,实例:过滤响应,可以过滤响应 例如:一个过滤器用于连接每个Servlet的header和footer,ResponseFilter类,import java.io.*; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import java.util.Enumeration; public class ResponseFilter implements Filter private FilterConfig filterConfig = null;,public void destroy() System.out.println(“Filter destroyed“); this.filterConfig = null; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException System.out.println(“doFilter“); PrintWriter out = response.getWriter(); /输出Header out.println(“); out.println(“); out.println(“); out.println(“Page header“); out.println(“); chain.doFilter(request, response); / 输出Footer,out.println(“); out.println(“Page footer“); out.println(“); out.println(“); out.println(“); public void init(FilterConfig filterConfig) throws ServletException System.out.println(“Filter initialized“); this.filterConfig = filterConfig; ,实例 过滤链,可以在一个资源上应用多个过滤器 ,例如:创建 UpperCaseFilter 、TrimFilter 和 DoublyFilteredServlet. UpperCaseFilter: import java.io.*; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import java.util.Enumeration; public class UpperCaseFilter implements Filter private FilterConfig filterConfig = null; public void destroy() System.out.println(“Filter destroyed“); this.filterConfig = null; ,public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException System.out.println(“Filter“); Enumeration enum = request.getAttributeNames(); while (enum.hasMoreElements() String attributeName = (String) enum.nextElement(); String attributeValue = (String) request.getAttribute(attributeName); request.setAttribute(attributeName, attributeValue.toUpperCase(); chain.doFilter(request, response); public void init(FilterConfig filterConfig) throws ServletException System.out.println(“Filter initialized“); this.filterConfig = filterConfig; ,DoublyFilteredServlet,import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class DoublyFilteredServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(“text/html“); PrintWriter out = response.getWriter(); out.println(“); out.println(“); out.println(“User Input Form“); out.println(“); out.println(“); out.println(“);,out.println(“Please enter your details.“); out.println(“); out.println(“); out.println(“); out.println(“); out.println(“First Name:“); out.println(“); out.println(“); out.println(“); out.println(“Last Name:“); out.println(“); out.println(“); out.println(“); out.println(“User Name:“); out.println(“); out.println(“); out.println(“); out.println(“Password:“); out.println(“);,out.println(“); out.println(“); out.println(“); out.println(“); out.println(“); out.println(“); out.println(“); out.println(“); out.println(“); out.println(“); public void doPost

温馨提示

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

评论

0/150

提交评论