您的位置:首页 > 其它

Servlet生命周期事件以及事件

2017-10-29 21:45 190 查看
这是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-timeou
4000
t>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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: