Listener介绍
监听器介绍
- 什么是监听器
- Javaweb中的监听器是用于监听web常见对象HttpServletRequest,HttpSession,ServletContext
- 监听器的作用
1.监听web对象创建与销毁.
2.监听web对象的属性变化
3.监听session绑定javaBean操作. - 监听机制相关概念
1.事件----一件事情
2.事件源—产生这件事情的源头
3.注册监听—将监听器与事件绑定,当事件产生时,监听器可以知道,并进行处理。
4.监听器—对某件事情进行处理监听的一个对象
web监听器介绍
- javaweb监听器介绍
- 监听web对象创建与销毁的监听器
- ServletContextListener
- HttpSessionListener
- ServletRequestListener
- 监听web对象属性变化
- ServletContextAttributeListener
- HttpSessionAttributeListener
- ServletRequestAttributeListener
- 监听session绑定javaBean
- HttpSessionBindingListener
- HttpSessionActivationListener
- 监听web对象创建与销毁的监听器
- javaweb监听器创建步骤
- 创建一个类,实现指定的监听器接口
- 重写接口中的方法.
- 在web.xml文件中配置监听
- 演示监听对象创建与销毁
- ServletContext对象的创建与销毁监听
ServletContext对象的创建与销毁分析:ServletContext对象是服务器开启时创建。服务器关闭时销毁。 - HttpSession对象的创建与销毁监听
- HttpSession对象的创建与销毁分析:
- session对象创建:取决于请求中是否有jsessinid,如果有,可能会获取一个已经存在的session对象。如果没有,会创建一个新的session对象.
- 销毁session:
1.默认超时 30分钟
2.关闭服务器
3.invalidate()方法
4.setMaxInactiveInterval(int interval) 可以设置超时时间
- HttpSession对象的创建与销毁分析:
- ServletContext对象的创建与销毁监听
- HttpServletRequest对象的创建与销毁监听
- HttpServletRequest对象的创建与销毁分析:request对象是发送请求时创建,当响应产生时,销毁.
- 监听步骤:
- 创建一个类,实现指定的监听器接口
- 重写接口中的方法
- 在web.xml文件中对监听器进行注册。
Filter介绍
- Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。
例子:自动登录 - 创建步骤:
- 创建一个类实现Filter接口
- 重写接口中方法 doFilter方法是真正过滤的。
- 在web.xml文件中配置
- 注意:在Filter的doFilter方法内如果没有执行chain.doFilter(request,response)
那么资源是不会被访问到的。
代码:
myfilter.java
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("拦截开始");
//放行
chain.doFilter(request, response);
System.out.println("拦截结束");
}
web.xml
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.itheima.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-
FilterChain对象
- FilterChain 是 servlet 容器为开发人员提供的对象,它提供了对某一资源的已过滤请求调用链的视图。过滤器使用 FilterChain 调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源。
- 只要多个Filter对同一个资源进行拦截就可以形成Filter链
- 由
<filter-mapping>
来确定Filter的执行顺序
-
Filter生命周期
实例化–》初始化–》服务–》销毁- 当服务器启动,会创建Filter对象(实例化),并调用init方法(初始化),只调用一次.
- 当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法(服务),这个方法是真正拦截操作的方法.
- 当服务器关闭时,会调用Filter的destroy方法来进行销毁操作(销毁)
-
FilterConfig
在Filter的init方法上有一个参数,类型就是FilterConfig.
FilterConfig它是Filter的配置对象,它可以完成下列功能
1. 获取Filtr名称
2. 获取Filter初始化参数
3. 获取ServletContext对象 -
Filter配置
- 基本配置
<filter> <filter-name>filter名称</filter-name> <filter-class>Filter类的包名.类名</filter-class> </filter> <filter-mapping> <filter-name>filter名称</filter-name> <url-pattern>路径</url-pattern> </filter-mapping>
- 关于其它配置
<url-pattern>
完全匹配 以”/demo1”开始,不包含通配符*
目录匹配 以”/”开始 以*结束
扩展名匹配 .xxx 不能写成/.xxx<servlet-name>
它是对指定的servlet名称的servlet进行拦截的。<dispatcher>
可以取的值有 REQUEST FORWARD ERROR INCLUDE
它的作用是:当以什么方式去访问web资源时,进行拦截操作.- REQUEST 当是从浏览器直接访问资源,或是重定向到某个资源时进行拦截方式配置的 它也是默认值
- FORWARD 它描述的是请求转发的拦截方式配置
- ERROR 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
- INCLUDE 如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用
案例:自动登录
- 数据库
CREATE DATABASE day17
USE day17
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(100),
PASSWORD VARCHAR(100)
)
INSERT INTO USER VALUES(NULL,’’,’’);
2.login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${msg }
<form action="${pageContext.request.contextPath }/servlet/loginServlet" method="post">
用户:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
<input type="checkbox" name="autologin"/>自动登录<br/>
<input type="submit" value="登录"/><br/>
</form>
</body>
</html>
home.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
欢迎:${user.username }
</body>
</html>
AutoLoginFilter.java
public class AutoLoginFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 1、转换两个对象HttpServletRequest,HttpServletResponse
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String uri = req.getRequestURI();// /day17_02_autologin/login.jsp
String path = req.getContextPath();// /day17_02_autologin
path = uri.substring(path.length()); // /login.jsp
//如果请求的资源不是login.jsp,也不是/servlet/loginServlet,才往下执行
if (!("/login.jsp".equals(path) || "/servlet/loginServlet".equals(path))) {
User user = (User) req.getSession().getAttribute("user");
//如果session得到了user对象,说明已经登录过或自动登录过。
//那么请求下一个资源时就不用执行自动登录了。
//用户没有登录过,我们才执行自动登录
if (user == null) {
System.out.println("aaaaaaaaaaaaaaa");
// 2、处理业务
// 得到cookies数组
Cookie[] cookies = req.getCookies();
String username = "";
String password = "";
// 从数组中找到想要的user对象的信息
for (int i = 0; cookies != null && i < cookies.length; i++) {
if ("user".equals(cookies[i].getName())) {
String value = cookies[i].getValue();// tom&123
String[] values = value.split("&");
username = values[0];
password = values[1];
}
}
// 登录操作
UserService us = new UserService();
User u = us.findUser(username, password);
// 如果登录成功,把用户信息存到session中
if (u != null) {
req.getSession().setAttribute("user", u);
}
}
}
// 3、放行
chain.doFilter(request, response);
}
public void destroy() {
// TODO Auto-generated method stub
}
}
LoginServlet.java
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取表单信息
String username = request.getParameter("username");
String password = request.getParameter("password");
//调用业务
UserService us = new UserService();
User user = us.findUser(username,password);
if(user!=null){
String autologin = request.getParameter("autologin");
Cookie cookie = new Cookie("user", user.getUsername()+"&"+user.getPassword());
cookie.setPath("/");
if(autologin!=null){//要把用户信息保存到cookie中
cookie.setMaxAge(60*60*24*7);
}else{//要清除cookie对象的数据
cookie.setMaxAge(0);
}
response.addCookie(cookie);//把cookie对象保存到客户端
request.getSession().setAttribute("user", user);
request.getRequestDispatcher("/home.jsp").forward(request, response);
}else{
request.setAttribute("msg", "用户名或密码错误,请重新登录!");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
//分发转向
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
UserService.java
public class UserService {
UserDao userDao = new UserDao();
public User findUser(String username, String password) {
try {
return userDao.findUser(username,password);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
UserDao.java
public class UserDao {
public User findUser(String username, String password) throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
return qr.query("select * from user where username=? and password = ?", new BeanHandler<User>(User.class),username,password);
}
}
User.java
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int 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;
}
}