`
changhongbao
  • 浏览: 122474 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

web.xml详解

 
阅读更多

web.xml的作用

web.xml,一个Tomcat工程中最重要的配置文件。web.xml没有其实也可以----只要你确定你的项目里面不需要任何过滤器、监听器、Servlet等等。我试了一下,没有web.xml对那些已经编译成Servlet的jsp页面来说,是不影响正常显示的,但是那些没有编译成Servlet的jsp页面,访问的时候就会报500的错误了。下面逐一看一下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/工程名的时候,会根据welcome-file-list配置的页面列表,从项目的根目录开始找页面:

1、第一个配置的index1.jsp能找到,就展示index1.jsp

2、找不到index1.jsp,则去找第二个index2.jsp,index2.jsp能找到就展示index2.jsp,

3、找不到index3.jsp,则去找第三个index3.jsp,以此类推,如果所有的页面都找不到则报HTTP Status 404即页面找不到

注意一下,像配置的最后一个welcome-file这种写法也是支持的,我试了一下最前面的那个"/"可加可不加

 

error-page

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>
复制代码

这表示HTTP状态码为400、404、500的时候,此次请求都会被转发到http://ip:port/工程名/filter/error.jsp这个页面上去。注意一下这里是error-code,所以如果是200的话,是没有效果的

 

filter

filter就不说了,两种include方式及filter中的dispatcher解析一文已经讲得很详细了,filter的写法也在上面。

另外注意一点,其实大家也都知道,提一下:走filter的顺序就是filter定义的顺序

 

servlet

servlet开发者比较熟悉,先匹配规则,匹配到路径后走相应的Servlet类,就不说了。下面配一个相对不那么常用的,只是相对而已,这种servlet的写法很常见:

复制代码
<servlet>
    <servlet-name>startUpServlet</servlet-name>
    <servlet-class>com.xrq.servlet.StartUpServlet</servlet-class>
    <init-param>
        <param-name>Name</param-name>
        <param-value>123</param-value>
    </init-param>
    <init-param>
        <param-name>Age</param-name>
        <param-value>456</param-value>
    </init-param>
    <load-on-startup>8</load-on-startup>
</servlet>
复制代码

这是一个启动servlet,表示容器启动的时候servlet启动,调用其init()方法,所以首先第一个标签load-on-start,分几点说:

1、load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init方法)

2、它的值必须是一个整数,表示servlet应该被载入的顺序

3、当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet

4、当值小于0或者没有指定时,表示这个容器在该servlet被选择时才会去加载

5、正数值越小,该servlet的优先级就越高,应用启动时就越先加载

6、当值相同时,容器自己选择顺序来加载

所以,load-on-startup中配置了一个大于等于0的正整数时,该servlet可以当作一个普通的servlet来用,无非是这个servlet启动的时候会加载其init()方法罢了。

另外一个就是init-param了,表示一个键值对,只能在本servlet里面被使用,通过ServletConfig获取,StartUpServlet的写法是:

复制代码
public class StartUpServlet extends HttpServlet
{
    /**
     * 序列化
     */
    private static final long serialVersionUID = 1L;
    
    public void init() throws ServletException
    {
        System.out.println("StartUpServlet.init()");
        System.out.println("Name:" + getServletConfig().getInitParameter("Name"));
        System.out.println("Age:" + getServletConfig().getInitParameter("Age"));
    }
    
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {
        
    }
    
    public void destroy()
    {
        System.out.println("StartUpServlet.destory()");
    }
}
复制代码

servlet只能取到配置在自己的<servlet>标签内的<init-param>

 

listener

listener即监听器,是Servlet的监听器,它可以监听客户端的请求、服务器端的操作等,在事情发生前后做一些必要的处理。通过监听器,可以自动激发一些操作,比如监听在线用户数量,下面就写一个监听用户数量的监听器,首先web.xml配置很简单:

<listener>
    <listener-class>com.xrq.listener.UserCounterListener</listener-class>
</listener>

写一个监听器,监听用户数量一般都是以session创建和session失效为依据的,所以实现HttpSessionListener:

复制代码
public class UserCounterListener implements HttpSessionListener
{
    private AtomicInteger ai = new AtomicInteger(0);
    
    public void sessionCreated(HttpSessionEvent se)
    {
        ai.incrementAndGet();
    }
    
    public void sessionDestroyed(HttpSessionEvent se)
    {
        ai.decrementAndGet();
    }
    
    public int getUserCount()
    {
        return ai.get();
    }
}
复制代码

除了监听session的监听器外,再介绍一些别的监听器接口:

1、ServletContextListener

用于监听WEB引用启动和销毁的事件,SevletContextListener是ServletContext的监听者,如果ServletContext发生变化,如服务器启动、服务器关闭,都会被ServletContextListener监听到。监听事件为ServletContextEvent

2、ServletContextAttributeListener

用于监听WEB应用属性改变的事件,包括添加属性、删除属性、修改属性。监听时间为ServletContextAttributeEvent

3、HttpSessionBindingListener

HttpSessionBindingListener是唯一一个不需要在web.xml中配置的Listener,当我们的类实现了HttpSessionBindListener接口后,只要对象加入session或者从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)方法。

注意,这个监听器的触发是针对所有的session的,只要session的属性发生变化,都会触发这个监听器

5、HttpSessionListener

这个上面已经写过了,监听HttpSession。当创建一个session时,触发sessionCreated(HttpSessionEvent se)方法;当销毁一个session时,会触发sessionDestoryed(HttpSessionEvent se)方法

6、HttpSessionActivationListener

这个用得不太多,主要监听同一个session转移至不同的JVM的情形

7、ServletRequestListener和ServletRequestAttributeListener

和ServletContextListener和ServletContextAttributeListener类似,前者监听Request的创建和销毁、后者监听Request中属性的增删改

 

context-param

context-param里面配置的键值对是全局共享的,整个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就对了。是不是感觉ServletContext很熟悉呢?没错,看一下jsp默认的内置对象,随便打开一个转换成Servlet的jsp页面,里面都有内置对象的定义:

复制代码
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
复制代码

ServletContext也就是我们常说的Application

 

<mime-mapping>

<mime-mapping>可能不太常见,这个标签是用来指定对应的格式的浏览器处理方式的,添加mime-type的映射,就可以避免某些类型的文件直接在浏览器中打开了。

举个例子:

复制代码
<mime-mapping>
    <extension>doc</extension>
    <mime-type>application/msword</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>pdf</extension>
    <mime-type>application/pdf</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>rar</extension>
    <mime-type>application/x-rar-compressed</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>txt</extension>
    <mime-type>text/plain</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>xls</extension>
    <mime-type>application/vnd.ms-excel</mime-type>
</mime-mapping>
复制代码

这就指定了.doc、pdf、rar、txt、xls这五种类型的文件的打开方式了。常见的MIME类型有:

类  型 后  缀 MIME类型
超文本标记语言文本 .htm、.html text/html
普通文本 .txt text/plain
RFT文本 .rtf application/rtf
GIF图形 .gif image/gif
JPEG图形 .jpg、.jpeg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 .mid、.midi audio/midi、audio/x-midi
RealAudio音乐文件 .ra、.ram audio/x-pn-realaudio
MPEG文件 .mpg、.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar

 

session-config

session-config是用来配置session失效时间的,因为session-config里面只有一个子标签:

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

以分钟为单位。当然,代码里面也可以设置:

"request.getSession.setMaxInactiveInterval(30 * 60);"就可以了,单位为秒

 

元素加载顺序

首先可以肯定,加载顺序与它们在web.xml文件中的先后顺序无关,即不会因为filter写在listener前面就先加载filter。最终得出的结论是listener->filter->servlet。

然后是context-param,用于向ServletContext提供键值对,即应用程序上下文信息,listener、filter、servlet都可能会用到这些上下文中的信息,那么context-param是否应该写在listener、filter、servlet前面呢?未必,context-param可以写在任何位置,因此真正的加载顺序应该是:context-param->listener->filter->servlet

 

================================================================================== 

我不能保证写的每个地方都是对的,但是至少能保证不复制、不黏贴,保证每一句话、每一行代码都经过了认真的推敲、仔细的斟酌。每一篇文章的背后,希望都能看到自己对于技术、对于生活的态度。

我相信乔布斯说的,只有那些疯狂到认为自己可以改变世界的人才能真正地改变世界。面对压力,我可以挑灯夜战、不眠不休;面对困难,我愿意迎难而上、永不退缩。

其实我想说的是,我只是一个程序员,这就是我现在纯粹人生的全部。

==================================================================================
分享到:
评论

相关推荐

    web.xml 详解

    ### Web.xml 详解 #### 1. 定义头和根元素 在开始解析`web.xml`文件前,我们先了解其基本结构。部署描述符文件即`web.xml`文件,像所有XML文件一样,必须以一个XML头开始。这个头声明指定了可用的XML版本及文件的...

    WEB.XML详解

    WEB.xml详解主要涉及了Java EE Web应用程序的标准配置文件web.xml的详细使用说明,这是Servlet规范中定义的一个配置文件,用于配置web应用的初始化参数、servlet和filter、监听器等组件。 首先,web.xml文件在Web...

    web.xml配置详解, web.xml web.xml 配置实例

    Web.xml 配置详解 Web.xml 是一个部署描述符文件,用于描述 Web 应用程序的配置信息。该文件是基于 XML 语法的,所有的元素都是大小写敏感的。下面是 web.xml 配置文件的详细解释: 定义头和根元素 在 web.xml ...

    web.xml详解.txt

    ### web.xml详解 #### 一、引言 `web.xml`是Java Web应用程序中的核心配置文件,用于定义和管理Web应用的各种配置信息。通过深入理解`web.xml`,开发人员可以更好地控制Web应用的行为和特性,提高编程效率与质量。...

    java/jsp web.xml详解

    在Java和JSP开发中,`web.xml`文件是一个至关重要的组成部分,它是Servlet容器(如Tomcat)的部署描述符。...`web.xml详解.pdf`文件应该提供了更详细的示例和解释,对于初学者来说是一份宝贵的参考资料。

    web.xml配置详解

    web.xml 配置详解 web.xml 配置详解是指在 Java Web 应用程序中使用的部署描述符配置文件。它是一个 XML 文件,包含了很多描述 servlet/JSP 应用的各个方面的元素,如 servlet 注册、servlet 映射以及监听器注册。 ...

    web.xml详解(txt)

    ### web.xml详解 #### 1. 引言与概述 `web.xml` 是Java Web应用程序的核心配置文件之一,主要用于配置Web应用的各种初始化参数、映射关系等。它使用XML格式来定义,通常位于项目的`WEB-INF`目录下。在本文中,我们...

    Tomcat Web.xml 详解

    ### Tomcat Web.xml 详解 #### 一、概述 `web.xml` 文件是 Java Web 应用中的核心配置文件之一,它定义了应用程序的各种配置信息,包括但不限于 Servlet 的配置、过滤器(Filter)的配置、监听器(Listener)的...

    剖析web.xml详解

    错误代码时,服务器能够显示自定义的错误页面。这对于提供用户友好的错误处理至关重要。例如,如果服务器返回...同时,由于web.xml的配置是跨平台的,所以编写标准化的web.xml文件对于确保应用的可移植性也至关重要。

    web.xml配置文件详解

    ### web.xml配置文件详解 #### 一、概述 `web.xml`是Java Web应用程序的核心配置文件之一,主要用于定义Web应用程序的结构与行为。它是Servlet容器(如Tomcat)读取Web应用程序配置信息的主要来源,因此深入理解其...

    web2.0开发中web.xml详解

    Web.xml是Java Web应用程序的核心配置文件,位于WEB-INF目录下,它是基于XML的,用于定义应用的结构、行为以及服务器如何处理请求。该文件的主要作用是配置Servlet、过滤器、监听器、会话超时、错误页面、MIME类型...

    详解Spring mvc的web.xml配置说明

    在构建基于Spring MVC的Web应用程序时,`web.xml`配置文件扮演着至关重要的角色。它定义了应用程序的行为,包括启动时的初始化、请求处理以及中间件的设置。下面我们将详细探讨`web.xml`中涉及Spring MVC的主要配置...

    Tomcat中用web.xml控制Web应用详解

    Tomcat 中用 web.xml 控制 Web 应用详解 Tomcat 中 web.xml 文件是 Web 应用的核心配置文件,负责管理 Web 应用的生命周期、Servlet 的加载顺序、Filter 的配置等。下面对 web.xml 文件中的重要元素进行详细解释。 ...

    web.xml配置详解.pdf

    web.xml 各属性作用描述 Web.xml 常用元素 &lt;web‐app&gt; ‐name&gt;‐name&gt;定义了WEB 应用的名字 &lt;description&gt;&lt;/description&gt; 声明WEB 应用的描述信息

    web.xml详解.xmind

    根据网上资料整理的web.xml详解思维导图。最开始是在整理的过程中学习,现在希望整理的这份资料能帮到一些新手小白。本人也是新人,如果有错误,发现有错误可以提出来。

    web.xml详解(web-app_2_3.dtd)

    ### web.xml详解(web-app_2_3.dtd) 在Java Web开发中,`web.xml`是部署描述文件的核心部分,它定义了Web应用程序的各种配置信息。本文将详细解析`web-app_2_3.dtd`中定义的主要元素及其作用,帮助开发者更好地...

Global site tag (gtag.js) - Google Analytics