JavaWeb-过滤器和监听器

过滤器

字符编码的问题:如果客户端跟服务端字符编码没有采用统一的格式就会出现乱码的现象,比如要利用Servlet在网页上输出内容,出现该现象就调用response对象的setCharacterEncoding方法,但是不可能在每一个Servlet中都调用该方法,太繁琐且会导致程序臃肿。

为此引入了过滤器,过滤器即过滤掉一些网页数据,有些垃圾数据如果一直在请求响应中存在就会占用网络资源。

生命周期

服务器启动--->服务器关闭

实现步骤

1.创建一个类实现Filter接口(导包不要导错了)

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20210528183707863.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEyMjAzNg==,size_16,color_FFFFFF,t_70#pic_center)

2.重写init、destroy、doFilter方法

3.在web.xml中配置Filter以及Filter-mapping

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.bin.Filter.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/servlet/show</url-pattern>
</filter-mapping>

Demo

解决中文乱码问题的过滤器

工程结构图

![在这里插入图片描述]( https://img-blog.csdnimg.cn/2021052818372055.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEyMjAzNg==,size_16,color_FFFFFF,t_70#pic_center)

在MyServlet中打印一个中文的字符串,此时肯定会出现乱码,为此编写一个过滤器MyFilter用于过滤,编写完后将MyServlet与MyFilter配置到web.xml配置文件中。

//MyServlet
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().println("你好世界");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}


//MyFilter
public class MyFilter  implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=UTF-8");
        
        //此句很重要,是传递请求的,如果没有该句,则就会止步于过滤器,无法响应到客户端
        filterChain.doFilter(servletRequest,servletResponse);
    }
    
}
<!--web.xml文件-->
<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.bin.Servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/servlet/show</url-pattern>
</servlet-mapping>


<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.bin.Filter.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/servlet/show</url-pattern>
</filter-mapping>

运行结果:

在这里插入图片描述

在这里插入图片描述

URL地址不同,访问/show并没有过滤器,访问servlet/show有过滤器介入了。

posted @ 2021-05-28 19:22  Code_Ice  阅读(70)  评论(0)    收藏  举报