一、Listener监听器
Javaweb开荒中的监听器,是用于监听web常见对象 HttpServletRequest HttpSession
ServletContext
监听它们的成立与销毁、属性别变化化 以及session绑定javaBean
一、监听机制
- 事件 就是2个业务
- 事件源 产生那么些业务的源头
- 监听器 用于监听钦点的风浪的目的
- 登记监听 要想让监听器可以监听到事件发生,必须对其进行挂号。
二、Javaweb开采中常见监听器
2.1、监听域对象的创立与销毁
- 监听ServletContext创立与销毁 ServletContextListener
- 监听HttpSession创立与销毁 HttpSessionListener
- 监听HttpServletRequest创立与销毁 ServletRequestListener
二.二、监听域对象的习性别变化化
- 监听ServletContext属性别变化化 ServletContextAttributeListener
- 监听HttpSession属性别变化化 HttpSessionAttributeListener
- 监听HttpServletRequest属性别变化化 ServletRequestAttributeListener
2.3、监听session绑定javaBean
它是用来监听javaBean对象是不是绑定到了session域 HttpSessionBindingListener
它是用来监听javaBean对象的活化与钝化
HttpSessionActivationListener
叁、监听器的高速入门
至于创制1个监听器的步调
- 成立贰个类,完成钦定的监听器接口
- 重写接口中的方法
- 在web.xml文件中对监听器实行登记。
- ServletContext对象的成立与销毁
三.一、关于域对象创立与销毁的示范
以此目标是在服务器运维时成立的,在服务器关闭时销毁的。
HttpSession对象的创办与销毁
HttpSession session=request.getSession();
Session销毁 的方法
- 暗中认可超时 2十5分钟
- 关门服务器
- invalidate()方法
- set马克斯InactiveInterval(int interval) 能够安装超时时间
主题素材:间接待上访问1个jsp页面时,是或不是会创造session?
会成立,因为我们暗中认可情状下是足以在jsp页面中直接选拔session内置对象的。
HttpServletRequest创造与销毁
Request对象是出殡和埋葬请求服务器就能成立它,当响应爆发时,request对象就能销毁。
三.二、演示了Request域对象中品质变化
在java的监听机制中,它的监听器中的方法都以有参数的,参数正是事件目的,而小编辈能够通过事件目标直接得到事件源。
3.3、**演示session绑定javaBean**
1、javaBean对象活动感知被绑定到session中.
HttpSessionBindingListener 那一个接口是由javaBean实现的,并且没有要求在web.xml文件中注册.
贰、javabean对象足以活化或钝化到session中。
HttpSessionActivationListener就算javaBean达成了这么些接口,那么当大家健康关闭服务器时,session中的javaBean对象就能被钝化到大家钦赐的公文中。
及时2遍在运行服务器,因为我们早就将对象写入到文件中,那时就能够活动将javaBean对象活化到session中。
大家还索要个context.xml文件来安顿钝化时存款和储蓄的文书
在meta-inf目录下创办一个context.xml文件
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="it315"/>
</Manager>
</Context>
监听器Listener
案例-定期销毁session
壹、如何能够将每三个创设的session全都保存起来?
作者们能够做叁个HttpSessionListener,当session对象成立时,就将以此session对象装入到八个聚聚焦.
将集合List<HttpSession>保存到ServletContext域中。
二、如何能够判明session过期了?
在HttpSession中有3个措施public long
getLastAccessedTime()
它能够取得session对象最后动用的时间,能够应用invalidate方法销毁。
ps(大家地点的操作必要动用义务调节作用.)在java中有1个Timer放大计时器类
package com.timer;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TestTimer {
public static void main(String[] args) {
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(new Date().toLocaleString());
}
}, 2000, 1000);
}
}
有关多个域对象得到
若果在Servlet中要赢得request,在格局上就有,request.getSession()
getServletContext();
设若大家有request对象了, request.getSession()
request.getSession().getServletCotnext();
public class MySessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent arg0) {
HttpSession session = arg0.getSession();
//得到application中的list集合
ServletContext application = session.getServletContext();
//得到session对象,并放入list集合
List<HttpSession> list =(List<HttpSession>) application.getAttribute("sessions");
list.add(session);
System.out.println("添加了"+session.getId());
}
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
}
}
次第在接纳时,必要思量并发难点,因为大家在web中,它一定是叁个拾贰线程的,那么大家的顺序对集中举办了增进,还有移除操作。具体在MyServletContextListener的方法中如下
public class MyServletContextListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
}
public void contextInitialized(ServletContextEvent arg0) {
//通過事件原對象得到事件源
ServletContext application = arg0.getServletContext();
//创建一个集合 存储所有session对象
final List<HttpSession> list = Collections.synchronizedList(new ArrayList<HttpSession>());
application.setAttribute("sessions", list);
//创建一个计时器对象
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("开始扫描");
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
HttpSession session = (HttpSession) iterator.next();
long l = System.currentTimeMillis() - session.getLastAccessedTime();
if(l > 5000){
System.out.println("session移除了"+session.getId());
session.invalidate();
iterator.remove();
}
}
}
}, 2000, 5000);
}
}
监听器概述
监听器就是贰个Java类用来监听别的的JavaBean的变化.是1种观望者方式。
事件源:三大域对象 ServletContext,HttpSession,ServletRequest
二、Filter
成立步骤
- 事件有关监听器的接口
- 在web.xml中成功登记,Web3.0中帮衬注脚(@WenListener)
二、Filter过滤器(重要)
Javaweb中的过滤器得以阻碍全体访问web能源的央求或响应操作。
1.1、步骤:
- 开创四个类达成Filter接口
- 重写接口中方法 doFilter方法是真正过滤的。
- 在web.xml文件中配置
小心:在Filter的doFilter方法内假若未有举办chain.doFilter(request,response),那么资源是不会被访问到的。
监听的风浪
1.2、FilterChain
FilterChain 是 servlet
容器为开采职员提供的靶子,它提供了对某一财富的已过滤请求调用链的视图。过滤器使用
FilterChain
调用链中的下2个过滤器,假设调用的过滤器是链中的最后一个过滤器,则调用链末尾的财富。
难点:怎么样能够造成3个Filter链?
只要三个Filter对同二个能源拓展阻拦就足以产生Filter链
难点:怎样分明Filter的进行种种?
由<filter-mapping>来确定
率先类,对象初叶化销毁监听
要促成的接口
{@link javax.servlet.http.HttpSessionListener},
{@link javax.servlet.ServletContextListener},
{@link javax.servlet.ServletRequestListener}
ServletContext对象曾几何时制造和销毁
创立:服务器运转时候,服务器可认为各种WEB应用创制2个独自的ServletContext.
销毁:服务器关闭的时候,只怕项目从服务器中移除.
用于监听目的创制的时候销毁的时候。常用于:发轫化专业,加载配置文件,定时职责调解。
HttpSession对象几时创造和销毁
开创:服务器第三次调用getSession()方法的时候.
销毁
畸形关闭服务器(不荒谬关闭类别化到硬盘)
session过期了(默认30分钟)
session.invalidate()
当以和伸手访问的是jsp才会活动创设session对象。
ServletRequest对象几时创制和销毁
创造:客户端向服务器发送请求的时候.
销毁:服务器为这一次请求作出了响应时候.
一.三、Filter生命周期
Servlet生命周期:
实例化 –》 初始化 –》 服务 –》 销毁
- 壹 当服务器运行,会创建Filter对象,并调用init方法,只调用2回.
- 2当访问能源时,路线与Filter的阻碍路线相称,会实践Filter中的doFilter方法,这么些格局是真的拦截操作的方法.
- 三 当服务器关闭时,会调用Filter的destroy方法来开始展览销毁操作.
其次类,对象的品质监听
一经实现的接口
{@link javax.servlet.http.HttpSessionAttributeListener},
{@link javax.servlet.ServletContextAttributeListener},
{@link javax.servlet.ServletRequestAttributeListener},
天性监听 setAttribute addAttribute removeAttribute.
1.4、FilterConfig
在Filter的init方法上有三个参数,类型就是FilterConfig.
FilterConfig它是Filter的安顿对象,它能够做到下列功用
- 获取Filtr名称
- 收获Filter初阶化参数
- 获取ServletContext对象。
标题:怎么着在Filter中收获1个FIlterConfig对象?
1 package com.itheima.filter;
2
3 import java.io.IOException;
4
5 import javax.servlet.Filter;
6 import javax.servlet.FilterChain;
7 import javax.servlet.FilterConfig;
8 import javax.servlet.ServletException;
9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11
12 public class MyFilterConfigTest implements Filter{
13
14 private FilterConfig filterConfig;
15
16 public void init(FilterConfig filterConfig) throws ServletException {
17 this.filterConfig = filterConfig;
18 }
19
20 public void doFilter(ServletRequest request, ServletResponse response,
21 FilterChain chain) throws IOException, ServletException {
22 //通过FilterConfig对象获取到配置文件中的初始化信息
23 String encoding = filterConfig.getInitParameter("encoding");
24 System.out.println(encoding);
25 request.setCharacterEncoding(encoding);
26 //放行
27 chain.doFilter(request, response);
28 }
29
30 public void destroy() {
31 // TODO Auto-generated method stub
32 }
33 }
如下 web.xml配置
<filter>
<filter-name>MyFilterConfigTest</filter-name>
<filter-class>com.itheima.filter.MyFilterConfigTest</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFilterConfigTest</filter-name>
<servlet-name>ServletDemo2</servlet-name>
</filter-mapping>
session的系列化反体系化,钝化和活化
session序列化
当服务器关闭后,tomcat的work的门类目录下会多出八个SESSIONS.ser(扩大名,连串化),
当服务重视启后,seesion对象又被读回到session域中
为此当客户端未有关闭时,即便服务珍视启,也能够经过sessionid找回session对象。
去掉session的序列化功效
在tomcat的conf/context.xml下参与一个成分
<Manager pathname="">
session的钝化和活化
在session未有收敛时期,过多session气势恢宏据为己有内部存款和储蓄器时,会将权且不挪窝的session存入硬盘中,当用户在session限时访问时再加载回来,这几个进度就是session的钝化和活化
<!-- 配置到context下表示全局激活seesion的钝化和活化功能,这个过程就是序列化到硬盘的过程-->
<!-- 也可以在项目下/meta-info创建一个context.xml,并添加属性 -->
<!-- maxIdleSwap最大不活动时间,单位分钟 如果session不使用就会序列化到硬盘.-->
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"/>
<!-- 配置存储目录,序列化到硬盘的文件存放的位置. ,存储方式sessionid.session-->
<Store className="org.apache.catalina.session.FileStore" driectory="mysession">
</Manager>
1.5、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>
至于其余配置
其三类,JavaBean感知监听
要贯彻的接口
HttpSessionBindingListener
HttpSessionActivationListener
监听HttpSession对象中的JavaBean的境况的更换.(绑定,解除绑定,钝化和活化)
那八个监听器相比特出,它是由javaBean来促成的,并且没有供给在web.xml文件中注册监听.
javaBean必须是体系化的.
为JavaBean实现HttpSessionBindingListener
功能:使javaBean对象在被绑定到会话或从会话中收回对它的绑定期收获通告
//该接口javaBean要实现下面的方法
//绑定时调用
@Override
public void valueBound(HttpSessionBindingEvent event) {
}
//解绑时调用
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
}
javaBean序列化HttpSessionActivationListener
作用:绑定到会话的靶子足以侦听通告它们会话将被钝化和对话将被激活的器皿事件,让Bean对象和session一齐系列化。
//实现下列方法,监听bean对象和session钝化和活化的情况。
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
}
@Override
public void sessionDidActivate(HttpSessionEvent se) {
}
1.<url-pattern>
统统相配 以”/demo壹”初阶,不包涵通配符*
目录相配 以”/”起首 以*结束
扩张名相称 *.xxx 不能够写成/*.xxx
过滤器Filter
他会在壹组能源(静态,动态财富)前边推行,他能够让请求获得目标能源,也能够不让请求达到,过滤器有阻拦请求的效劳
2.<servlet-name>
它是对点名的servlet名称的servlet举办拦截的。
生命周期
当服务器运行,会创制Filter对象,并调用init方法,只调用1遍.
当访问财富时,路线与Filter的阻止路线相称,会举行Filter中的doFilter方法,那么些措施是真的拦截操作的方法.
当服务器关闭时,会调用Filter的destroy方法来拓展销毁操作.
3.<dispatcher>
能够取的值有 REQUEST FOEnclaveWALANDD E景逸SUVROR INCLUDE 根据跳转情势阻挠
它的法力是:当以怎么着措施去做客web财富时,进行阻拦操作.
壹.REQUEST
当是从浏览器直接待上访问能源,或是重定向到有些能源时开始展览阻拦格局布署的
它也是私下认可值
2.FO揽胜极光WA路虎极光D 它讲述的是伸手转载的阻拦情势安插
三.EHummerH贰ROQashqai假使目的能源是由此注脚式分外管理机制调用时,那么该过滤器将被调用。除此而外,过滤器不会被调用。
肆.INCLUDE
要是目的财富是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除却,该过滤器不会被调用
陈设方式
布置方式web.xml中增添filter标签只怕web3.0中增加@WebFilter申明。
<!-- 关于servlet-name配置 -->
<!-- 在Filter中它的url-pattern配置项上有一个标签,它用于设置当前Filter拦截哪一个servlet。 -->
<servlet-name>
<!-- 请求方式过滤配置办法 -->
<dispatcher>REQUEST|FORWARD|INCLUDE|ERROR</dispatcher>
<!-- 可以配置多个该种标签 -->
<!-- REQUEST 当是从浏览器直接访问资源,或是重定向到某个资源时进行拦截方式配置的 它也是默认值 -->
<!-- FORWARD 它描述的是请求转发的拦截方式配置 -->
<!-- ERROR 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。 -->
<!-- INCLUDE 如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用 -->
3、自动登入 (PS bean的属性名和数据Curry的字段名千万要一如以后哦 不然会emmm 非常的惨)
- 当用户登入成功后,剖断是或不是勾选了机关登录,假诺勾选了,就将用户名与密码持久化存款和储蓄到cookie
- 做二个Filter,对须求活动登入的财富举办阻拦
首写要在签到Servlet中登入成功时把登入的消息保存在cookie里,并安装存活时间
if(null != user){
String autologin = request.getParameter("autologin");
Cookie cookie = new Cookie("user", user.getUsername()+"&"+user.getPassword());
cookie.setPath("/");
if(autologin != null){// on / null
cookie.setMaxAge(60*60*24*7);
}else{
cookie.setMaxAge(0);
}
response.addCookie(cookie);
request.getSession().setAttribute("user", user);
request.getRequestDispatcher("/home.jsp").forward(request, response);
}
然后装置好filter类 记住要在web.xml里面配备 如下 为 doFilter代码
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
//1、转换对象
HttpServletRequest req = (HttpServletRequest) arg0;
//2、处理业务
Cookie[] cookies = req.getCookies();
String username = "";
String password = "";
for (int i = 0;cookies!=null && i < cookies.length; i++) {
if("user".equals(cookies[i].getName())){
String value = cookies[i].getValue();
String[] values = value.split("&");
username = values[0];
password = values[1];
}
}
UserService us = new UserService();
User user = us.findUser(username, password);
if(user != null){
req.getSession().setAttribute("user", user);
}
//3、放行
arg2.doFilter(arg0, arg1);
}
七个过滤器的实行顺序
多连接器的意况下,是先进后出,拦截的顺序和xml中的filter-mapping中的地方顺序有关。存在叁个filterchain链,实施过滤器到终极壹和过滤器。
国际化
把和语言相关的装有字符串都写成变量。
关键类:Locale locale = Locale.枚举值
来加载相关的财富文件,来张开中国和英国文转化