-- 作者:admin
-- 发布时间:2009/4/10 21:43:01
-- 过滤器的基本使用方法
1、一个Filter的简单使用方法 Servlet为: package servlets;
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 Exec extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { doGet(request, response); }
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>Get</body></html>"); System.out.println("Executing Exec.doGet()"); } }
Filter为: package web;
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 MyFilter implements Filter { public void init(FilterConfig arg0) throws ServletException { }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Pre MyFilter.doFilter()"); chain.doFilter(request, response); System.out.println("Post MyFilter.doFilter()"); }
public void destroy() { }
}
web.xml为: <filter> <filter-name>myFilter</filter-name> <filter-class>web.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/Exec</url-pattern> </filter-mapping>
注意观察运行的输出,并尝试去除chain.doFilter(request, response)并观察效果
2、多个Filter的使用方法 增加Filter,为: package web;
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 YourFilter implements Filter { public void init(FilterConfig arg0) throws ServletException { }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Pre YourFilter.doFilter()"); chain.doFilter(request, response); System.out.println("Post YourFilter.doFilter()"); }
public void destroy() { }
}
增加web.xml为: <filter> <filter-name>yourFilter</filter-name> <filter-class>web.YourFilter</filter-class> </filter> <filter-mapping> <filter-name>yourFilter</filter-name> <url-pattern>/Exec</url-pattern> </filter-mapping>
观察输出次序(嵌套)
3、多个Servlet和Filter的复杂调用 增加Servlet为: package servlets;
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 AnotherExec extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { doGet(request, response); }
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>AnotherExec.doGet</body></html>"); System.out.println("Executing AnotherExec.doGet()"); } }
修改Exec,为: package servlets;
import java.io.IOException; import java.io.PrintWriter;
import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
public class Exec extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { doGet(request, response); }
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>Exec.doGet</body></html>"); System.out.println("Executing Exec.doGet()"); try { RequestDispatcher disp = request .getRequestDispatcher("/AnotherExec"); disp.forward(request, response); } catch (Exception e) { System.out.println(e.getMessage()); } } }
增加web.xml为: <filter> <filter-name>myFilter</filter-name> <filter-class>web.MyFilter</filter-class> </filter> <filter> <filter-name>yourFilter</filter-name> <filter-class>web.YourFilter</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/Exec</url-pattern> </filter-mapping> <filter-mapping> <filter-name>yourFilter</filter-name> <servlet-name>AnotherExec</servlet-name> <dispatcher>FORWARD</dispatcher> </filter-mapping>
可以直接请求AnotherExec和Exec,分别查看输出 也可以删除<dispatcher>FORWARD</dispatcher>观察请求AnotherExec的效果
4、应用 4、1 查看执行时间 Filter为: package web;
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; import javax.servlet.http.HttpServletRequest;
public class MyFilter implements Filter { private FilterConfig config; private String logPrefix;
public void init(FilterConfig config) throws ServletException { this.config = config; logPrefix = config.getInitParameter("Log Entry Prefix"); }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { long begin = System.currentTimeMillis(); chain.doFilter(request, response); long end = System.currentTimeMillis();
StringBuffer logMessage = new StringBuffer(); if (request instanceof HttpServletRequest) { logMessage = ((HttpServletRequest) request).getRequestURL(); } logMessage.append(": "); logMessage.append(end - begin); logMessage.append(" ms");
if (logPrefix != null) { logMessage.insert(0, logPrefix); } System.out.println(logMessage.toString()); config.getServletContext().log(logMessage.toString()); //localhost_log.XXXX-XX-XX.txt }
public void destroy() { config = null; logPrefix = null; }
}
增加web.xml为: <filter> <filter-name>myFilter</filter-name> <filter-class>web.MyFilter</filter-class> <init-param> <param-name>Log Entry Prefix</param-name> <param-value>Performance: </param-value> </init-param> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/Exec</url-pattern> </filter-mapping>
4、2 Error处理 Filter为: package web;
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 MyFilter implements Filter { public void init(FilterConfig arg0) throws ServletException { }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Pre MyFilter.doFilter()"); chain.doFilter(request, response); System.out.println("Post MyFilter.doFilter()"); }
public void destroy() { }
}
修改web.xml为: <filter> <filter-name>myFilter</filter-name> <filter-class>web.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/error.jsp</url-pattern> <dispatcher>ERROR</dispatcher> </filter-mapping> <error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page>
此时请求不存在资源时会发生过滤,但是如果请求存在资源,如果页面中有response.sendError(404,"出错了!"),那么该错误页面仍然会被调用,过滤器也会工作 如修改index.jsp文件为: <%@ page c%>
<html> <head> </head>
<body> <% response.sendError(404, "Error"); %> </body> </html>
此时不会postfilter,只有prefilter
[此贴子已经被作者于2010-12-12 10:56:57编辑过]
|