一、三大组件

   JavaWeb三大组件指的是:Servlet、Filter、Listener,这三个组件在JavaWeb开发中分别提供不同的功能,然而很多人可能只用过其中一个或者两个(Servlet、Filter,比如我),很难接触到第三个组件,因此对原始JavaWeb开发还不够熟悉,在这种情况下进行框架学习,这种做法是并不可取,框架是大牛们对原始JavaWeb进行封装的结果,没有原始JavaWeb开发基础是很难真正学会框架的。这篇博客就是通过简单的介绍JavaWeb的三大组件来熟悉原始JavaWeb开发。

1、Servlet 
Servlet是用来处理客户端请求的动态资源,也就是当我们在浏览器中键入一个地址回车跳转后,请求就会被发送到对应的Servlet上进行处理。

Servlet的任务有:

  1. 接收请求数据:我们都知道客户端请求会被封装成HttpServletRequest对象,里面包含了请求头、参数等各种信息。
  2. 处理请求:通常我们会在service、doPost或者doGet方法进行接收参数,并且调用业务层(service)的方法来处理请求。
  3. 完成响应:处理完请求后,我们一般会转发(forward)或者重定向(redirect)到某个页面,转发是HttpServletRequest中的方法,重定向是HttpServletResponse中的方法,两者是有很大区别的。

Servlet的创建:Servlet可以在第一次接收请求时被创建,也可以在在服务器启动时就被创建,这需要在web.xml的< servlet>中添加一条配置信息 < load-on-startup>5< /load-on-startup>,当值为0或者大于0时,表示容器在应用启动时就加载这个servlet,当是一个负数时或者没有指定时,则指示容器在该servlet被请求时才加载。 
Servlet的生命周期方法:

servlet的初始化方法,只在创建servlet实例时候调用一次,Servlet是单例的,整个服务器就只创建一个同类型Servlet

servlet的处理请求方法,在servle被请求时,会被马上调用,每处理一次请求,就会被调用一次。ServletRequest类为请求类,ServletResponse类为响应类

servlet销毁之前执行的方法,只执行一次,用于释放servlet占有的资源,通常Servlet是没什么可要释放的,所以该方法一般都是空的

2、Filter 
filter与servlet在很多的方面极其相似,但是也有不同,例如filter和servlet一样都又三个生命周期方法,同时他们在web.xml中的配置文件也是差不多的、 但是servlet主要负责处理请求,而filter主要负责拦截请求,和放行。 
filter四种拦截方式

  • REQUEST:直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;
  • FORWARD:转发访问执行过滤器。包括RequestDispatcher#forward()方法、< jsp:forward>标签都是转发访问;
  • INCLUDE:包含访问执行过滤器。包括RequestDispatcher#include()方法、< jsp:include>标签都是包含访问;
  • ERROR:当目标资源在web.xml中配置为< error-page>中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。

执行filter的顺序 
如果有多个过滤器都匹配该请求,顺序决定于web.xml filter-mapping的顺序,在前面的先执行,后面的后执行 
3、Listener 
Listener就是监听器,我们在JavaSE开发或者Android开发时,经常会给按钮加监听器,当点击这个按钮就会触发监听事件,调用onClick方法,本质是方法回调。在JavaWeb的Listener也是这么个原理,但是它监听的内容不同,它可以监听Application、Session、Request对象,当这些对象发生变化就会调用对应的监听方法。 
应用域监听: 
Ø ServletContext(监听Application)

¨ 生命周期监听:ServletContextListener,它有两个方法,一个在出生时调用,一个在死亡时调用;

¨ 属性监听:ServletContextAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。

 HttpSession(监听Session)

¨ 生命周期监听:HttpSessionListener,它有两个方法,一个在出生时调用,一个在死亡时调用;

属性监听:HttpSessioniAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。

感知Session监听: 
1:HttpSessionBindingListener监听 
⑴在需要监听的实体类实现HttpSessionBindingListener接口 
⑵重写valueBound()方法,这方法是在当该实体类被放到Session中时,触发该方法 
⑶重写valueUnbound()方法,这方法是在当该实体类从Session中被移除时,触发该方法 
2:HttpSessionActivationListener监听 
⑴在需要监听的实体类实现HttpSessionActivationListener接口 
⑵重写sessionWillPassivate()方法,这方法是在当该实体类被序列化时,触发该方法 
⑶重写sessionDidActivate()方法,这方法是在当该实体类被反序列化时,触发该方法

 

二、八大监听器

Servlet监听器的作用是监听Web容器的有效期事件,可以监听由于Web应用中状态改变而引起的Servlet容器产生的相应事件,然后接受并处理这些事件。其中提供的LIstener接口有这些:

(1)ServletContextListener;        

Servlet的上下文监听,它主要实现监听ServletContext的创建和删除。该接口提供了两种方法

                  1.contextInitialized(ServletContextEvent event);   通知正在收听的对象,应用程序已经被加载和初始化。

                  2.contextDestroyed(ServletCotextEvent event);   通知正在收听的对象,应用程序已经被载出,即关闭。

(2)ServletAttributeListener;    

  主要实现监听ServletContext属性的增加,删除和修改。该接口提供了一下3个方法

                1.attributeAdded(ServletContextAttributeEvent event);   

当有对象加入Application的范围时,通知正在收听的对象

                2.attributeReplaced(ServletContextAttributeEvent event);

当在application的范围有对象取代另一个对象的时,通知正在收听的对象

                3.attributeRemoved(ServletContextAttributeEvent event); 

  当有对象从application的范围移除时,通知正在收听的对象

(3)HttpSessionListener;          

  HTTP会话监听,该接口实现监听HTTP会话创建、销毁。该接口提供了一下两种方法

                   1.sessionCreated(HttpSessionEvent event);       

通知正在收听的对象,session已经被加载及初始化

                   2. sessionDestoryed(HttpSessionEvent event)l        

  通知正在收听的对象,session已经被载出(HttpSessionEvent类的主要方法是getSession(),可以使用该方法回传一个session对象)

(4)HttpSessionActivationListener;         

 该接口实现监听HTTP会话active和passivate。 该接口提供了一下3个方法 

                   1.attributeAdded(HttpSessionBindingEvent event);       

  当有对象加入session的范围时,通知正在收听的对象

                   2.attributeReplaced(HttpSessionBindingEvent event);    

   当在session的范围有对象取代另一个对象时,通知正在收听的对象。

                   3.attributeRemoved(HttpSessionBindingEvent event);          

  当有对象从session的范围有对象取代另一个对象时,通知正在收听的对象 其中HttpSessionBindingEvent类主要有三个方法:getName()、getSession()和getValue()

(5)HttpBindingListener;                      

  接口实现监听HTTP会话中对象的绑定信息。它是唯一不需要在web.xml中设定Listener的。该接口提供了以下2个方法

                  1.valueBound(HttpSessionBindingEvent event);                      

当有对象加入session的范围时会被自动调用

                  2.valueUnBound(HttpSessionBindingEvent event);                    

  当有对象从session的范围内移除时会被自动调用

(6)HttpSessionAttributeListener;             

  该接口实现监听HTTP会话中属性的设置请求。该接口提供了以下两个方法。

                 1.sessionDidActivate(HttpSessionEvent event);          

  通知正在收听的对象,它的session已经变为有效状态。

                 2.sessionWillPassivate(HttpSessionEvent event);          

  通知正在收听的对象,它的session已经变为无效状态

(7)ServletRequestListener;                   

  该接口提供了以下两个方法。

                   1.requestInitalized(ServletRequestEvent event)             

通知正在收听的对象,ServletRequest已经被加载及初始化

                   2.requestDestroyed(ServletRequestEvent event)         

  通知正在收听的对象,ServletRequest已经被载出,即关闭
(8)ServletRequestAttributeListener               

  该接口提供了一下三种方法

                    1.attributeAdded(ServletRequestAttributeEvent event);     

   当有对象加入request的范围时,通知正在收听的对象

                    2.attributeReplaced(ServletRequestAttributeEvent event);        

当在request的范围内有对象取代两一个对象时,通知正在收听的对象

                   3.attributeRemoved(ServletRequestAttributeEvent event);    

  当有对象从request的范围移除时,通知正在收听的对象