一、过滤器
1、过滤器的实现
1)实现java.servlet.Fileter接口
2)重写方法
init():初始化,服务启动时加载,只加载一次
doFilter():过滤处理方法
destroy():销毁,服务关闭时销毁
2、过滤器链执行顺序
先配置先执行(请求时的执行顺序);响应时:以相反的顺序执行。
3、filter过滤器
1)在请求到达资源之前,拦截request请求
2)在响应到达客户端之前,拦截response响应
3)当访问资源时,如果设置了过滤器的路径,过滤器需要放行,否则请求无法到达资源
4)过滤器链:
顺序:请求的顺序是配置文件中的先后顺序,响应的顺序相反
过滤器链中,第一个过滤器如果没有放行,则无法到达下一个过滤器,资源也无法访问
原理:会拦截到请求的过滤器:第一个过滤器如果放行,会进入下一个过滤器,如果没有下一个过滤器,则进入指定资源
5)chain.doFilter(request,response);方法之前处理请求相关信息,方法之后处理响应相关信息
4、过滤器过滤Tomcat7和Tomcat8针对GET和POST请求乱码
package com.shsxt.filter; import java.io.IOException; import java.io.UnsupportedEncodingException; 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; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; public class EncodingFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { //http HttpServletRequest request=(HttpServletRequest)req; HttpServletResponse response=(HttpServletResponse)resp; //请求post request.setCharacterEncoding("UTF-8"); //响应 response.setContentType("text/html;charset=utf-8"); //得到请求方式get/post String method=request.getMethod(); //判断是post还是get请求 if ("GET".equals(method.toUpperCase())) { //获取服务器版本 String serverInfo=request.getServletContext().getServerInfo(); //判断服务器版本是Tomcat7还是Tomcat8 String versionStr=serverInfo.substring(serverInfo.indexOf("/")+1, serverInfo.indexOf("/")+2); if (Integer.parseInt(versionStr)<8) { MyEncoding myEncoding=new MyEncoding(request); HttpServletRequest request2=(HttpServletRequest)myEncoding; chain.doFilter(request2, response); return; } } chain.doFilter(request, response); //判断 } @Override public void destroy() { // TODO Auto-generated method stub } class MyEncoding extends HttpServletRequestWrapper{ HttpServletRequest request; public MyEncoding(HttpServletRequest request) { super(request); // TODO Auto-generated constructor stub this.request=request; } String value=""; @Override public String getParameter(String name) { try { value=new String(request.getParameter(name).getBytes("ISO-8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return value; } } }
二、监听器
监听器是一种servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,HTTPSession,ServletRequest的创建和销毁等。
1、实现
监听器有三类8种:
⑴监听生命周期:实现接口ServletRequestListener、HttpSessionListener、ServletContextListener
⑵监听值的变化:实现接口ServletRequestAttributeListener、HttpSessionAttributeListener、ServletContextAttributeListener
⑶针对session中的对象:监听session中的java对象(javaBean)是javaBean直接实现监听器的接口
2、servlet2.5 监听器配置
三、Servlet3.0注解
1、解释
@WebServlet,配置Servlet
@WebFilter,配置过滤器
@WebListener,注解监听器
@MultipartConfig,将一个Servlet标识为支持上传
Servlet3.0将mulipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。
2、通过注解,上传文件
如果是文件上传表单
1、必须设置enctype="multipart/form-data",设置MIME编码
2、请求方式为POST
3、文件域需要设置name属性值
使用注解@MultipartConfig 将一个 Servlet 标识为支持文件上传。
Servlet3.0 将 multipart/form-data 的 POST 请求封装成 Part,通过 Part 对上传的文件进行操作