JavaWeb——Servlet 过滤器(重点)、监听器

一、 JavaWeb过滤器Filter

1.1过滤器介绍

1.2 需要的依赖

连接数据库需要的依赖

<!--        链接数据库的依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>

1.3 编写过滤器

1.3.1 导入包继承接口

继承的接口:Filter
导入的包:javax.servlet.*

import javax.servlet.*;
import java.io.IOException;

/**
 * @author fuyaling
 * @create 2021-10-15-14:46
 */
public class FilterTest implements Filter {
}

1.3.2 重写方法:

  • 初始化方法 init()——web服务器一旦启动就会执行,等待过滤对象出现
  • 过滤:doFilter方法:方法中的所有代码,在过滤特定请求的时候都会执行
    必须让过滤器继续执行,否则程序会被拦停,即必须执行chain.doFilter()方法
  • 销毁方法destory()——web服务器关闭时会销毁过滤器

1.4 解决中文乱码

Servlet解决中文乱码

        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

Servlet解决乱码的话,需要写很多次上述代码

Filter解决乱码

ServletTest.java()

public class ServletTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //此处没有进行乱码处理,但是会通过过滤器处理
        resp.getWriter().write("过滤器学习");
    }

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

过滤器中的doFilter()

    /*
    * 1、过滤器中的所有代码,在过滤特定请求的时候都会执行
    * 2、必须要让过滤器继续执行(chain.doFilter())
    * */
    @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");

        System.out.println("Filter拦截乱码");
        //chain
        //这段程序的作用是让请求继续走,如果不写程序会在这里被拦截停止
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("程序继续执行");
    }

在web.xml中配置过滤器和servlet

<servlet>
  <servlet-name>servlet</servlet-name>
  <servlet-class>com.servlet.servlet.ServletTest</servlet-class>
</servlet>
  <servlet-mapping>
    <servlet-name>servlet</servlet-name>
    <url-pattern>/servlet</url-pattern>
  </servlet-mapping>
<filter>
  <filter-name>filter</filter-name>
  <filter-class>com.servlet.filter.FilterTest</filter-class>
</filter>
  <filter-mapping>
    <filter-name>filter</filter-name>
    <!--只要是/servlet下的任何请求都会经过这个过滤器-->
    <url-pattern>/servlet/*</url-pattern>
  </filter-mapping>

访问页面
在这里插入图片描述

二、 Javaweb监听器Listener

2.1 实例化接口如HttpSessionListener

监听当前网站在线人数

public class ListenerTest implements HttpSessionListener {

    //创建session监听
    //一旦创建Session就会触发此事件
    @Override
    public void sessionCreated(HttpSessionEvent se) {

        ServletContext context = se.getSession().getServletContext();
        Integer onlineCount = (Integer) context.getAttribute("onlineCount");
        if (onlineCount == null) {
            onlineCount = new Integer(1);
        } else {
            int count = (int) onlineCount;
            onlineCount = count+1;
        }
        context.setAttribute("onlineCount", onlineCount);
    }

    //销毁监听器
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext context = se.getSession().getServletContext();
        Integer onlineCount = (Integer) context.getAttribute("onlineCount");

        if (onlineCount == null) {
            onlineCount = 0;
        }else {
            int count = onlineCount.intValue();
            onlineCount = count-1;
        }
        context.setAttribute("onlineCount",onlineCount);
    }
}

2.2 注册监听器

<!--注册监听器-->
  <listener>
    <listener-class>com.servlet.listener.ListenerTest</listener-class>
  </listener>
  

2.3 在jsp页面中显示

<body>
<h1>当前在线人数:<%=this.getServletConfig().getServletContext().getAttribute("onlineCount")%></h1>
</body>

在这里插入图片描述

2.4 Gui中的监听器

public class ListenerForGUI  {
    public static void main(String[] args) {
        Frame frame1 = new Frame("frame1");
        Panel panel = new Panel(null);//面板
        frame1.setLayout(null);//窗体布局

        frame1.setBounds(300,300,500,500);
        frame1.setBackground(Color.BLUE);//

        frame1.add(panel);

        frame1.setVisible(true);

        //监听事件
        frame1.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值