web.xml

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>

原文地址:https://www.cnblogs.com/tp123/p/6424076.html