一、Listener监听器

Javaweb开荒中的监听器,是用以监听web常见对象 HttpServletRequest HttpSession
ServletContext

监听它们的创立与销毁、属性别变化化 以及session绑定javaBean

1、监听机制

  • 事件  正是二个政工
  • 事件源  爆发那么些业务的源流
  • 监听器  用于监听钦点的风云的指标
  • 登记监听 要想让监听器能够监听到事件爆发,必须对其开始展览挂号。

2、Javaweb开垦中常见监听器

2.1、监听域对象的创设与销毁

  • 监听ServletContext成立与销毁  ServletContextListener
  • 监听HttpSession创设与销毁  HttpSessionListener
  • 监听HttpServletRequest成立与销毁  ServletRequestListener

2.2、监听域对象的性格变化

  • 监听ServletContext属性别变化化  ServletContextAttributeListener
  • 监听HttpSession属性变化  HttpSessionAttributeListener
  • 监听HttpServletRequest属性别变化化  ServletRequestAttributeListener

2.3、监听session绑定javaBean

它是用来监听javaBean对象是还是不是绑定到了session域   HttpSessionBindingListener

它是用来监听javaBean对象的活化与钝化
 HttpSessionActivationListener

3、监听器的火速入门

至于创设多个监听器的步子

  1. 成立二个类,达成钦赐的监听器接口
  2. 重写接口中的方法
  3. 在web.xml文件中对监听器实行注册。
  4. ServletContext对象的创建与销毁

3.1、关于域对象创设与销毁的亲自去做

本条款的是在服务器运行时创造的,在服务器关闭时销毁的。

HttpSession对象的创导与销毁

HttpSession session=request.getSession();

Session销毁 的方法

  1. 默许超时  30秒钟
  2. 闭馆服务器
  3. invalidate()方法
  4. set马克斯InactiveInterval(int interval) 能够安装超时时间

标题:间接访问三个jsp页面时,是不是会创制session?

会成立,因为我们暗许景况下是足以在jsp页面中平素动用session内置对象的。

HttpServletRequest创造与销毁

Request对象是出殡和埋葬请求服务器就会创建它,当响应发生时,request对象就能够销毁。

3.2、演示了Request域对象中质量变化

在java的监听机制中,它的监听器中的方法都以有参数的,参数便是事件目的,而笔者辈得以经过事件目的直接获取事件源。

3.3、**演示session绑定javaBean**

1、javaBean对象活动感知被绑定到session中.

HttpSessionBindingListener 那一个接口是由javaBean落成的,并且不要求在web.xml文件中注册.

2、javabean对象足以活化或钝化到session中。

HttpSessionActivationListener若是javaBean达成了那几个接口,那么当大家例行关闭服务器时,session中的javaBean对象就可以被钝化到大家钦命的文书中。

眼看贰回在运转服务器,因为我们曾经将指标写入到文件中,那时就能够活动将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

1、如何能够将每二个创办的session全都保存起来?

咱俩能够做二个HttpSessionListener,当session对象创建时,就将以此session对象装入到一个凑合中.

将集合List<HttpSession>保存到ServletContext域中。

2、怎样能够看清session过期了?

在HttpSession中有贰个方法public long
getLastAccessed提姆e()

它能够得到session对象最后动用的时日,能够利用invalidate方法销毁。

ps(我们地点的操作要求利用任务调解成效.)在java中有贰个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的变化.是一种观看者方式。
事件源:三大域对象 ServletContext,HttpSession,ServletRequest

二、Filter

 

创制步骤

  1. 事件相关监听器的接口
  2. 在web.xml中做到注册,Web3.0中帮助表明(@WenListener)

二、Filter过滤器(重要)

Javaweb中的过滤器可以阻碍全部访问web财富的哀告或响应操作。

1.1、步骤:

  1. 开创二个类达成Filter接口
  2. 重写接口中方法  doFilter方法是确实过滤的。
  3. 在web.xml文件中配备

留神:在Filter的doFilter方法内要是未有试行chain.doFilter(request,response),那么财富是不会被访问到的。

监听的风浪

1.2、FilterChain

FilterChain 是 servlet
容器为开拓人士提供的靶子,它提供了对某一能源的已过滤请求调用链的视图。过滤器使用
FilterChain
调用链中的下一个过滤器,假如调用的过滤器是链中的末段贰个过滤器,则调用链末尾的财富。

难题:怎么着能够造成一个Filter链?

  只要四个Filter对同多个财富拓展拦阻就能够产生Filter链

难点:怎样鲜明Filter的实践种种?

  由<filter-mapping>来确定

先是类,对象开端化销毁监听

要完毕的接口

{@link javax.servlet.http.HttpSessionListener},
{@link javax.servlet.ServletContextListener},
{@link javax.servlet.ServletRequestListener}

ServletContext对象曾几何时制造和销毁

创立:服务器运维时候,服务器可认为各种WEB应用创设二个独自的ServletContext.
销毁:服务器关闭的时候,或许项目从服务器中移除.
用于监听指标创造的时候销毁的时候。常用来:伊始化工作,加载配置文件,定期任务调整。

HttpSession对象哪一天创造和销毁

开创:服务器第一遍调用getSession()方法的时候.

销毁
畸形关闭服务器(不奇怪关闭系列化到硬盘)
session过期了(默认30分钟)
session.invalidate()
当以和请求访问的是jsp才会活动成立session对象。

ServletRequest对象什么日期创建和销毁

创造:客户端向服务器发送请求的时候.
销毁:服务器为这一次请求作出了响应时候.

1.3、Filter生命周期

Servlet生命周期:

实例化 –》 初始化 –》 服务 –》 销毁

  • 1 当服务器运维,会创建Filter对象,并调用init方法,只调用一回.
  • 2
    当访问财富时,路线与Filter的阻碍路线匹配,会执行Filter中的doFilter方法,这么些方法是的确拦截操作的方法.
  • 3 当服务器关闭时,会调用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的布置对象,它能够完毕下列效能

  1. 获取Filtr名称
  2. 获得Filter伊始化参数
  3. 获取ServletContext对象。

图片 1

标题:怎么样在Filter中收获多个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>

全然相称   以”/demo1”发轫,不带有通配符*

目录相配   以”/”初始  以*结束

增添名相称  *.xxx  无法写成/*.xxx

过滤器Filter

她会在一组财富(静态,动态能源)后边执行,他得以让请求获得目的财富,也能够不让请求到达,过滤器有阻止请求的效用

2.<servlet-name>

它是对点名的servlet名称的servlet举行阻拦的。

生命周期

当服务器运转,会成立Filter对象,并调用init方法,只调用二回.
当访问资源时,路线与Filter的阻止路线相配,会奉行Filter中的doFilter方法,这么些艺术是的确拦截操作的方法.
当服务器关闭时,会调用Filter的destroy方法来展耗费毁操作.

3.<dispatcher>

能够取的值有  REQUEST  FO奇骏WA奥德赛D  E路虎极光RO奔驰G级  INCLUDE    依照跳转格局阻碍

它的功力是:当以什么样方法去访问web财富时,实行阻拦操作.

1.REQUEST
当是从浏览器直接待上访问能源,或是重定向到有个别财富时开始展览阻拦情势安顿的
它也是暗许值

2.FOCR-VWA昂CoraD 它描述的是呼吁转载的阻拦方式布署

3.ERubiconRO宝马7系假设指标财富是由此申明式非常管理体制调用时,那么该过滤器将被调用。除却,过滤器不会被调用。

4.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()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用 -->

 三、自动登入  (PS bean的属性名和数据Curry的字段名千万要一律哦 不然会emmm 十分的惨)

  1. 当用户登入成功后,判别是或不是勾选了机关登录,假设勾选了,就将用户名与密码长久化存储到cookie
  2. 做二个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.枚举值
来加载相关的能源文件,来开始展览中国和英国文转化

相关文章