Servlet生命周期事件以及事件

来源:互联网 发布:淘宝群怎么能快速拉人 编辑:程序博客网 时间:2024/05/21 06:57

这是Servlet2.3版本后新增的功能

 1. 能够在不修改原有的Servlet基础上,监听程序中Servlet各个对象:    ServletContext、HttpSession、HttpServletRequest中的存储    数据的变化。 2. 可以监听客户端的请求,服务端的操作。 组成部分:事件模型和监听器两部分。 事件是java中的一个重要的概念,指某个代码运行过程中的一个状态,如:HttpSession创建,属性值的改变等都可以用事件来描述。 事件源:比如事件是通过点击按钮触发的,那么这个按钮就是事件源 在事件源上又有动作,这些动作触发的事件就叫做回调。 所有事件的父接口都是 java.util.EventListener,这只是个象征 性的接口。 各类事件对应的监听器接口 Context生命周期        建立与关闭           Javax.servlet.ServletContextListener Context属性改变        添加、删除、修改        Javax.servletServletContentAttributeListener Session生命周期        创建、注销、超时        Javax.servlet.http.HttpSessionListener Session属性改变        添加、删除、修改        Javax.servlet.http.HttpSessionAttributeListener Request生命周期        创建、销毁           javax.servlet.ServletRequestListenter Request属性改变        添加、删除、修改        javax.servlet.ServletRequestAttributeListener 事件定义的三要素:    1.事件源    2.动作    3.事件触发的回调(触发动作之后调用什么东西) 这里的事件源就是:ServletContext、HttpSession、HttpServletRequest 监听可以分为两类:基于生命周期的监听和基于数据变化的监听。 这三个对象都有setAttribute,基于数据变化的监听,监听的就是setAttribute方法。 监听Request的生命周期:    浏览器发起请求到响应完毕,就是Request的生命周期。    1.创建类实现ServletRequestListener,重写初始化和销毁两个方法        ServletRequestEvent对象可以调用getServletRequest获取ServletRequest对象,        再强转即可获取HttpServletRequest。    2.注册到web.xml中
<listener>    <listener-class>        day05_Filter.exercise.RequestCycleListener    </listener-class></listener>
    OK了,这就是基于request生命周期的监听。request是相当节省内存的一个对象,所以数据    尽量放在request中,session或者Context根据具体需求而定。监听Session的生命周期:    实现HttpSessionListener接口,里边两个方法就表示建立session和销毁session了。    需要在Servlet中调用getSession,session对象才会产生    session默认是失去连接后30分钟销毁,    可以通过web.xml修改之,最小是1分钟:
<session-config>    <session-timeout>1</session-timeout></session-config>
    总结:Session的原理是通过容器在调用getSession方法时自动通过cookie写入sessionID的方式来控制    cookie默认的有效期是浏览器被关闭之前 session的有效期是当前这一次浏览器访问。    session的数据是存放在容器中的,容器无法监听浏览器的关闭,只能够通过web.xml设定的默认清除时长    来定时清除长期未访问的session数据。监听Context的生命周期:    实现ServletContextListener接口,这个东西的生命周期是项目的启动到停止。    再注册到web.xml中即可,这里没什么好演示的,不贴东西了。数据存储逻辑(setAttribute 和  getAttribute)    1.当所有的servlet都需要共享,而且需要保留的时间很长,就写入ServletContext。    2.数据是有状态性的,不同的用户拥有不同的数据,就写入HttpSession。    3.如果是传递的参数或者是请求转发的跳转数据传递,那就写入HttpServletRequest