Servlet程序由Servlet,Filter和Listener组成,其中监听器用来监听Servlet容器上下文。
监听器通常分三类:基于Servlet上下文的ServletContex监听,基于会话的HttpSession监听和基于请求的ServletRequest监听。
- ServletContex监听器
ServletContex又叫application,存在范围是整个Servlet容器生命周期,当系统启动时就会创建,系统关闭时会销毁,该对象通常存放一些非常通用的数据,但是不推荐存放太多,否则长期占据内存空间会影响服务器性能。
基于ServletContex的监听器可以继承两个接口并实现接口中相应的方法:
ServletContextListener接口定义了两个方法contextInitialized和contextDestroyed,分别在ServletContex创建和销毁时触发;
ServletContextAttributeListener接口定义了三个方法attributeAdded,attributeRemoved和attributeReplaced,分别在给ServletContex添加属性值,删除属性值和替换属性值时触发。
下面创建了一个基于Application的监听器:
import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * Application监听器,Servlet中的Application即ServletContext * * @author Administrator */ public class ApplicationListener implements ServletContextListener, ServletContextAttributeListener { /** * Default constructor. */ public ApplicationListener() { // TODO Auto-generated constructor stub } /** * application初始化时触发的方法 */ @Override public void contextInitialized(ServletContextEvent arg0) { System.out.println("Application创建:" + arg0.getServletContext()); } /** * application中添加属性值时触发的方法 */ @Override public void attributeAdded(ServletContextAttributeEvent arg0) { System.out.println("Application添加新属性:key="+arg0.getName()+" value="+arg0.getValue()); } /** * application中替换属性值时触发的方法 */ @Override public void attributeReplaced(ServletContextAttributeEvent arg0) { System.out.println("Application替换属性:key="+arg0.getName()+" value="+arg0.getValue()); } /** * application中删除属性值时触发的方法 */ @Override public void attributeRemoved(ServletContextAttributeEvent arg0) { System.out.println("Application移除属性:key="+arg0.getName()+" value="+arg0.getValue()); } /** * application销毁时触发的事件 */ @Override public void contextDestroyed(ServletContextEvent arg0) { System.out.println("Application销毁:" + arg0.getServletContext()); } }
最后在web.xml需要注册监听器,注册方式非常简单,注意标签<description>和<display-name>不是必须的:
<listener> <description>application listener</description> <display-name>application_listener</display-name> <listener-class>com.bless.listener.application.ApplicationListener</listener-class> </listener>
随后启动java web项目,监听器就会运行。
- Session监听器
Session对于做web项目的人来说应该非常熟悉了,Session的生命周期是一个用户的一次会话,简单的说当一个用户进入某个网站,在该网站服务器就已经为用户创建了一个Session对象,用户在网站内的任何操作都是在session周期内。
误区:某些人认为我进入某网站,随后关闭浏览器,我的session就已经销毁了。其实不然,因为session存储在服务器端,服务器并不能主动捕获到浏览器关闭的事件,即使关闭浏览器,Session对象依然存在服务器中。所以如果编写web应用时一定要考虑session什么时候销毁,销毁session对象的方式有两种:一种是调用session的invalidate方法,另一种是在web.xml中定义session失效时间session-timeout。
Session监听器也有两个接口,其功能与前面介绍的ServletContex类似:HttpSessionListener用于监听Session创建和销毁的事件,HttpSessionAttributeListener用于监听Session属性赋值,删除和替换的事件:
- /**
- * Session监听器
- * @author Administrator
- */
- public class SessionListener implements HttpSessionListener,
- HttpSessionAttributeListener {
- Vector<HttpSession> listSession = null;
- /**
- * 创建Session调用的方法
- * 将session对象放入listSession集合中
- */
- @Override
- public void sessionCreated(HttpSessionEvent arg0) {
- synchronized (this) {
- if(listSession == null){
- listSession = new Vector<HttpSession>();
- }
- }
- listSession.add(arg0.getSession());
- System.out.println("\n\n创建一个Session:"+arg0.getSession());
- System.out.println("[当前存在的Session:]");
- for (HttpSession session : listSession) {
- System.out.println("--->"+session);
- }
- }
- /**
- * 销毁Session调用的方法
- * 移除listSession集合对应session值
- */
- @Override
- public void sessionDestroyed(HttpSessionEvent arg0) {
- listSession.remove(arg0.getSession());
- System.out.println("\n\n销毁一个Session:"+arg0.getSession());
- System.out.println("[当前存在的Session:]");
- for (HttpSession session : listSession) {
- System.out.println("--->"+session);
- }
- }
- /**
- * session属性添加时调用的方法
- */
- @Override
- public void attributeAdded(HttpSessionBindingEvent arg0) {
- System.out.println("\n\n添加一条Session-->key:"+arg0.getName()+" 属性value:"+arg0.getValue());
- }
- /**
- * session属性移除时调用的方法
- */
- @Override
- public void attributeRemoved(HttpSessionBindingEvent arg0) {
- System.out.println("\n\n删除一条Session-->key:"+arg0.getName()+" 属性value:"+arg0.getValue());
- }
- /**
- * session属性替代时调用的方法
- */
- @Override
- public void attributeReplaced(HttpSessionBindingEvent arg0) {
- System.out.println("\n\n覆盖一条Session-->key:"+arg0.getName()+" 属性value:"+arg0.getValue());
- }
- }
在web.xml中定义相应监听器配置:
- <listener>
- <listener-class>com.bless.listener.session.SessionListener</listener-class>
- </listener>
- <!-- Session超时配置 -->
- <session-config>
- <session-timeout>1</session-timeout>
- </session-config>
- Request监听器
request监听器使用方法跟前面也是非常类似的,一个request生命周期是向服务器发送请求到服务器响应最后反应到页面的整个过程。Request监听器对应ServletRequestListener,ServletRequestAttributeListener接口,根据不同需求实现相应接口就行了。
- /**
- * Request事件监听器
- * @author Administrator
- */
- public class RequestListener implements ServletRequestListener,
- ServletRequestAttributeListener {
- @Override
- public void requestDestroyed(ServletRequestEvent arg0) {
- System.out.println("request销毁:"+arg0.getServletRequest());
- }
- @Override
- public void requestInitialized(ServletRequestEvent arg0) {
- System.out.println("request创建:"+arg0.getServletRequest());
- }
- @Override
- public void attributeAdded(ServletRequestAttributeEvent arg0) {
- System.out.println("request属性添加 key="+arg0.getName()+" value="+arg0.getValue());
- }
- @Override
- public void attributeRemoved(ServletRequestAttributeEvent arg0) {
- System.out.println("request属性删除 key="+arg0.getName()+" value="+arg0.getValue());
- }
- @Override
- public void attributeReplaced(ServletRequestAttributeEvent arg0) {
- System.out.println("request属性替换 key="+arg0.getName()+" value="+arg0.getValue());
- }
- }
web.xml配置:
- <listener>
- <listener-class>com.bless.listener.request.RequestListener</listener-class>
- </listener>
- Filter过滤器
当页面发送请求时,符合filter过滤范围的请求会首先进入过滤器,过滤器就可以执行一些过滤操作:比如编码格式,session验证,日志记录等。而这些功能都是自己编写过滤器实现的。
要实现一个过滤器,需要继承Filter接口,实现init、doFilter和destroy方法,这三个方法分别在过滤器初始化、过滤器运行和过滤器销毁时执行。
下面这段代码,是一个字符集过滤器,每次请求都会设置字符集编码格式,注意每次请求都会运行doFilter方法,过滤之后你需要在方法内调用FilterChain.doFilter这样就能让请求访问指定的servlet。
假设你不希望请求访问下一个servlet,你可以选择重定向,跳转到指定页面。
- /**
- *
- * @author : bless<505629625@qq.com>
- * Create Time : 2011-5-10下午10:38:19
- * Description : 字符集格式过滤器
- *
- */
- public class EncodingFilter implements Filter {
- //默认编码格式UTF-8
- private static final String DEFAULT_ENCODE = "UTF-8";
- private String encodeName; // 编码格式
- public void destroy() {
- }
- /**
- * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
- */
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
- try {
- if (encodeName == null || "".equals(encodeName.trim())) {
- request.setCharacterEncoding(DEFAULT_ENCODE);
- response.setCharacterEncoding(DEFAULT_ENCODE);
- } else {
- request.setCharacterEncoding(encodeName);
- }
- } catch (UnsupportedEncodingException e) {
- throw new UnsupportedEncodingException("编码格式过滤错误,请确认web.xml填入了正确的编码格式");
- }
- chain.doFilter(request, response);
- }
- /**
- * @see Filter#init(FilterConfig)
- */
- public void init(FilterConfig fConfig) throws ServletException {
- //获取web.xml配置的<param-name>encodeName</param-name>的值
- this.setEncodeName(fConfig.getInitParameter("encodeName"));
- }
- public String getEncodeName() {
- return encodeName;
- }
- public void setEncodeName(String encodeName) {
- this.encodeName = encodeName;
- }
- }
然后在web.xml中定义filter即可,标签init-param可以做一个参数配置,在filter中通过init方法参数FilterConfig.getInitParameter获得:
- <filter>
- <filter-name>encoding</filter-name>
- <filter-class>com.mt.filter.EncodingFilter</filter-class>
- <init-param>
- <param-name>encodeName</param-name>
- <param-value>GBK</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>encoding</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
相关推荐
- **Servlet 2.4规范**:增强了过滤器和监听器功能,引入了表达式语言EL。 - **JSTL 1.1**:JavaServer Pages Standard Tag Library提供了更丰富的标签库。 - **JPA**:引入了ORM(对象关系映射)框架,简化了与...
1. **Servlet 2.4规范**:进一步优化了过滤器和监听器,增强了安全性。 2. **JSP 2.0和EL 1.0**:提升了JSP的开发效率,EL可以与JSF(JavaServer Faces)结合使用。 3. **EJB 2.1**:引入了Session Bean的无状态会话...
8. **过滤器和监听器**:在J2EE应用中,过滤器(Filter)可以用来拦截和修改请求或响应,监听器(Listener)用于监听特定事件,如会话的创建和销毁。这些组件可以用来实现功能,如登录验证、权限控制和会话超时提醒...
#### 六、过滤器与监听器 ##### 过滤器(Filter) 过滤器用于拦截客户端请求,并对请求或响应进行预处理或后处理。它可以实现功能如身份验证、日志记录等。 示例代码: ```java public class AuthFilter implements ...
Servlet生命周期包括加载、初始化、服务、销毁等阶段,掌握Servlet配置、过滤器、监听器等使用方法,能实现动态网页和数据交互。 3. **JSP(JavaServer Pages)** JSP是HTML页面中嵌入Java代码的技术,主要负责视...
2. Servlet编程:理解Servlet生命周期、请求和响应对象、过滤器和监听器的使用。 3. JSP技术:学习JSP语法、EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)的使用。 4. EJB技术:深入...
10. **Web.xml配置**:每个J2EE应用都有一个web.xml文件,它是应用的部署描述符,定义了Servlet、过滤器、监听器等组件。 11. **MVC(Model-View-Controller)模式**:在J2EE项目中,理解如何实现MVC架构对于组织...
1. **Servlet 2.4 规范**:增强了会话管理、过滤器和监听器等功能。 2. **JSP 2.0**:引入了EL(Expression Language),使得在JSP中访问JavaBean属性更加简单。 3. **JSF 1.1**:首次引入到J2EE规范,提供了MVC...
7. **部署描述符**:如`web.xml`文件,这是Web应用的配置文件,定义了Servlet、过滤器、监听器等组件及其行为。在J2EE项目中,部署描述符对于理解和配置应用至关重要。 8. **版本管理**:项目可能使用版本控制系统...
书中会详细讲解Servlet的生命周期、配置、过滤器和监听器,以及如何使用Servlet实现动态网页内容。 2. **JSP(JavaServer Pages)**:JSP是Servlet的简化版,允许开发者通过HTML模板和Java脚本元素来创建动态网页。...
Servlet 2.5允许动态加载Servlet,增强了过滤器和监听器的灵活性,而JSP 2.1引入了表达式语言(EL)2.1版,提高了模板文本处理性能,并支持JSF 1.2。 **5. JavaServer Faces (JSF) 1.2:** JSF 1.2是J2EE 5.0中的...
7. **部署描述符**:在J2EE应用中,部署描述符(如web.xml)定义了应用的配置信息,如Servlet、过滤器、监听器的映射,以及安全和会话配置等。 8. **EJB(Enterprise JavaBeans)**:虽然描述中没有明确提及,但...
Servlet可以处理请求、生成响应,也可以作为过滤器或监听器来扩展其功能。Servlet通常与JSP配合使用,实现业务逻辑和视图的分离。 Struts是MVC(Model-View-Controller)设计模式的一个经典实现,它提供了控制器层...
此外,Servlet 2.5还增强了过滤器(Filter)和监听器(Listener)的功能。 ### 5. JavaMail API J2EE 5.0提供了JavaMail API,用于处理电子邮件。开发者可以通过`javax.mail`包中的类和接口发送、接收邮件,实现...
书籍可能会深入解释它们的工作原理、生命周期、过滤器和监听器等。 3. **EJB**:这是J2EE中的核心组件,用于创建可复用的、事务安全的业务逻辑。书籍会详细讲述EJB的三种类型——会话bean、实体bean和消息驱动bean...
在J2EE 1_4中,Servlet 2.4规范引入了过滤器(Filters)和监听器(Listeners),增强了对请求处理的控制和应用状态管理。 #### 2.2 JavaServer Pages (JSP) JSP是一种用于创建动态网页的技术,它允许开发者将HTML...
课件将详细介绍Servlet的生命周期、请求和响应对象、会话管理以及过滤器和监听器等概念。 2. **JSP**:JSP是一种动态网页技术,允许开发者在HTML页面中嵌入Java代码。学习内容可能包括JSP元素、指令、脚本元素、EL...
在讲解中,韩顺平老师会详细阐述Servlet的生命周期、服务方法、请求与响应对象的使用、会话管理、过滤器和监听器等关键概念。这些内容对于理解和构建Web应用程序至关重要。 首先,Servlet的生命周期包括加载、初始...
在J2EE 6中,Servlet 3.0规范带来了诸如异步处理、注解配置、过滤器和监听器的增强,以及对web.xml部署描述符的简化。JSP(JavaServer Pages)是一种动态网页技术,允许开发者将HTML代码与Java代码混合编写,提供了...