welcome-file-list
这个标签是用来配置首页:
<welcome-file-list> <welcome-file>index1.jsp</welcome-file> <welcome-file>index2.jsp</welcome-file> <welcome-file>index3.jsp</welcome-file> <welcome-file>index4.jsp</welcome-file> <welcome-file>/target/redirectAndFoward.jsp</welcome-file> </welcome-file-list>
当用户访问http://ip:port/project的时候,会根据配置的页面列表,从项目的根目录开始找页面。按顺序查找jsp,如果都找不到那么就是404.
error-page
表示当http返回指定状态码时,容器把此次请求发送到配置的指定页面:
<error-page> <error-code>400</error-code> <location>/filter/error.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/filter/error.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/filter/error.jsp</location> </error-page>
servlet
1 <servlet> 2 <servlet-name>startUpServlet</servlet-name> 3 <servlet-class>com.xrq.servlet.StartUpServlet</servlet-class> 4 <init-param> 5 <param-name>Name</param-name> 6 <param-value>123</param-value> 7 </init-param> 8 <init-param> 9 <param-name>Age</param-name> 10 <param-value>456</param-value> 11 </init-param> 12 <load-on-startup>8</load-on-startup> 13 </servlet>
容器启动的时候,调用其init()方法
1.load-on-startup元素标记容器是否在启动的时候加载这个servlet(实例化并调用其init方法)
2.必须是一个整数,值大于等于0,表示在容器启动时就加载并初始化这个servlet,如果是小于0或者没有指定时,表示这个容器在该servlet被选择时才会去加载。
3.正数值越小,优先级越高,启动时就越先加载。值相同时,容器自己选择。
listener
就是监听器,是servlet的监听器。监听用户数量一般都是以session创建和失效为依据的。
比如自定义一个session监听器
<listener> <listener-class>com.xrq.listener.UserCounterListener</listener-class> </listener>
1 public class UserCounterListener implements HttpSessionListener 2 { 3 private AtomicInteger ai = new AtomicInteger(0); 4 5 public void sessionCreated(HttpSessionEvent se) 6 { 7 ai.incrementAndGet(); 8 } 9 10 public void sessionDestroyed(HttpSessionEvent se) 11 { 12 ai.decrementAndGet(); 13 } 14 15 public int getUserCount() 16 { 17 return ai.get(); 18 } 19 }
别的监听接口:
1.ServletContextListener
用于监听WEB引用启动和销毁的事件,是ServletContext的监听者,如果servletcontext变化,比如服务器启动,服务器关闭,都会被监听到,监听事件为ServletContextEvent
2.ServletContextAttributeListener
用于监听web应用属性改变的事件,包括添加属性,删除属性,修改属性。监听时间为ServletContextAtrributeEvent
3.HttpSessionBindingListener
这是唯一一个不需要在web.xml中配置的listener,实现了该接口,只要对象加入session或者移除,容器会调用以下两个方法。
(1)void valueBound(HttpSesssionBindEvent event)
(2)void valueUnbound(HttpSessionBindingEvent event)
这个监听器的触发是针对实现了该监听器的类的,只有把实现了该监听器的类set进session或者从session中remove才会触发。
4.HttpSessionAttributeListener
监听HttpSession中的属性操作,当session里面增加一个属性时,触发attributeAdded(HttpSessionBindEvent se)方法;当在session中删除一个属性时,触发attributeRemoved(HttpSessionBindEvent se)方法;当session属性被重新设置时,触发attributeReplaced(HttpSessionBindingEvent se)方法。
5.HttpSessionActivationListener
监听同一个session转移到不同jvm的情形。
6.ServletRequestListener和ServletRequestAttribute
前者监听request创建销毁,后者监听属性增删
context-param
给servletContext赋值,这里面配置的键值是全局共享的,整个web项目都能取到这个上下文,比如在web.xml配置一个HTTP端口和一个HTTPS端口:
<context-param> <param-name>NotSSLPort</param-name> <param-value>8080</param-value> </context-param> <context-param> <param-name>SSLPort</param-name> <param-value>8443</param-value> </context-param>
servlet中的取法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("NotSSLPort:" + getServletContext().getInitParameter("NotSSLPort")); System.out.println("SSLPort:" + getServletContext().getInitParameter("SSLPort")); }
filter中的取法
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)request; ServletContext sc = req.getSession().getServletContext(); System.out.println("NotSSLPort:" + sc.getInitParameter("NotSSLPort")); System.out.println("SSLPort:" + sc.getInitParameter("SSLPort")); chain.doFilter(request, response); }
listener取法 以ServletContextListener为例子
public void contextInitialized(ServletContextEvent sce) { System.out.println("Enter SCListener.contextInitialized"); System.out.println("NotSSLPort:" + sce.getServletContext().getInitParameter("NotSSLPort")); System.out.println("SSLPort:" + sce.getServletContext().getInitParameter("SSLPort")); }
最终的目的就是拿到servletContext,jsp里面内置对象中servletContext就是Application。
session-config
这个是用来配置session失效时间的,因为只有一个子标签
<session-config> <session-timeout>30</session-timeout> </session-config>
这个是以分钟为单位。在代码中也可以设置,request.getSession.setMaxInactiveInterval(30*60)这个单位是秒。
元素加载顺序
加载顺序和它们在web.xml中的先后顺序无关加载顺序是 context-param->listener->filter->servlet。
web.xml加载过程
1.启动web项目时,tomcat容器会去读它的配置文件web.xml,先读<listener></listener> 和 <context-param></context-param>
2.创建一个servletContext,这个web项目所有部分都将共享这个上下文。
3.把context-param转化为键值对,交给servletContext
4.根据listener标签创建事件监听。
如果加载filter的时候需要用到bean,但加载顺序是先filter后spring,那么spring中国初始化操作中的bean为null,所以使用下面的方式加载。
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>