标签:extc tco ica frame event forward pre 响应 错误
监听器是一个接口,具体内容由我们来实现,监听器的实现用了观察者模式,我们实现的具体监听器就是观察者
事件源(被监听的对象):三大域!
生命周期监听:ServletContextListener,它有两个方法,一个在出生时调用,一个在死亡时调用;
属性监听:ServletContextAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。
生命周期监听:HttpSessionListener,它有两个方法,一个在出生时调用,一个在死亡时调用;
属性监听:HttpSessioniAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。
生命周期监听:ServletRequestListener,它有两个方法,一个在出生时调用,一个在死亡时调用;
属性监听:ServletRequestAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。
javaWeb中完成编写监听器:
在web.xml文件注册形式为 :
<listener> <listener-class>你编写的具体监听器类</listener-class> </listener>
在三大域中都存在一个生命周期监听和一个属性监听,实际上还有几个监听类,是与HttpSession相关,但它们是用来添加到JavaBean上,而不是添加到三大域上!这两个监听器都不需要在web.xml中注册!它们可以感知session域中对象的创建和销毁
在SSH整合的过程中,我们在项目的web.xml文件中配置的spring监听类,其内部就是实现了一个监听器接口,使服务器在启动的时候可以加载spring的配置文件进行初始化
<!--指定spring文件的位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!--配置spring监听器,这样在服务器启动的时候来加载spring--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的
当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。
其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行”由Filter来决定。可以理解为,Filter来决定是否调用Servlet!当执行完成Servlet的代码后,还会执行Filter后面的代码
所谓的放行就是使用:
chain.doFilter(request, response);
chain是javax.servlet.FilterChain的参数
javaWeb中完成编写拦截器:
在web.xml文件注册形式为 :
<filter> <filter-name>取个名字</filter-name> <filter-class>类的全路径名</filter-class> </filter> <filter-mapping> <filter-name>使用上边的名字</filter-name> <url-pattern>要拦截的范围(可以使/*,表示拦截所有请求,还可以是拦截某个Servlet)</url-pattern> </filter-mapping>
和Servlet在web.xml中的配置很相似吧
注意:Filter在web.xml中配置是有顺序的,先配置的先拦截
还有一个值得注意的地方是:不要认为一个请求在给浏览器输出就完成了,实际上很多事情都需要在给客户端响应之后才能完成,可以在放行语句的前后各输出一句话,可以看到,在Filter放行之后,浏览器就可以输出一个页面(如果Servlet中不做过多操作,只起一个转跳的作用),但是放行之后的语句还是会在控制台输出
Filter的生命周期(和Servlet的生命周期类似)
我们来做个测试,写一个过滤器,指定过滤的资源为b.jsp,然后我们在浏览器中直接访问b.jsp,你会发现过滤器执行了!
但是,当我们在a.jsp中request.getRequestDispathcer(“/b.jsp”).forward(request,response)时,就不会再执行过滤器了!也就是说,默认情况下,只能直接访问目标资源才会执行过滤器,而forward执行目标资源,不会执行过滤器
其实过滤器有四种拦截方式!分别是:REQUEST、FORWARD、INCLUDE、ERROR。
可以在<filter-mapping>中添加0~n个<dispatcher>子元素,来说明当前访问的拦截方式:
<filter-mapping> <filter-name>myfilter</filter-name> <url-pattern>/b.jsp</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
当没有给出拦截方式时,那么默认为REQUEST,其实最为常用的就是REQUEST和FORWARD两种拦截方式,而INCLUDE和ERROR都比较少用
我们可以使用拦截器实现一个错误转跳的功能,但发生错误就转跳到一个错误页面:
<filter-mapping> <filter-name>myfilter</filter-name> <url-pattern>/b.jsp</url-pattern> <dispatcher>ERROR</dispatcher> </filter-mapping> <error-page> <error-code>500</error-code> <location>/b.jsp</location> </error-page>
我们就可以在b.jsp中编写一个错误提示页面,或者是做一些其他操作
最后我们再来看看Filter在SSH整合中的使用:
当然是Struts2的使用啦:
<filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
StrutPrepareAndExecuteFilter这个拦截器的作用就是拦截所有请求
标签:extc tco ica frame event forward pre 响应 错误
原文地址:http://www.cnblogs.com/lz2017/p/7077912.html