学习JavaWeb第十八天

学习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依然还能找回来,但是如果重新开启一个会话那么才会真正的消失。

使用示例:
第一组使用示例:

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版权协议,转载请附上原文出处链接和本声明。