servlet一种分三种: ·简单servlet----之前学的都是简单servlet; ·过滤servlet ·监听servlet 通过过滤servlet进行编码过滤及登陆验证; 既然是一个servlet,之前是采用的继承HttpServlet类的形式完成,但是过滤其中使用的不再是HttpServlet, 而是接口; 如果想要完成一个过滤其开发的话,则首先必须让一个类实现Filter接口; Filter接口在:javax.servlet.Filter: 包含三个方法: ·destroy()--------进行销毁 ·doFilter(ServletRequest request,ServletResponse,response,FilterChain chain)---完成过滤 ·init(FilterConfig filterConfig)----进行初始化 回顾:如果是一个简单的servlet,则在使用的时候必须手工调用,例如在form表单的action之中编写路径; 但是过滤这种操作本身可是属于自动完成的; 1、创建一个SimpleFilter.java: package filter.lid.servlet; import java.io.*; import javax.servlet.*; public class SimpleFilter implements Filter{ public void init(FilterConfig filterConfig) throws ServletException{ //接受初始化的参数 String initParam=filterConfig.getInitParameter("ref"); System.out.println("**过滤器初始化,初始化参数="+initParam); } public void doFilter(ServletRequest request,ServletResponse res,FilterChain chain){ System.out.println("**执行doFilter()**"); } public void destroy(){ System.out.println("**过滤器销毁**"); } } 编译程序,看是否成功; 过滤器完成之后肯定也要进行配置的操作,配置之前先启动一下tomcat,看看没有过滤器时的操作; 在浏览器中输入:http://localhost/lid/此时可以正常的出现文件的列表; 2、下面增加配置: 记住在web.xml中先写过滤过滤servlet在写简单servlet; <filter> <filter-name>simplefilter</filter-name> <filter-class>filter.lid.servlet.SimpleFilter</filter-class> <init-param> <param-name>ref</param-name> <param-value>Hello yuj</param-value> </init-param> </filter> <filter-mapping> <filter-name>simplefilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 注意:此处配置的<url-pattern>/*</url-pattern>表示的是一个过滤器的过滤路径,现在既然是"/" 则表示的是对一个目录中的全部内容进行过滤; 过滤器不需要任何配置就可以在服务器启动的时候自动的完成初始化的操作。 此时在浏览器中输入:http://localhost/lid/后不能出现列表,并且此时执行了doFilter()方法; 当然销毁是在服务器在关闭的时候进行销毁的; FilterChain: ·FilterChain接口的主要作用是将用户的请求向下传递给其他的过滤器或者是Servlet: ·在FilterChain接口中依然定义了一个通用的doFilter()方法,这是因为在一个过滤器后面可能存在着 另外一个过滤器,也可能是请求的最终目标(servlet),这样就通过FilterChain,形成了一个 过滤链; package filter.lid.servlet; import java.io.*; import javax.servlet.*; public class SimpleFilter implements Filter{ public void init(FilterConfig filterConfig) throws ServletException{ //接受初始化的参数 String initParam=filterConfig.getInitParameter("ref"); System.out.println("**过滤器初始化,初始化参数="+initParam); } public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException{ System.out.println("**执行doFilter()**之前"); chain.doFilter(request,response); System.out.println("**执行doFilter()**之后"); } public void destroy(){ System.out.println("**过滤器销毁**"); try{ Thread.sleep(3000); } catch(Exception e){ } } } 过滤器其实是执行两次的,一次是: public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain); 第二次就是:chain.doFilter(request,response); 与servlet一样,过滤器本身也可以对多个路径执行过滤,例如: <filter-mapping> <filter-name>simplefilter</filter-name> <url-pattern>/jsp/admin/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>simplefilter</filter-name> <url-pattern>/js/*</url-pattern> </filter-mapping> 这样就会对jsp/admin下的和/js/*下的所有的都过滤, 过滤器中使用最频繁的两种操作:编码过滤,登陆验证; 对于编码可定是所有页面都要使用的,而且只要是页面都要编写:request.setCharacterEncoding()方法 进行编码的设置; 下面进行编码过滤: ·编写过滤器: package filter.lid.servlet; import java.io.*; import javax.servlet.*; public class EncodingFilter implements Filter{ private String charSet; public void init(FilterConfig filterConfig) throws ServletException{ this.charSet=filterConfig.getInitParameter("charset"); } public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException{ request.setCharacterEncoding(this.charSet); chain.doFilter(request,response); } public void destroy(){ } } ·配置过滤器: <filter> <filter-name>charsetfilter</filter-name> <filter-class>filter.lid.servlet.EncodingFilter</filter-class> <init-param> <param-name>charset</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>charsetfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 过滤器在web服务器启动的时候就会被加载并且会被初始化,并且在请求时会执行过滤(doFilter) ·input.html: <html> <body> <form action="input.jsp" method="post"> 请输入要显示的内容:<input type="text" name="info"> <input type="submit" value="显示"> </form> </body> <html> ·input.jsp: <%@ page contentType="text/html" pageEncoding="gbk"%> <html> <head><title>这是测试</title></head> <body> <% String str=request.getParameter("info"); out.println("<h3>"+str+"</h3>"); %> <h3></h3> </body> </html> 下面进行登录验证的操作: 至于登录验证也是一个很重要的内容,因为在很多情况下都需要session完成登录验证的操作,但是 如果每个页面都编写重复的session属性的判断,那么就变得相当复杂也不方便,所以可以对一些需要 限制的地方采用登陆验证操作; ·编写登陆验证的过滤器: package filter.lid.servlet; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class LoginFilter implements Filter{ private String charSet; public void init(FilterConfig filterConfig) throws ServletException{ } public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException{ //session 属于http协议的范畴,ServletRequest属于servlet范畴下的 HttpServletRequest req=(HttpServletRequest) request; HttpSession ses=req.getSession(); if(ses.getAttribute("username")!=null){ //已经登陆过了,则可以访问 chain.doFilter(request,response); } else{ request.getRequestDispatcher("login.jsp").forward(request,response); } } public void destroy(){ } } ·login.jsp: <%@ page contentType="text/html" pageEncoding="gbk"%> <html> <head><title>这是测试</title></head> <body> <form action="login.jsp" method="post"> 用户名:<input type="text" name="uname"/><br> 密 码:<input type="password" name="upass"/><br> <input type="submit" value="登陆"/> <input type="reset" value="重置"/> </form> <%//直接通过一个固定的用户名和密码 String name=request.getParameter("uname"); String password=request.getParameter("upass"); if(!(name==null||"".equals(name)||password==null||"".equals(password))){ if("lid".equals(name)&&"123".equals(password)){ //如果登陆成功,则设置session属性范围 session.setAttribute("username",name); response.setHeader("refresh","2;URL=welcome.jsp"); %> <h2>登陆成功,2秒后跳转到欢迎界面</h2> <h2>如果没有跳转,请按<a href="welcome.jsp">这里</a>!</h2> <% }else{ %> <h2>用户名或密码错误</h2> <% } } %> </body> </html> ·welcome.jsp: <%@ page contentType="text/html" pageEncoding="gbk"%> <html> <head><title>这是测试</title></head> <body> <h1>欢迎<%=session.getAttribute("username")%>光临本系统,</h1> </body> </html>