web.xml 各个组件的加载顺序
常用组件加载顺序:listener > filter > servlet
启动一个web项目会先创建一个ServletContext(全文上下文),当在<context-param>标签中设置键值对时,会将该键值赋给ServletContext,供所有组件使用,通过getServletContext().getInitParameter(key),可以得到对应的值。
listener 能够监听到session,application的create,destroy,可以监听到session,application属性绑定的变化。springMVC的使用
一是通过listener实现
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
二是通过servlet实现
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
filter过滤器会在listener执行,filter初始化是按照<filter>在后面的先初始化,执行顺序是按照<filter-mapping>在前面的先执行。在filter中可以<init-param>设置自己的键值对,通过config.getInitParameterNames(); 可以获得所有键。
在 <filter-mapping>中有<dispatcher>这个标签,这个标签是对filter进行过滤的,只有满足<dispatcher>才执行该filter
dispatcher的取值:
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
默认是REQUEST 是直接从客户端过来的request;
FORWARD是req.getRequestDispatcher("").forward(req, resp);
INCLUDE是req.getRequestDispatcher("").include(req, resp);
ERROR是通过<error-page>过来的request
FORWARD和INCLUDE其实就是转发,两者的区别是INCLUDE转发到另一个servlet后还会返回到原来的servlet继续执行response输出,而FORWARD不会。插一句,重定向是通过resp.sendRedirect("")实现的。
Struts2就是通过filter实现的
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
servlet一般最后执行,当设置<load-on-startup>时,启动项目时,就会初始化该servlet,<load-on-startup>的值必须为整数,当为正数时,值越小先加载,当不写或为负数时,不加载。若加载,加载顺序是在filter之后。