javaweb三大组件Servlet Filter Listenser

一直使用框架进行开发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>

猜你喜欢

转载自blog.csdn.net/Jorgen_s/article/details/89336950
今日推荐