2020-03-30

监听器的概述

1、什么是监听器监听器就是一个实现了特定接口的Java类,这个Java类用于监听另一个Java类的方法调用,或者属性的改变。当被监听对象发生上述事件后,监听器某个方法将会立即被执行

2、监听器的用途用来监听其他对象的变化的,主要应用在图形化界面的开发上例如Java中的GUI、Android等,都有大量的监听器的使用

3、监听器的术语事件源:指的是被监听对象(汽车)监听器:指的是监听的对象(报警器)事件源和监听器绑定:在汽车上安装报警器事件:指的是事件源对象的改变(踹了汽车一脚),主要功能是获得事件源对象

(二)监听器的入门

1、监听器的入门程序

2、监听器的执行过程

(三)Servlet中的监听器

一、Servlet中的监听器简介在Servlet中定义了多种类型的监听器,它们用于监听的事件源分别是ServletContext、HttpSession和ServletRequest这三个域对象

二、Servlet中的监听器的分类

1、一类:监听三个域对象的创建和销毁的监听器(三个)

2、二类:监听三个域对象的属性变更(属性添加、移除、替换)的监听器(三个)

3、三类:监听HttpSession中JavaBean的状态改变(钝化、活化、绑定、解除绑定)的监听(两个)

(四)ServletContextListener监听器的使用

一、ServletContextListener监听器的作用用来监听ServletContext域对象的创建和销毁的监听器

二、ServletContext创建和销毁

1、创建:在服务器启动的时候,为每个Web应用创建单独的ServletContext对象

2、销毁:在服务器关闭的时候,或者项目从Web服务器中移除的时候

三、ServletContextListener监听器的方法

1、监听ServletContext对象的创建contextInitialized(ServletContextEvent sce)

2

、监听ServletContext对象的销毁ontextDestroyed(ServletContextEvent sce)

四、编写监听器

1、监听器的代码

2、监听器的配置

五、ServletContextListener的企业用途

1、加载框架的配置文件Spring框架提供了一个核心监听器叫ContextLoaderListener

2、定时任务调度

(五)HttpSessionListener监听器的使用

一、HttpSessionListener监听器作用用来监听HttpSession对象的创建和销毁

二、HttpSession创建和销毁创建:服务器端第一次调用getSession()方法的时候销毁:非正常关闭服务器(正常关闭服务器Session会被序列化)Session过期(默认过期时间30分钟)手动调用session.invalidate()方法

三、HttpSessionListener监听器的方法

1、监听HttpSession对象创建sessionCreated(HttpSessionEvent se)

2、监听HttpSession对象销毁sessionDestroyed(HttpSessionEvent se)

四、编写监听器监听HttpSession对象创建和销毁

1、监听器的代码

2、监听器的配置

3、问题:访问HTML是否会创建Session?不会访问JSP是否会创建Session?会访问Servlet是否会创建Session?不会(默认没有调用getSession方法)

(六)ServletRequestListener监听器的使用

一、ServletRequestListener监听器的作用用于监听ServletRequest对象的创建和销毁

二、ServletRequest对象的创建和销毁创建:从客户端向服务器发送一次请求,服务器就会创建Request对象销毁:服务器对这次请求作出了响应之后,

Request对象就销毁了

三、ServletRequestListener监听器的方法

1、监听ServletRequest对象的创建requestInitialized(ServletRequestEvent sre)

2、监听ServletRequest对象的销毁requestDestroyed(ServletRequestEvent sre)

四、编写监听器代码

1、监听器代码在服务器启动的时候需要有一个初始值为零。当浏览器访问服务器上的某个JSP了,就会创建Session,此时获取初始值,进行+1操作。如果Session销毁了,获取该值进行-1操作

二、代码实现

1、创建ServletContextListener进行初始化

2、创建HttpSessionListener

3、配置监听器

4、创建JSP页面八)监听三个域对象的属性变更的监听器一、三类监听器

1、ServletContextAttributeListener监听ServletContext对象中的属性变更(属性添加、移除、替换)的监听器attributeAdded(ServletContextAttributeEvent event)attributeRemoved(ServletContextAttributeEvent event)attributeReplaced(ServletContextAttributeEvent event)

2、HttpSessionAttributeListener监听HttpSession对象中的属性变更(属性添加、移除、替换)的监听器attributeAdded(HttpSessionBindingEvent event)attributeRemoved(HttpSessionBindingEvent event)attributeReplaced(HttpSessionBindingEvent event)

3、ServletRequestAttributeListener监听ServletRequest对象中的属性变更(属性添加、移除、替换)的监听器attributeAdded(ServletRequestAttributeEvent srae)attributeRemoved(ServletRequestAttributeEvent srae)attributeReplaced(ServletRequestAttributeEvent srae)

二、演示第二类监听器

1、演示HttpSessionAttributeListener

2、配置监听器

3、编写测试的JSP

(九)监听HttpSession中Java类状态改变的监听器

一、第三类监听器概述

1、保存在Session域中的Java类可以有多种状态:绑定到Session中、从Session中解除绑定、随Session对象持久化到一个存储设备中(钝化)、随Session对象从一个存储设备中恢复(活化)

2、Servlet规范中中定义了两个特殊的监听的接口,来帮助Java类了解自己在Session域中的状态,分别是:HttpSessionBindingListener接口HttpSessionActivationListener接口实现了这两个接口的类,是不需要在web.xml中进行配置的

二、HttpSessionBindingListener监听器

1、监听Java类在HttpSession中的绑定和解除绑定的状态的监听器valueBound(HttpSessionBindingEvent event)valueUnbound(HttpSessionBindingEvent event)

2、测试代码

三、HttpSessionActivationListener监听器

1、监听HttpSession中Java类的钝化和活化的监听器sessionDidActivate(HttpSessionEvent se)sessionWillPassivate(HttpSessionEvent se)

2、测试代码

3、配置完成Session的序列化和反序列化Context标签可以配置在:Tomcat/conf/context.xml:所有Tomcat下虚拟主机和虚拟目录下的工程都会序列SessionTomcat/conf/Catalina  /local host/context.xml:只有local host虚拟主机下的所有项目会序列化Session工程/METAINF/context.xml:只有当前工程才会序列化Session

(十)Filter

一、Filter的概述

1、什么是FilterFilter称为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对Web服务器所管理的资源(JSP、Servlet、静态图片、静态html文件等)进行拦截,从而实现一些特殊的功能Filte就是过滤从客户端向服务器发送请求

2、为什么学习过滤器

二、Filter的入门

1、第一步:编写一个类实现Filter接口

2、第二步:对过滤器进行配置

三、FilterC hain对象的概述

1、什么是FilterC hainFilterC hain过滤器链:在一个Web应用中,可以开发编写多个Filter,这些Filter组合起来称为是一个过滤器链Web服务器根据Filter在web.xml文件中的注册顺序(mapping的配置顺序)决定先调用哪个Filter,依次调用后的过滤器,如果没有下一个过滤器,则调用目标资源

2、FilterC hain的演示

四、Filter的生命周期

1、Filter的生命周期描述Filter的创建和销毁是由web服务器负责。Web应用程序启动的时候,Web服务器创建Filter的实例对象,并调用其init方法进行初始化的操作

(Filter对象只会创建一次,init方法也只会执行一次)每次Filter进行拦截的时候,都会执行doFilter的方法当服务器关闭的时候,或者应用从服务器中移除的时候,服务器会销毁Filter对象

2、FilterCon  fig对象的概述

(1)FilterCon  fig对象的作用:用来获得Filter的相关的配置的对象

(2)FilterCon  fig对象的APIgetFilter Name()getInitParameter(String name)getInitParameterNames()getServletContext()

3、FilterCon  fig的演示

五、过滤器的相关配置

1、<url-pattern >的配置完全路径匹配:以/开始,例如/aaa/aaa/bbb目录匹配:以/开始,例如/*/aaa/*/aaa/bbb/*扩展名匹配:不能以/开始,以*开始,例如*.jsp *.do*.action

2、<servlet -name>的配置专门以Servlet的配置的名称拦截Servlet

3、<dispatc her>的配置默认的情况下,过滤器会拦截请求,如果进行转发(需要拦截这次转发)dispatc her的取值有四个REQUEST:默认值。默认过滤器拦截的就是请求FORWARD:转发INCLUDE:页面包含的时候进行拦ERROR:页面出现全局错误页面跳转的时候进行拦截(十一)权限验证过滤器

一、案例需求现在一个网站上需要有登录的功能,在登录成功后,重定向到后台的成功页面(后台的页面有很多)。如果现在没有登录,直接在地址栏上输入后页面地址编写一过滤器,可以对没有登录的用户进行拦截(没有登录,回到登录页面;如果已经登录,放行)二、案例登录功能

1、创建表(MySQL执行如下语句)create databaseweb05charset utf8;use web0

5;create table user(id int primarykey auto _increment,userna me varchar(20),password varchar(20))charset ut f8;insert into user values (null,'aaa','123');

2、搭建项目的环境

3、代码实现

三、权限验证的过滤器实现

(十二)通用的字符集编码过滤器的分析

一、案例需求假设网站需要向后台提交中文的数据(有可能是GET,也有可能是POST),中文处理根据不同的请求方式,处理的方式也是不同的需要调用request.getParameter() ;方法接收数据,但是这时存在乱码,如果想调用request.getParameter()方法,无是get还是post请求,提交的中文都没有乱码

二、增强一个类的方法

1、通过上面的分析,现在要增强request的getParameter方法,增强的过程要写在过滤器当中

(1)如何增强一个类中的方法?

1)继承必须要能够控制这个类的构造

2)装饰者被增强的类和增强的类需要实现相同的接口在增强的类中获得被增强的类的引用缺点:接口中的方法过多,会导致要重写很多其他的方法

3)动态代理类需要实现接口

三、通用的字符集编码过滤器的代码实现

1、过滤器的代码

2、增强类的代码

package com.good.domain;

public class User {

  private Integer id;

  private String username;

  private String password;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

}

package com.good.controller;

import java.io.IOException;

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 com.good.domain.User;

import com.good.model.UserModel;

/**

* Servlet implementation class UserServlet

*/

@WebServlet("/UserServlet")

public class UserServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

try {

String username = request.getParameter("username");

String password = request.getParameter("password");

User user = new User();

user.setUsername(username);

user.setPassword(password);

UserModel userModel = new UserModel();

User existUser = userModel.login(user);

if(existUser == null) {

request.setAttribute("msg", "用户名或密码错误");

request.getRequestDispatcher("/login.jsp").forward(request, response);

}else {

request.getSession().setAttribute("exisetUser", existUser);

response.sendRedirect(request.getContextPath() + "/jsp/success.jsp");

}

} catch (Exception e) {

e.printStackTrace();

}

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doGet(request, response);

}

}

package com.good.model;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;

import org.apache.commons.dbutils.handlers.BeanHandler;

import com.good.domain.User;

import com.good.utils.Utils;

/**

*

* @author 赵艺

*

*/

public class UserModel {

public User login(User user) throws SQLException {

QueryRunner queryRunner = new QueryRunner(Utils.getDataSource());

String sql = "select * from user where username=? and password=?";

User existUser = queryRunner.query(sql, new BeanHandler<User>(User.class),user.getUsername(),user.getPassword());

return existUser;

}

}

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

登录页面</h1>

<h3><font color="red">${ msg }</font></h3>

<form action="${ pageContext.request.contextPath }/UserServlet" method="post">

    <table border="1" width="400">

  <tr>

用户名</td>

      <td><input type="text" name="username"></td>

    </tr>

    <tr>

密码</td>

        <td><input type="password" name="password"></td>

        </tr>

        <tr>

</tr>

  </table>

</form>

</body>

</html>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

您已经登录程序!欢迎:${ existUser.username }</h1>

提交数据</a>

</body>

</html>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

<h1></h1>

<form action="${ pageContext.request.contextPath }/ServletDemo1" method="get">

姓名:<input type="text" name="name"><br>

</form>

<h1></h1>

<form action="${ pageContext.request.contextPath }/ServletDemo1" method="get">

姓名:<input type="text" name="name"><br>

</form>

</body>

package com.good.controller;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* Servlet implementation class ServletDemo1

*/

@WebServlet("/ServletDemo1")

public class ServletDemo1 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  String name = request.getParameter("name");

System.out.println("GET方式接收的名称:" + name);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String name = request.getParameter("name");

System.out.println("POST方式接收的名称:" + name);

}

}

package com.good.filter;

import java.io.UnsupportedEncodingException;

import javax.servlet.AsyncContext;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

public class MyHttpServletRequest extends HttpServletRequestWrapper{

    private HttpServletRequest request;

public MyHttpServletRequest(HttpServletRequest request) {

super(request);

this.request = request;

}

  @Override

public String getParameter(String name) {

      String method = request.getMethod();

      if("GET".equals(method)) {

      String value = super.getParameter(name);

      try {

//      value = new String(value.getBytes("ISO-8859-1"),"UTF-8");

      value = new String(value.getBytes("UTF-8"),"UTF-8");

      }catch(UnsupportedEncodingException e) {

      e.printStackTrace();

      }

      return value;

      }else if("POST".equals(method)) {

      try {

      request.setCharacterEncoding("UTF-8");

      }catch(UnsupportedEncodingException e) {

      e.printStackTrace();

      }

      }

  return super.getParameter(name);

}

}

package com.good.filter;

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.http.HttpServletRequest;

public class GenericEncodingFilter implements Filter{

@Override

public void destroy() {

// TODO Auto-generated method stub

}

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest) request;

    MyHttpServletRequest myReq = new MyHttpServletRequest(req);

    chain.doFilter(myReq, response);

}

@Override

public void init(FilterConfig filterConfig) throws ServletException {

// TODO Auto-generated method stub

}

}

package com.good.filter;

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.http.HttpServletRequest;

import com.good.domain.User;

public class MyPrivilegeFilter implements Filter{

@Override

public void destroy() {

// TODO Auto-generated method stub

}

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain Chain)

throws IOException, ServletException {

  HttpServletRequest req = (HttpServletRequest) request;

  User existUser = (User) req.getSession().getAttribute("existUser");

  if(existUser == null) {

req.setAttribute("msg", "您还没有登录!没有权限访问!");

  req.getRequestDispatcher("/login.jsp").forward(request, response);

  }else {

  Chain.doFilter(request,response);

  }

}

@Override

public void init(FilterConfig arg0) throws ServletException {

// TODO Auto-generated method stub

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容