一、监听器
简介:
监听器属于java web中的三大组件之一
监听器用于监听内置对象创建 监听内置对象作用域的值 监听容器(spring)的初始化操作
分类:
监听内置对象的创建与销毁
监听内置对象的作用域的值
监听session中对象的绑定
监听内置对象的创建与销毁:
ServletContextListener
package com.qf.listenter;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/*@WebListener*/
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("创建");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("销毁");
}
}
ServletRequestListener
package com.qf.listenter;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
/*@WebListener*/
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("创建");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("销毁");
}
}
package com.qf.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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "servlet01",urlPatterns = "/servlet01")
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("发送了请求");
/*HttpSession session = req.getSession();
//手动销毁
session.invalidate();*/
}
}
HttpSessionListener
package com.qf.listenter;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/*@WebListener*/
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("销毁");
}
}
package com.qf.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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "servlet01",urlPatterns = "/servlet01")
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("发送了请求");
HttpSession session = req.getSession();
//手动销毁
session.invalidate();
}
}
监听内置对象作用域的值:
ServletContextAttributeListener
package com.qf.listenter;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;
/*@WebListener*/
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
System.out.println("执行了添加");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
System.out.println("执行了删除");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
System.out.println("执行了修改");
}
}
package com.qf.servlet;
import javax.servlet.ServletContext;
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;
@WebServlet(name = "servlet02",urlPatterns = "/servlet02")
public class Servlet02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = req.getServletContext();
servletContext.setAttribute("uname","班长");
servletContext.setAttribute("uname","肥男");
servletContext.removeAttribute("uname");
}
}
ServletRequestAttributeListener
package com.qf.listenter;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.annotation.WebListener;
/*@WebListener*/
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println(servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
System.out.println("执行了添加");
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println(servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
System.out.println("执行了删除");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {System.out.println(servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
System.out.println("执行了修改");
}
}
package com.qf.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;
@WebServlet(name = "servlet03",urlPatterns = "/servlet03")
public class Servlet03 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("uname","班长");
req.setAttribute("uname","肥男");
req.removeAttribute("uname");
}
}
HttpSessionAttributeListener
package com.qf.listenter;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/*@WebListener*/
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println(httpSessionBindingEvent.getSession().getAttribute("uname"));
System.out.println("执行了添加");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println(httpSessionBindingEvent.getSession().getAttribute("uname"));
System.out.println("执行了删除");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println(httpSessionBindingEvent.getSession().getAttribute("uname"));
System.out.println("执行了修改");
}
}
package com.qf.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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "servlet04",urlPatterns = "/servlet04")
public class Servlet04 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.setAttribute("uname","班长");
session.setAttribute("uname","肥男");
session.removeAttribute("uname");
}
}
监听session中对象的绑定:
package com.qf.entity;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class STest implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println(httpSessionBindingEvent.getSession().getAttribute("uname"));
System.out.println("绑定");
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println(httpSessionBindingEvent.getSession().getAttribute("uname"));
System.out.println("解绑");
}
}
package com.qf.servlet;
import com.qf.entity.STest;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "servlet05",urlPatterns = "/servlet05")
public class Servlet05 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
STest s = new STest();
HttpSession session = req.getSession();
session.setAttribute("STest",s);
session.removeAttribute("STest");
}
}
二、过滤器
简介:
开发中过滤器是对请求路径以及数据进行过滤
基本使用:
新建一个类 实现Filter接口
package com.qf.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {
//初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
//过滤方法
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("执行");
//放行
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("哈哈哈");
}
//销毁
@Override
public void destroy() {
}
}
使用注解配置过滤的路径
或者使用web.xml配置过滤路径
<filter>
<filter-name>myFilter</filter-name>
<filter-class>filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
执行流程:
案例:
代码:
jsp
<%--
Created by IntelliJ IDEA.
User: 86182
Date: 2022/9/7
Time: 13:38
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/servlet06" method="post">
<p style="color: red">
${msg}
</p>
<p>
用户名:<input type="text" name="uname">
</p>
<p>
密码:<input type="password" name="upwd">
</p>
<p>
<input type="submit" value="登录">
</p>
</form>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: 86182
Date: 2022/9/7
Time: 13:40
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>登录成功</h1>
</body>
</html>
servlet
package com.qf.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;
@WebServlet(name = "servlet06",urlPatterns = "/servlet06")
public class Servlet06 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取前端传递的参数
String uname = req.getParameter("uname");
String upwd = req.getParameter("upwd");
//验证登录
if ("admin".equals(uname)&&"123456".equals(upwd)){
//将用户名添加到sess作用域中
req.getSession().setAttribute("uname",uname);
//跳转到登录成功页面
resp.sendRedirect("success.jsp");
}else {
req.setAttribute("msg","登录失败");
req.getRequestDispatcher("login.jsp").forward(req,resp);
}
}
}
过滤器:
package com.qf.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter(urlPatterns = "/*")
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//获取请求路径
String uri = request.getRequestURI();
//判断路径中是否包含登录页面或者servlet06路径
if (uri.contains("login.jsp")||uri.contains("servlet06")){
//放行
filterChain.doFilter(servletRequest, servletResponse);
}else {
//获取session中的值
Object uname = request.getSession().getAttribute("uname");
//判断
if (uname==null||"".equals(uname)){
request.setAttribute("msg","非法登录");
request.getRequestDispatcher("login.jsp").forward(request,response);
}else {
//uname存在
//放行
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
@Override
public void destroy() {
}
}
修改tomcat默认访问的路径: