监听器Listener、过滤器Filter、Servlet实现访问量(关闭服务器,访问量存在)

tech2022-09-03  111

监听器Listener

监听器是一个接口,主要是对三大对象进行监听:Request、Session、Appliaction(ServletRequest、HttpSession、ServletContext) 监听内容:1.监听对象域的创建和销毁、也就是生命周期的监听 2.监听域对象的创建、更新、移除, 3.监听被加入域对象的对象

创建一个监听器的方法:1.实现接口,不同的监听器,实现不同的接口,2.在xml里面注册监听器,

ServletRequest对象的生命周期监听,监听生命周期ServletRequestListener,属性监听:ServletRequestAttributeListener监听请求,

HttpSesson对象,监听生命周期:HttpSessionListener,属性监听HttpSessionAttributeListener,属性绑定监听:HttpSessionBinBingListener,对象钝化活化监听:HttpSessionActionListener

ServletContext对象,监听生命周期ServletContextListener,属性监听:ServletContextAttributeListener

案例1,创建一个ServletRequest监听器(使用注解的方法),

package com.ty.TestLisent; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/submit") public class Test extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter writer = resp.getWriter(); writer.write("<input type='text' name='username'><button>提交</button>"); } } package com.ty.TestLisent; import javax.servlet.ServletRequestAttributeEvent; import javax.servlet.ServletRequestAttributeListener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.annotation.WebListener; @WebListener public class TestServletRequest implements ServletRequestListener, ServletRequestAttributeListener { //请求结束时,触发的方法 @Override public void requestDestroyed(ServletRequestEvent servletRequestEvent) { System.out.println("请求结束,"); } //请求触发时,触发的方法 @Override public void requestInitialized(ServletRequestEvent servletRequestEvent) { System.out.println("请求开始。"); } //属性监听 //当程序向request方法内添加一个属性时触发 @Override public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) { System.out.println("添加了一个属性"); String name = servletRequestAttributeEvent.getName(); Object value = servletRequestAttributeEvent.getValue(); System.out.println("获得的名字是:"+name+"-------"+value); } //删除一个属性时触发 @Override public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) { System.out.println("删除了一个属性"); } //替换一个属性时触发 @Override public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) { System.out.println("替换了一个属性"); } }

过滤器Filter

作用:可以拦截请求(Request),拦截响应(Response),统计、放行,同意通过连接 创建Filter的方法:注册web.xml或者使用注解 常用方法: destory() filter的销毁方法, doFIlter(ServletRequest request,ServletResponse response,FilterChain chain) 每一个Request都会执行一次, init(FilterConfig filter)生命周期初始化, getFilterName(String name) getInitParameter(String name) getInitParameterNames() getServletContext()

过滤器案例:创建一个过滤器,过来所有请求 package com.ty.filter;

import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; //创建拦截器的两个方法:第一个注解,第二个在web.xml配置 //@WebFilter public class TestFilter implements Filter { //服务器开启 @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("服务器初始化"); } //设置满足过滤器条件的路径通过的方法 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("过滤器初始化"); } //销毁方法 @Override public void destroy() { System.out.println("过滤器被销毁"); } }

web.xml配置

<!--设置过滤器--> <filter> <filter-name>lf</filter-name><!--设置过滤器名称--> <filter-class>com.ty.filter.TestFilter</filter-class> </filter> <!--设置拦截请求--> <filter-mapping> <filter-name>lf</filter-name> <url-pattern>/*</url-pattern><!--/*指所有请求,比如*.on是以on结尾的都可以正常通过doFIlter过滤器方法--> </filter-mapping>

案例:结合之前登录的案例,创建一个过滤器,保证用户输入除登录页面之外的其他页面都拦截,防止用户有时候,随机输入,不小心输入对的网址,直接进入系统,同时过滤乱码。 package com.ty.filter;

import javax.servlet.*; import java.io.IOException; public class encoding implements Filter { private String ending1 = null; private String ending2 = null; @Override public void init(FilterConfig filterConfig) throws ServletException { ending1 = filterConfig.getInitParameter("ending1"); ending2 = filterConfig.getInitParameter("ending2"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding(ending1); servletResponse.setContentType(ending2); filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { System.out.println("中文乱码过滤器销毁"); } } <!--设置编码的过滤器--> <filter> <filter-name>EndingFilter</filter-name> <filter-class>com.jsp.Filter.Encoding</filter-class> <init-param> <filter-name>ending1</filter-name> <filter-value>utf-8</filter-value> </init-param> <init-param> <filter-name>ending2</filter-name> <filter-value>text/html;charset=utf-8</filter-value> </init-param> </filter> <filter-mapping> <filter-name>EndingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

Servlet实现访问量(关闭服务器,访问量存在)

package com.jsp.Servlet; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import java.io.*; /** * @description: * @author: taoying * @createDate: 2020/9/2 * @version: 1.0 */ @WebListener public class ServletListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { BufferedReader bufferedReader = null; try { bufferedReader = new BufferedReader(new FileReader("E:\\StudyServlet\\day4\\ServltJSP\\count.txt")); String num = bufferedReader.readLine().trim(); ServletContext application = servletContextEvent.getServletContext(); application.setAttribute("NUM",num); //存储数量 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { if (bufferedReader!=null){ try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { String num = (String) servletContextEvent.getServletContext().getAttribute("NUM"); System.out.println(num+"------------"); try { BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("E:\\StudyServlet\\day4\\ServltJSP\\count.txt")); //缓存流最好要执行下一步操作(将缓存区里面的数据写到文件里面去) bufferedWriter.write(num); bufferedWriter.flush(); bufferedWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } package com.jsp.Servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * @description: * @author: taoying * @createDate: 2020/9/2 * @version: 1.0 */ @WebServlet("/login1") public class login extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter writer = resp.getWriter(); String num = (String) req.getServletContext().getAttribute("NUM"); int sum = Integer.parseInt(num) + 1; //存储访问量 req.getServletContext().setAttribute("NUM",sum+""); writer.write("登录成功 访问量"+sum); } }
最新回复(0)