Servlet知识点

1.需要掌握Servlet,Filter以及Listener各自的用途及最佳使用场合

2.Servlet的生命周期 *补充图
服务器加载servlet——servlet构造函数——@PostConstruct修饰的方法——init()方法——service()方法——destroy()方法——@PreDestroy修饰的方法——服务器卸载servlet完毕。

3.Servlet之间的跳转
Servlet的跳转可以实现程序模块化。MVC框架中都使用了servlet跳转。其中有转向、重定向和自动刷新

     ...3.1转向(Forward):
      转向(Forward)是通过RequestDispatcher对象的forward()方法实现的。
          ...3.1.1 RequestDispatcher的获得方法
          1)HttpServletRequest.getRequestDispatcher()
          2)ServletContext.getRequestDispatcher()
          ...3.1.2 RequestDispatcher的参数说明
         其中的参数必须以/开始,/表示本webApp的根目录。可以Forward到servlet、jsp页面,甚至可以跳转到另外一个文件或WEB-INF文件夹下的文件。
  
    ...3.2重定向(Redirect):
      重定向(Redirect)是利用服务器返回的状态码实现的。客户端浏览器请求服务器时,服务器端会返回一个状态码。服务器端通过response的setStatus()方法设置状态码
          ...3.2.1 状态码:
          200表示一切正确; 301、302表示该资源已不存在或换了地址,客户端需重定向到一个新的资源,服务器响应中会附带这个新资源地址;401表示没有权限访问;404表示资源不存在;
          ...3.2.2 获取方法
          1)HttpServletResponse.setStatus() + HttpServletResponse.setHeader()
              其中,setStatus用来设置状态码,而setHeader用来设置新资源的地址
          2)HttpServletResponse.sendRedirect(),其实 HttpServletResponse.sendRedirect()=             HttpServletResponse.setStatus() + HttpServletResponse.setHeader()
  
     ...3.3 自动刷新(Refresh):
      不仅可以实现一段时间后自动跳转到另一个页面,还可以实现一段时间后自动刷新本页面,如:

      response.setHeader("Refresh", "1000; URL=http://www.baidu.com" );

      URL指定的网址是1s后跳转的页面。当URL设置的路径为servlet自己的路径时,就会每隔1s自动刷新本页面一次。自动实现和重定向原理一样,当为时间设为0,URL设为一个网址,效果就是重定向。


4.Servlet的线程安全问题
servlet是线程不安全的。要谨慎使用类的变量。一个servlet类只会有一个实例,而当多个用户同时请求同一个servlet时,Tomcat会派生出多条线程执行servlet的代码。因此servlet是线程不安全的。
     ...4.1多线程并发的读写会导致数据不同步的问题
     ...4.2多线程并发的读写servlet类属性会导致数据不同步,但若只是并发地读取属性而不写入,则不存在数据不同步问题
     ...4.3对于并发性的读写,最好的方法是synchronized这个属性,这样带来的开销将是最小的

5.Fileter
Filter、Listener是servlet规范里德两个高级特性。不同于servlet,它们不用于处理客户端请求,只用于对request、response进行修改或者对context、session、request事件进行监听。
    ...5.1多个Filter就组成了一个FilterChain。


    ...5.2一个Filter必须实现javax.servlet.Filter接口。Filter需要配置在web.xml中才能生效。其中<dispatcher>配置到达servlet的方式。默认为request。


     ...5.2.1 request:表示仅当直接请求servlet时才生效。
     ...5.2.2 forward:表示仅当某servlet通过forward到该servlet时才生效。


    ...5.3多个Filter的执行有先后顺序,规则是<filter-mapping>配置在前面的Filter执行要早于配置在后面的Filter


    ...5.4页面编码方式与Filter编码方式必须一致。此外,若表单是get方式提交的,需要修改Tomcat的/conf/server.xml文件,指定URIEncoding,默认为ISO-8859-1,否则依然会乱码。


    ...5.5Filter中,若在chain.doFilter()上加一个try....catch语句,就能捕捉servlet中抛出的异常,然后根据不同的异常进行不同的异常处理。


    ...5.6Filter和特定的URL关联,只有当客户请求访问此URL时,才会触发过滤器调用doFilter方法!


    ...5.7过滤器的初始化,即被调用init()方法是webApp应用被Tomcat加载就执行


    ...5.8Filter配置多个url-pattern


     方法一:(Servlet规范 2.5+)

 <filter>

          <filter-name>authority</filter-name>

          <filter-class>com.util.AuthorityFilter</filter-class>

     </filter>

     <filter-mapping>

          <filter-name>authority</filter-name>

           <url-pattern>/pages/cmm/*</url-pattern>

           <url-pattern>/pages/genbill/*</url-pattern>

     </filter-mapping>

    
 
 方法二:

<filter>

      <filter-name>authority</filter-name>

      <filter-class>com.util.AuthorityFilter</filter-class>

 </filter>

 <filter-mapping>

      <filter-name>authority</filter-name>

      <url-pattern>/pages/genbill/*</url-pattern>

 </filter-mapping>

 <filter-mapping>

      <filter-name>authority</filter-name>

      <url-pattern>/pages/cmm/*</url-pattern>

 </filter-mapping>

 


6.Listener
Listener用于监听Java Web程序中的事件,如创建、属性修改、删除session、request、context等,并触发相应的事件。Java web程序只要记住该类事件触发时一定会调用相应的Listener相应方法,并传回一个Event对象。触发时,服务器会顺次执行各个Listener的相应方法。
    ...6.1HttpSessionListener接口、ServletContextListener、ServletRequestListener分别用于监控session、context、request的创建和销毁。
         1)HttpSessionListener:监听session的创建和销毁。创建session时执行sessionCreated()方法。超时或执行session.invalidate()时执行sessionDestroyed()方法。
         2)ServletContextListener:监听context的创建和销毁。context代表当前的web应用程序。服务器启动或热部署war包时执行contextInitialized()方法。服务器关闭或只关闭该web时会执行contextDestroyed()方法。该listener可用于启动时获取web.xml里配置的初始化参数。
         3)ServletRequestListener:监听request的创建和销毁。用户每次请求request都会执行requestInitialized()方法。request处理完毕自动销毁前执行requestDestroyed()方法。


    ...6.2HttpSessionAttributeListener、ServletContextAttributeListener、ServletRequestAttributeListener用于监听session、context、request的属性变化。当向被监听对象中添加、修改、删除属性时,会分别执行对应的方法。


    ...6.3HttpSessionBindingListener和HttpSessionActivationListener用于监控session内的对象。此两个Listener不需要在web.xml中声明。
         1)HttpSessionBindingListener:当对象被放到session里时,执行valueBound()方法。当对象被从session里移除时,执行valueUnbound()方法。对象必须实现该Listener接口。
         2)HttpSessionActivationListener:服务器关闭时,会将session里的内容保存到硬盘上。服务器重新启动时,会将session内容从硬盘上重新加载。当session里的对象被钝化时,执行sessionWillPassivate()方法。当对象被重新加载时,执行sessionDidActtivate()。对象必须实现该Listener接口。


    ...6.4HttpSessionIdListener


    ...6.5AsyncListener


    ...6.6<listener>标签一般配置在<servlet>标签的前面。

7.ServletContext
servlet容器在启动时会加载web应用,并为每个web应用创建唯一的ServletContext对象,被同一个web应用中所有组件共享.在web运行期间,ServletContext设置的属性一直存在。当web应用被关闭时(如关闭Tomcat),servlet容器销毁ServletContext对象。

8.filter、listener、servlet启动顺序
    1).启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>
    2).紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.
    3).容器将<context-param></context-param>转化为键值对,并交给ServletContext.
    4).容器创建<listener></listener>中的类实例,即创建监听(通过contextInitialized(ServletContextEvent args)这个方法). listener的类实例需要实现 javax.servlet.ServletContextListener接口。
    5).容器初始化<filter></filter>。filter的类实例需要实现 javax.servlet.Filter接口
    6).容器加载<load-on-startup>的<serlvet/>。 servlet实现javax.servlet.Servlet接口
    7).容器销毁时,按照servlet-->filter-->listener的顺序销毁servlet、filter和listener


 

你可能感兴趣的:(servlet,filter,listener)