欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

javaweb三大组件Servlet Filter Listenser

程序员文章站 2024-02-09 15:54:10
...

一直使用框架进行开发web开发,每次配置都是固定,一直没有时间钻研其中的深层含义。今天有时间就好好总结一下关于Javaweb三大组件(servlet, filter, listenser).

1  Servlet

使用:一般我们自定义的servlet类继承于 HTTPServlet 并且重写其中的doGet 以及 doPost方法。

层级关系:DemoServlet extends (Abstract)HttpServlet extends (Abstract)GenericServlet implements (interface)Servlet

作用:servlet是用于客户端请求获取服务端的动态资源。通俗点说,就是,我们在浏览器上键入url回车后,这个请求就会被我们的servlet拦截,进行处理。

主要用于:

    * 接受请求数据:我们的请求最终都被包装成HttpServletRequest对象,其中,包含了请求体,一些参数等等...

    * 处理客户端请求:通常是用doGet、doPost中处理,调用service(业务层)中的方法来处理请求。

    * 完成响应:处理完请求之后,我们将用forward(转发)(HttpServletRequst中的方法)  或者redirect(重定向)(HttpServletResponse)

servlet生命周期:

    默认第一次请求来的时候,服务器创建servlet的对象,且调用init方法实现初始化操作,且调用一次service方法,每当请求来的时候,服务器获取一个线程,调用service方法,完成具体的业务逻辑(编写的代码)当servlet被移除的时候或者服务器正常关闭的时候,服务器调用destroy方法实现销毁操作。

servlet接口方法(即常接触的方法):

//初始化方法
void init(ServletConfig config){}

//服务方法
void service(ServletRequest request,ServletResponse response){}

//销毁方法
void destroy(){}

//获取当前servlet的配置对象(即WEB-INF目录下的web.xml中的servlet标签里面的信息)
ServletConfig getServletConfig(){}

//获取当前servlet的信息
String getServletInfo(){}

 

通常servlet配置:

  
 //映射servlet
 <servlet>
    <servlet-name>LoginServlet</servlet-name>
     //创建项目的全限定名(即包名+类名)
    <servlet-class>com.demo.web.servlet.LoginServlet</servlet-class>
  </servlet>

 //绑定映射
  <servlet-mapping>
    //上下 servlet-name 需保持一致
    <servlet-name>LoginServlet</servlet-name>
    //拦截的请求名称
    <url-pattern>/login</url-pattern>
  </servlet-mapping>

url-pattern的配置:

    * 完全匹配 以"/"开始  例如 :   /aa/bb  /hello    /aa   目前使用这种方式

    * 目录匹配 以"/"开始  例如 :   以"/"开始 以"*"结束  例如:  /aa/*      /*

    * 后缀名匹配 以"/"开始  例如 :   以" * "开始  例如: *.jsp  *.action  *.do

    * 优先级 : 完全匹配 > 目录匹配 > 后缀名匹配

2  Filter

filter与servlet很类似,有相同的生命周期方法,配置也非常类似。只不过servlet是负责处理客户端过来的请求,filter则是对这些请求进行拦截以及放行。(通俗的例子:地铁站进站口,出站口就是相当于filter的角色)。

filter的配置:

 <filter>
    <display-name>DemoFilter</display-name>
    <filter-name>DemoFilter</filter-name>
    <filter-class>com.demo.filter.DemoFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>DemoFilter</filter-name>
    <url-pattern>/demo</url-pattern>
  </filter-mapping>

主要看一下filter-mapping中的字标签: 

    * servlet-name:指定具体过滤哪个servlet

    * dispatcher:指定过滤哪种方式过来的请求
          ** REQUEST:默认值,只过滤 从浏览器发送过来的请求
          ** FORWARD:只过滤转发过来的请求
          ** INCLUDE:只过滤包含过来的请求
          ** ERROR:只过滤错误过来的请求

用途:

    1) 统一编码

    2) 过滤一些特殊符号或者敏感词

    3) 用来配置全局的统一错误页面

<error-page>
			<error-code>404</error-code>
			<location>/404.jsp</location>
</error-page>

3  Listenser

概念:监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。

作用:监听javaweb的三个对象,ServletContext,ServletRequest,HttpSession

ServletContextListener (监听Application)
    * 创建 服务器启动的时候 会为每一个项目创建一个
    * 销毁 项目移除的的时候,或者服务器关闭的时候

void contextInitialized(ServletContextEvent sce):创建Servletcontext时

void contextDestroyed(ServletContextEvent sce):销毁Servletcontext时

ServletRequestListener(监听Request)
    * 创建 请求来的时候
    * 销毁 生成响应的时候

voidrequestInitialized(ServletRequestEvent sre):创建request时

void requestDestroyed(ServletRequestEvent sre):销毁request时

HttpSessionListener (监听Session)
    创建:
        1. java中,认为第一次调用request.getSession()  2. jsp中,认为第一次访问jsp页面的时候
    销毁:
        1.服务器非正常关闭  2.超时  3.手动销毁

voidsessionCreated(HttpSessionEvent se):创建session时

void sessionDestroyed(HttpSessionEvent se):销毁session时

 

ServletContextAttributeListener
void attributeAdded(ServletContextAttributeEvent event):添加属性时;

void attributeReplaced(ServletContextAttributeEvent event):替换属性时;

void attributeRemoved(ServletContextAttributeEvent event):移除属性时;

ServletRequestAttributeListener
voidattributeAdded(ServletRequestAttributeEvent srae):添加属性时

void attributeReplaced(ServletRequestAttributeEvent srae):替换属性时

void attributeRemoved(ServletRequestAttributeEvent srae):移除属性时

HttpSessionAttributeListener
void attributeAdded(HttpSessionBindingEvent event):添加属性时;

void attributeReplaced(HttpSessionBindingEvent event):替换属性时

void attributeRemoved(HttpSessionBindingEvent event):移除属性时


 

配置:

<listener>
  	<listener-class>com.demo.servletcontext.ServletContextListener</listener-class>
</listener>