监听器的概述
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、
2、
3、
一、案例需求现在一个网站上需要有登录的功能,在登录成功后,重定向到后台的成功页面(后台的页面有很多)。如果现在没有登录,直接在地址栏上输入后页面地址编写一过滤器,可以对没有登录的用户进行拦截(没有登录,回到登录页面;如果已经登录,放行)二、案例登录功能
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
return existUser;
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
登录页面
${ msg }
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
您已经登录程序!欢迎:${ existUser.username }
提交数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
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
}
}