学习JavaWeb第十八天
JavaWeb三大组件 sevlet 、listener 、Filter
监听器(Listener):负责监视作用域值的创建、销毁、添加、删除、修改等操作。
8大监听器:
- 第一组:负责监听ServletContext、Session、request作用域对象的创建与销毁。
- 3个
- ServletRequestListener 每次请求创建, 每次请求结束销毁对象
- HttpSessionListener
- session.invalidate()销毁 request.getSession创建
- ServletContextListener
- 最大的域对象,也是共享域
- 服务器创建,他创建,服务器销毁它销毁
- 第二组:负责监听ServletContext、Session、request值的变化(添加、修改值、移除值)3个
- ServletContextAttributeListener
- HttpSessionAttributeListener
- ServletRequestAttributeListener
- 注意点:attributeAdded( ) // 本方法 会先执行修改的方法,检查到为空 在执行该添加方法
- 使用步骤
- (1)写一个类
- (2)这个类实现一个接口
- (3)
使用:
- 写法1 web.xml里面进行配置
<listener>
<listener-class>com.offcn.listener.ReuqestListenerDemo</listener-class>
</listener>
写法2注解 @WebListener
- (4)执行操作
.
- 第三组:作用是监听java类和session的关系。
2个(监听当前某个对象是否在session中存在、对象的钝化与活化操作)- HttpSessionBindingListener接口:监听当前某个对象是否在session域中存在
- 特殊:这个监听器首先不需要在web.xml中配置。 而是配置到具体的某一个类中。
- HttpSessionActivationListener接口:这个监听是实现session的活化与钝化操作
- 钝化:随着服务器的关闭将session信息存储到本地硬盘。以文件(“SESSIONS.ser”)的形式存储在tomcat 的work 目录下
- 活化:将本地硬盘中session信息在此读取到内存中。
- 特殊,实现这个接口的同时必须同时实现 序列化 的接口(IO操作)。 implements Serializable
- 活化后session依然还能找回来,但是如果重新开启一个会话那么才会真正的消失。
- HttpSessionBindingListener接口:监听当前某个对象是否在session域中存在
使用示例:
第一组使用示例:
package com.ujiuye.demo1;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
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 javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* @作者: t c y
* @日期: 2019年11月20日
* @备注:
*/
@WebServlet("/ss")
@WebListener
public class ListenerDemo extends HttpServlet implements ServletRequestListener, HttpSessionListener,ServletContextListener{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("s", "ssssss");
HttpSession session = request.getSession();
session.setAttribute("a", "ssqqq");
session.setMaxInactiveInterval(10);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("容器启动");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("容器关闭");
}
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
se.getSession().setMaxInactiveInterval(30);
System.out.println("会话开始了");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("回话结束了");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// TODO Auto-generated method stub
System.out.println("request被销毁了");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
// TODO Auto-generated method stub
System.out.println("request被创建了");
}
}
第二组使用示例:
package com.ujiuye.demo1;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;
/**
* @author: t c y
* @date:2019年11月20日
* @Copyright:
*/
@WebServlet("/attributedemo")
@WebListener
public class AttributeListenerDemo extends HttpServlet
implements ServletRequestAttributeListener, ServletContextAttributeListener, HttpSessionAttributeListener {
/*
* 添加到request会触发本方法
*/
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
// 本方法 会先执行修改的方法,检查到为空 在执行该添加方法
System.out.println("添加到request会触发本方法");
}
/*
* 移除request域的值会触发本方法
*/
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
System.out.println("移除request域会触发本方法");
}
/*
* 修改request域中的值会触发本方法
* 在执行setsetAttribute的时候触发
*/
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
System.out.println("修改request域中的值会触发本方法");
}
/*
* 往session中添加内容 会触发本方法
*/
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("session中添加了新内容");
}
/*
* 往session域中删除会触发本方法
*/
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("session中内容被删除了");
}
/*
* 往session域中修改数据会触发本方法
*/
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("session对象中内容被修改了");
}
/*
* 往ServletContext中添加内容 会触发本方法
*/
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("ServletContext当中添加了元素");
}
/*
* 往ServletContext中删除内容 会触发本方法
*/
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("ServletContext当中删除了元素");
}
/*
* 往ServletContext中修改内容 会触发本方法
*/
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("ServletContext当中修改了元素");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
// 添加 既认为你是添加 还认为你是修改
/* req.setAttribute("msg", "提莫队长正在送命");
// 修改
req.setAttribute("msg", "打野你个*号b的告诉我你联系方式,我给你寄点土特产");
// 移除
req.removeAttribute("msg");*/
/* HttpSession session = req.getSession();
session.setAttribute("timo", "我是一个快乐的小题莫");
session.setAttribute("timo", "玩游戏快乐就完了");
session.removeAttribute("timo");*/
ServletContext context = getServletContext();
context.setAttribute("gailun", "人在塔下");
context.setAttribute("gailun", "放马过来把");
context.removeAttribute("gailun");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(req, resp);
}
}
第三组使用示例:
HttpSessionBindingListener
package com.offcn.entity;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class User implements HttpSessionBindingListener {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(int age, String name) {
super();
this.age = age;
this.name = name;
}
public User() {
super();
}
/*
* 当sesstion当中绑定了当前对象会触发
*/
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("session里面放入了user对象");
}
/*
* 当sesstion当中解绑了当前对象会触发
*/
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("session当中移除了user对象");
}
}
HttpSessionActivationListener:
/*
* 对象序列化:是指将对象持久化(永久的保持)到咱们的硬盘上
* 对象反序列化:是指将对象从硬盘中读取到内存上
*/
package com.offcn.entity;
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
public class Person implements Serializable,HttpSessionActivationListener{
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Person(String name, String address) {
super();
this.name = name;
this.address = address;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
/*
* 钝化
*/
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("我从内存中,被钝化到硬盘上了");
}
/*
* 活化
*/
@Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("我从硬盘上活化到内存中了");
}
}
过滤器(Filter):运行在服务器端的程序可以对我们的请求和响应进行过滤(拦截)
简介:
拦截示意图:

Filter生命周期
- init 在服务器启动的时候运行 只运行一次
- doFilter 每次请求都会执行一次 请求一次运行一次
- destroy web服务器停止的时候执行一次 只运行一次
访问路径设置:
- 完全匹配 /s1 /index.jsp 只作用某一个资源
- 目录匹配 /html/*、 /jsp / *
- 扩展名匹配 * . do
- 所有 /*
过滤请求类型:默认我们的过滤器不过滤请求转发
- FORWARD,//转发的
- INCLUDE,//包含在页面的
- REQUEST,//请求的
- ASYNC,//异步的
- ERROR;//出错的
- @WebFilter(urlPatterns = “/*”,dispatcherTypes= {DispatcherType.FORWARD,DispatcherType.REQUEST})
使用步骤:
- (1)写一个类
- (2)这个类实现一个或多个Filter接口
- (3)将filter注册到容器当中
- (4)指定我们拦截资源的路径
关于 filter怎么注册到容器
- 写法1、 web.xml里面进行配置
<!-- 将filter注册到容器当中
配置filter的拦截地址
/* 表示拦截一切资源 资源包括 jsp、servlet、css、js、img -->
<filter>
<filter-name>my3</filter-name>
<filter-class>com.offcn.filter.MyFilter_03</filter-class>
初始化值
<init-param>
<param-name>username</param-name>
<param-value>pgone</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>root</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>my3</filter-name>
配置拦截路径,这里是拦截所有
<url-pattern>/*</url-pattern>
注意点 默认拦截请求 但不拦截转发 若要拦截转发的,添加以下:
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
- 写法2 @WebFilter(filterName = “ABFilter”,urlPatterns = “/*”,dispatcherTypes= {DispatcherType.FORWARD,DispatcherType.REQUEST})
- urlPatterns :拦截的路径
- dispatcherTypes:拦截的请求类型(默认为拦截请求的,可以留空)
过滤器先后顺序问题:
- 1.注解配置:按照类名的字符串比较规则比较,值小的先执行
- 如: AFilter 和 BFilter,AFilter就先执行了。
- 2.web.xml配置: 谁定义在上边,谁先执行
使用示例
package com.ujiuye.loginDemo;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* @author: t c y
* @date:2019年11月20日
* @Copyright:
*/
//@WebFilter("/jsp/*")
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession();
String username = (String) session.getAttribute("username");
if (username != null) {
chain.doFilter(request, response);
} else {
session.setAttribute("msg", "你无权登录此页面!");
res.sendRedirect(req.getContextPath() + "/login.jsp");
}
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
版权声明:本文为weixin_44377696原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。