中山做营销型网站公司,汕头网站开发,网站建设会议纪要,今天天津最新通告一、监听器Listener
1 Listener介绍
Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是#xff1a;Servlet 程 序、Listener 监听器、Filter 过滤器 Listener 是 JavaEE 的规范#xff0c;就是接口 监听器的作用是#xff0c;监听某种变化(一般就是对…一、监听器Listener
1 Listener介绍
Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是Servlet 程 序、Listener 监听器、Filter 过滤器 Listener 是 JavaEE 的规范就是接口 监听器的作用是监听某种变化(一般就是对象创建/销毁, 属性变化), 触发对应方法完成 相应的任务JavaWeb 中的监听器共八个, 目前最常用的是 ServletContextListener 2 ServletContextListener 监听器
2.1 作用 监听 ServletContext 创建或销毁 ( 当我们 Web 应用启动时 就会创建 ServletContext) 即生命周期监听应用场景 (1) 加载初始化的配置文件比如 spring 的配置文件 (2) 任务调 度配合定时器 Timer/TimerTask) 2.2 相关方法 2.3 应用实例
package com.hspedu.listener;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class HspServletContextListener implements ServletContextListener {/*1. 当一个类实现了ServletContextListener时该类就是一个监听器2. 该类可以监听的事件 由该类实现的监听接口决定3. 比如实现了ServletContextListener 则该类就可监听ServletContext对象的创建和销毁。以此类推4.HspServletContextListener就是一个监听者5.当web应用启动时就会产生一个ServletContextEvent的事件会调用监听器的对应事件处理方法6. contextInitialized同时会传递事件对象7. 程序员可以通过ServletContextEvent事件对象来获取需要的信息再进行业务处理8.tomcat怎么知道这个监听器的存在因为我们需要在web.xml配置*/Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {ServletContext servletContext servletContextEvent.getServletContext();System.out.println(监听到了servletContext被创建);}Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {ServletContext servletContext servletContextEvent.getServletContext();System.out.println(监听到了servletContext被销毁);}
}2.4 配置 web.xml 3 ServletContextAttributeListener 监听器
3.1 介绍 作用监听 ServletContext 属性变化 相关方法 3.2 案例 创建ServletContextAttributeListener
package com.hspedu.listener;import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;public class MyServletContextAttributeListener implements ServletContextAttributeListener {Overridepublic void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println(添加了 servletContext 属性名 servletContextAttributeEvent.getName() 属 性 值 servletContextAttributeEvent.getValue());}Overridepublic void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println(删除了 servletContext 属性名 servletContextAttributeEvent.getName() 属 性 值 servletContextAttributeEvent.getValue());}Overridepublic void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {//拿到的属性是修改之前的System.out.println(替换了 servletContext 属性名 servletContextAttributeEvent.getName() 属 性 值 servletContextAttributeEvent.getValue());}
}配置 web.xml 创建Servlet
package com.hspedu.servlet;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class HiServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//给ServletContext添加相关的属性ServletContext servletContext request.getServletContext();servletContext.setAttribute(name,linran);servletContext.setAttribute(name,lin);servletContext.removeAttribute(name);System.out.println(HoServlet 处理完毕);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}4 其它监听器
4.1 HttpSessionListener 监听器
作用监听 Session 创建或销毁即生命周期监听
相关方法 4.2 HttpSessionAttributeListener 监听器 作用监听 Session 属性的变化 相关方法 4.3 ServletRequestListener 监听器 作用监听 Request 属性变化 相关方法 4.4 ServletRequestListener 监听器
作用监听 Request 创建或销毁即 Request 生命周期监听
相关方法 可以用来监控, 某个 IP 访问我们网站的频率, 日志记录 ,访问资源的情况
二、过滤器 Filter
1 Filter 过滤器说明
1.1 为啥要过滤器 1.2 过滤器介绍
Filter 过滤器它是 JavaWeb 的三大组件之一(Servlet 程序、Listener 监听器、Filter 过滤器)Filter 过滤器是 JavaEE 的规范是接口 Filter 过滤器它的作用是拦截请求过滤响应。
1.3 应用场景 权限检查 日记操作 事务管理 2 Filter 过滤器基本原理 3 Filter 过滤器快速入门 3.1 需求 在 web 工程下有后台管理目录 manage 要求 该目录下所有资源 html 、图片、 jsp 、 Servlet 等用户登录后才能访问 3.2 login.jsp
%--User: LinranDate: 2024/4/2Time: 16:44Version: 1.0To change this template use File | Settings | File Templates.
--%
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle管理后台登录/title
/head
bodyh1管理后台登录/h1form action%request.getContextPath()%/loginCheckServlet methodpostu:input typetext nameusernamebrbrp:input typepassword namepasswordbrbrinput typesubmit value用户登录/form/body
/html3.3 LoginCLServlet
package com.hspedu.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class LoginCheckServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取用户名和密码//假设密码是123456就可以通过String usernamerequest.getParameter(username);String passwordrequest.getParameter(password);if(123456.equals(password)){//加入sessionHttpSession session request.getSession();session.setAttribute(username,username);session.setAttribute(password,password);request.getRequestDispatcher(/manage/admin.jsp).forward(request,response);}else {request.getRequestDispatcher(/login.jsp).forward(request,response);}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}3.4 admin.jsp
%--User: LinranDate: 2024/4/2Time: 16:48Version: 1.0To change this template use File | Settings | File Templates.
--%
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle后台管理/titlebase href%request.getContextPath()%/manage/
/head
bodyh1后台管理/h1a href# 用户列表/a||a href#添加用户/a||a href#删除用户/ahr
img src1.jpeg
/body
/html3.5 ManageFilter
package com.hspedu.filter;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class ManageFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {//当Tomcat 创建filter后会调用该方法进行初始化System.out.println(ManageFilter init 被调用.....);}Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//当每次调用该filter时dofilter就会被调用System.out.println(ManageFilter doFilter 被调用);//如果这里没有调用继续请求的方法则停止在这//如果继续访问目标资源//在调用过滤器之前request对象已经被创建并封装//所以这里就可以通过servletRequest来获取很多信息比如访问的url\session\数据HttpServletRequest httpServletRequest ((HttpServletRequest) servletRequest);HttpSession session httpServletRequest.getSession();//获取username session对象Object username session.getAttribute(username);if(username!null){//用户登录过直接放行filterChain.doFilter(servletRequest,servletResponse);//继续访问目标资源//servletRequest,servletResponse会传递给目标资源//}else {servletRequest.getRequestDispatcher(/login.jsp).forward(servletRequest,servletResponse);}}Overridepublic void destroy() {//当filter被销毁时就会调用该方法System.out.println(ManageFilter destroy 被调用);}
}3.6 web.xml
?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0!--filter一般写在最前面1. 我们可以发现filter配置和servlet是十分相似的filter也是被tomcat管理和维护的2. url-pattern就是当请求的url和匹配的时候就会调用该filter‘3. /manage/* 第一个/解析成http://ip:port/工程路径4完整的路径就是http://ip:port/工程路径/manage/* 当请求的资源url满足该条件时都会调用filter--filterfilter-nameManageFilter/filter-namefilter-classcom.hspedu.filter.ManageFilter/filter-class/filterfilter-mappingfilter-nameManageFilter/filter-nameurl-pattern/manage/*/url-pattern/filter-mappingservletservlet-nameLoginCheckServlet/servlet-nameservlet-classcom.hspedu.servlet.LoginCheckServlet/servlet-class/servletservlet-mappingservlet-nameLoginCheckServlet/servlet-nameurl-pattern/loginCheckServlet/url-pattern/servlet-mapping/web-app
4 Filter 过滤器 url-pattern url-pattern : Filter 的拦截路径, 即浏览器在请求什么位置的资源时过滤器会进行拦截过滤 精确匹配 url-pattern/a.jsp/url-pattern 对应的 请求地址 http://ip[域名]:port/工程路径/a.jsp 会拦截 目录匹配 url-pattern/manage/*/url-pattern对应的 请求地址 http://ip[域名]:port/工程路径/manage/xx , 即 web 工程 manage 目录下所有资源 会拦截 后缀名匹配 url-pattern*.jsp/url-pattern 后缀名可变比如 *.action *.do 等等对应的请求地址 http://ip[域名]:port/工程路径/xx.jsp , 后缀名为 .jsp 请求会拦截Filter 过滤器它只关心请求的地址是否匹配不关心请求的资源是否存在 5 Filter 过滤器生命周期 6 FilterConfig FilterConfig 是 Filter 过滤器的配置类 Tomcat 每次创建 Filter 的时候也会创建一个 FilterConfig 对象这里包含了 Filter 配置文件的配置信息。FilterConfig 对象作用是获取 filter 过滤器的配置内容
package com.hspedu.filter;import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;public class FilterConfig_ implements Filter {/*演示FilterConfig的使用*/Overridepublic void init(FilterConfig filterConfig) throws ServletException {//通过filterConfig获取相关参数String filterName filterConfig.getFilterName();System.out.println(filterNamefilterName);String ip filterConfig.getInitParameter(ip);System.out.println(ipip);ServletContext servletContext filterConfig.getServletContext();System.out.println(servletContextservletContext);EnumerationString initParameterNames filterConfig.getInitParameterNames();while (initParameterNames.hasMoreElements()){System.out.println(名字 :initParameterNames.nextElement());}}Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {}Overridepublic void destroy() {}
}web.xml
7 FilterChain 过滤器链 一句话 : FilterChain: 在处理某些复杂业务时一个过滤器不够可以设计多个过滤器 共同完成过滤任务形成过滤器链 7.1 AFilter
package com.hspedu.filter;import javax.servlet.*;
import java.io.IOException;public class AFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {System.out.println(AFilter doFilter()前置处理代码);chain.doFilter(req, resp);System.out.println(AFilter doFilter()后置处理代码);}public void init(FilterConfig config) throws ServletException {}}7.2 BFilter
package com.hspedu.filter;import javax.servlet.*;
import java.io.IOException;public class AFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {System.out.println(AFilter doFilter()前置处理代码);chain.doFilter(req, resp);System.out.println(AFilter doFilter()后置处理代码);}public void init(FilterConfig config) throws ServletException {}}7.3 hi.jsp
%--User: LinranDate: 2024/4/2Time: 20:14Version: 1.0To change this template use File | Settings | File Templates.
--%
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitlehi/title
/head
body
h1admin 目录下的 hi.jsp/h1
h1后台管理/h1
a href#用户列表/a||a href#添加用户/a||a href#删除用户/a
hr/
/body
/html7.4 web.xml 8 FilterChain 注意事项和细节
多个 filter 和目标资源在一次 http 请求在同一个线程中当一个请求 url 和 filter 的 url-pattern 匹配时, 才会被执行, 如果有多个匹配上就会顺序执行形成一个 filter 调用链(底层可以使用一个数据结构搞定多个 filter 共同执行时,因为是一次 http 请求, 使用同一个 request 对象 多个 filter 执行顺序和 web.xml 配置顺序保持一致. chain.doFilter(req, resp)方法 将执行下一个过滤器的 doFilter 方法, 如果后面没有过滤器则执行目标资源。 小结注意执行过滤器链时, 顺序是(用前面的案例分析) Http请求 - A 过滤器 dofilter() - A 过滤器前置代码 - A 过滤器 chain.doFilter() - B 过滤器 dofilter() - B 过滤器前置代 码 - B过滤器 chain.doFilter() - 目标文件 - B过滤器后置代码 - A过滤器后置代码 - 返回给浏览器页面/数据