JavaWeb-过滤器与监听器

本文介绍了JavaWeb中的过滤器,主要针对字符编码问题。当客户端和服务端字符编码不统一时,可能出现乱码。过滤器可以避免在每个Servlet中重复设置编码,简化代码并节省资源。过滤器的生命周期从服务器启动到关闭。实现过滤器需实现Filter接口,重写init、destroy和doFilter方法,并在web.xml中配置。文中提供了一个解决中文乱码问题的过滤器Demo,通过配置过滤器,使得访问/servlet/show的URL可以正确处理中文。
摘要由CSDN通过智能技术生成

过滤器

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

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

生命周期

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

实现步骤

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

在这里插入图片描述

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

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

工程结构图

在这里插入图片描述

在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有过滤器介入了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值