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