部署描述符是JavaEE程序常见的一部分,但是之前都没有较为全面的学习过,这里就较为全面的记录一下部署描述符中的元素。部署一个Servlet 3 或以上应用程序是一件轻而易举的事。通过Servlet注解,对于不太复杂的应用程序,甚至可以部署没有描述符的Servlet/JSP应用程序。但是需要更加精细配置或是我们不能修改框架源码的情况,仍然需要部署描述符。首先,部署描述符必须命名为web.xml并位于WEB-INF目录下。Java类编译后class文件和配置文件都会放置在WEB-INF/classes目录下,而Java类库都放在WEB-INF/lib目录下,所有的应用程序资源打包成war为后缀的jar文件,这个war中包含WEB-INF(web.xml,  classes,lib),页面资源。

在存在如下场景,部署描述符不能少:

  • 需要传递全局初始化参数给ServletContext
  • 有多个过滤器,并要设置调用顺序
  • 需要修改会话超时设置
  • 需要限制资源的访问,并配置用户身份验证方式

首先来看看web.xml的头部声明:

<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
[metadata-complete="true|false"]
...
</web-app>

xsi:schemaLocation 属性指定了元素文档的位置,以便可以进行验证。version属性指定了Servlet规范的版本。

可选的metadata-complete属性指定部署描述符是否是完整的,若值为True,则Servlet/JSP容器将忽略Servlet注解。若值为False或不存在该值,则容器必须检查类文件的Servlet注解

web-app元素是文档的根元素,并且可以包含的如下子元素:

  • Servlet声明和映射
  • ServletContext的初始化参数
  • 会话配置
  • 监听器类
  • 过滤器声明和映射
  • MIME类型映射
  • 欢迎页面列表
  • 错误页面
  • JSP特定的设置
  • JNDI设置

核心元素#

在web-app的子元素可以以任何顺序出现。但某些元素,如session-config,jsp-config和login-config只能出现一次,而另一些元素,如Servlet,filter,welcome-file-list可以出现多次

context-param#

context-param元素作为全局初始化参数配置,可以传值给ServletContext。这些值可以被任何Servlet/JSP页面读取。context-param元素由名称/值构成,并可以通过调用ServletContext的getInitParameter方法来读取。可以定义多个context-param元素,每个参数名在本应用中必须唯一。ServletContext.getInitParameterNames()方法会返回所有的参数名称。

每一个context-param元素必须包含一个param-name元素和一个param-value元素。param-name定义参数名,而param-value定义参数值。另外还有一个可选的元素,即description元素,可用来描述参数。

    <context-param>
<param-name>location</param-name>
<param-value>localhost</param-value>
</context-param>
<context-param>
<param-name>port</param-name>
<param-value>8080</param-value>
<description>The port number userd</description>
</context-param>

distributable#

若定义了distributable元素,则表明应用程序已部署到分布式的Servlet/JSP容器。distributable元素属性为空:

<distributable/>

error-page#

error-page元素包含一个HTTP错误代码与资源路径或Java异常类型与资源路径之间的映射关系。error-page元素定义容器在特定的HTTP错误或异常时应返回的资源路径。

error-page元素由以下成分构成:

  • error-code,指定一个HTTP错误代码
  • exception-type,指定Java的异常类型(全路径名称)
  • location,指定要被显示的资源位置。该元素必须以“/”开始
<error-page>
<error-code>404</error-code>
<location>/error.html</location>
</error-page>
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/exception.html</location>
</error-page>

当出现HTTP404时,会显示位于应用程序目录下的error.html页面。发生ServletException会显示exception.html页面。

filter#

filter指定一个Servlet的过滤器。该元素至少包括一个filter-name元素和一个filter-class元素。此外,它还可以包含以下元素:icon,display-name,discription,init-param以及async-supported。

filter-name元素定义了过滤器的名称。过滤器名称必须全局唯一。filter-class元素指定过滤器类的全路径名称。可由init-param元素来配置过滤器的初始化参数(类似于<context-param>),一个过滤器可以配置多个init-param。

<filter>
<filter-name>UpperCaseFilter</filter-name>
<filter-class>cn.lynu.filter.UpperCaseFilter</filter-class>
</filter>
<filter>
<filter-name>IamgeFilter</filter-name>
<filter-class>cn.lynu.filter.ImageFilter</filter-class>
<init-param>
<param-name>frequency</param-name>
<param-value>2018</param-value>
</init-param>
<init-param>
<param-name>resolution</param-name>
<param-value>1024</param-value>
</init-param>
</filter>

filter-mapping#

过滤器映射元素时指定过滤器要被映射到的一个或多个资源。过滤器可以被映射到Servlet或者URL模式。过滤器映射元素中包含一个filter-name元素和一个url-pattern元素或者servlet-name元素。filter-name元素的值必须与filter元素声明的某一个过滤器名称相匹配。

<filter>
<filter-name>LoggingFilter</filter-name>
<filter-class>cn.lynu.filter.LoggingFilter</filter-class>
</filter>
<filter>
<filter-name>SecondFilter</filter-name>
<filter-class>cn.lynu.filter.SecondFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoggingFilter</filter-name>
<servlet-name>FirstServlet</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>SecondFilter</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>

第一个过滤器分别用于映射到一个Servlet上,第二个filter用于过滤所有请求

listener#

listener元素用于注册一个监听器。其子元素listener-class包含监听器类的全路径名

<listener>
<listener-class>cn.lynu.listener.AppListener</filter-class>
</listener>

Servlet#

Servlet元素当然是用于配置Servlet,包括如下子元素:

  • 一个可选的icon元素
  • 一个可选的description元素
  • 可选的display-name元素
  • 一个servlet-name元素
  • 一个servlet-class元素或一个jsp-file元素
  • 零个或更多的init-param元素
  • 一个可选的load-on-startup元素
  • 可选的run-as元素
  • 可选的enabled元素
  • 可选的async-supported元素
  • 可选的multipart-config元素
  • 零个或多个security-role-ref元素

一个Servlet元素至少必须包含一个servlet-name元素和一个servlet-class元素。或者一个servlet-name元素和一个jsp-file元素

servlet-name元素定义的Servlet名称在应用程序中必须是唯一的

servlet-class元素指定的类名为全路径名

jsp-file元素指定JSP页面的路径,该路径时应用程序的相对路径,必须以“/”开始

init-param的子元素可以用来传递一个初始化参数给Servlet。init-param结构同context-param

可以使用load-on-startup元素在当Servlet/JSP容器启动的时候自动加载Servlet。加载一个Servlet是指实例化Servlet和调用它的init方法。默认情况下,在第一次访问Servlet的时候才开始加载。load-on-startup可以指定一个整数值来指定加载顺序。多个Servlet都包含一个load-on-startup元素,则数值小的优先加载。如果两个Servlet具有相同的load-on-startup,则加载的顺序不能确定。

run-as用于覆盖调用EJB的安全标识。角色名是当前Web应用程序定义的安全角色之一

enabled元素也是一个可选的元素。它的值可以是True或False。设置子元素为False,则可以禁用这个Servlet

Servlet-mapping#

Servlet-mapping元素将一个Servlet映射到一个URL模式。该元素必须有一个servlet-name元素和url-pattern元素

    <servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--使用默认配置 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

locale-encoding-mapping-list和locale-encoding-mapping#

locale-encoding-mapping-list元素包含一个或多个locale-encoding-mapping元素。每个locale-encoding-mapping定义了locale以及编码的映射,分别用locale以及encoding元素定义。locale元素的值必须在ISO639中定义的与语言编码,如zh。或者采用“语言编码_国家编码”格式,如zh_CN。其中,国家编码的值必须在ISO3166中定义。

<locale-encoding-mapping-list>
<locale-encoding-mapping>
<locale>zh_CN</locale>
<encoding>UTF-8</encoding>
</locale-encoding-mapping>
</locale-encoding-mapping-list>

login-config#

login-config元素包括auth-method,realm-name以及form-login-config元素,每个元素都是可选的。

auth-method元素定义了认证方式,可选值为BASIC,DIGEST,FORM和CLIENT-CERT

realm-name元素定义用于BASIC以及DIGEST认证方式的realm名称

form-login-config则定义了用于FORM认证方式的登录页面和失败页面。如果没有采用FORM认证方式,则该元素被忽略。

form-login-config元素包括form-login-page和form-error-page两个子元素。form-login-page配置了显示登录页面的资源路径,路径为应用程序的相对路径,其必须以“/”开始。form-error-page则配置了失败时显示错误页面的资源路径,同样为相对于应用目录的,必须以“/”开始。

Dvelopment descriptor的更多相关文章

  1. eclipse 突然 一直在loading descriptor for XXX (XXX为工程名)Cancel Requested

    问题: eclipse 启动后,啥也不干,就一直在loading descriptor for XXX (XXX为工程名),,其他什么操作都不能操作. 如下图所示,保存文件也无法保存.  这个怎么办? ...

  2. eclipse 突然 一直在loading descriptor for XXX (XXX为工程名)

    问题: eclipse 启动后,啥也不干,就一直在loading descriptor for XXX (XXX为工程名),,其他什么操作都不能操作. 如下图所示,保存文件也无法保存.  这个怎么办? ...

  3. 【python】描述符descriptor

    开始看官方文档,各种看不懂,只看到一句Properties, bound and unbound methods, static methods, and class methods are all ...

  4. python中的 descriptor

    学好和用好python, descriptor是必须跨越过去的一个点,现在虽然Python书籍花样百出,但是似乎都是在介绍一些Python库而已,对Python语言本身的关注很少,或者即使关注了,但是 ...

  5. 近期编程问题——epoll failed:bad file descriptor

    出现问题:epoll_wait:Bad file descriptor 原因:IO时间的socket描述符在epoll_ctl处理前就关闭了. 解决方法:不要在epoll_ctl之前关闭socket描 ...

  6. 数据库服务器CPU持续百分之百、部分Session一直处于执行状态---等待事件为:asynch descriptor resize(Oracle Bug )

    问题描述: 项目反馈数据库服务器的CPU持续100%的情况,跟踪发现很多活动会话的等待事件是“asynch descriptor resize”,并且这些会话一直处于Active状态,而这些会话执行的 ...

  7. Python描述符(descriptor)解密(转)

    原文:http://www.geekfan.net/7862/ Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装 ...

  8. 56992 vuser_init.c(12): Error: Socket descriptor not found.

    Loadrunner 运行场景时提示" vuser_init.c(12): Error: Socket descriptor not found.  Hint: the problem mi ...

  9. 导入项目时Loading descriptor ...

    最近导入了一个项目,始终在Loading descriptor ...,很长时间都没有结束. 这是Eclipse在从java.sun.com的服务器上下载配置文件,下载速度过慢导致的,其实配置文件不是 ...

随机推荐

  1. win10 快速访问关闭

    1. 右键 --- 选项 2. 选择:此电脑

  2. Golang & GitLab-CI 详细实例步骤

    1.安装GitLab-Runner 1)curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi- ...

  3. 18 南京 D

    裸的最小球覆盖. 坐标范围大一些所以我们把初始的温度也设置的大一些. #include <bits/stdc++.h> using namespace std; typedef long ...

  4. 原码、补码,反码以及JAVA中数值采用哪种码表示

    原码.补码,反码以及JAVA中数值采用哪种码表示 1.原码定义(摘自百度百科):一种计算机中对数字的二进制定点表示方法,原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位 ...

  5. 查看linux系统的运行级别

    查看当前系统的运行级别[root@apenglinux ~]# runlevel3 5查看系统的默认级别[root@apenglinux ~]# systemctl get-defaultgraphi ...

  6. 文本编辑器vim和gedit

    vim和gedit都是文本编辑器 vim用法: vim 文件名 #打开文件 输入 i,进入文本编辑模式,编辑完再按ESC,退出编辑模式,再输:wq,保存退出:如果输:q!则是不保存退出,很简单.. 如 ...

  7. Jupyter notebook安装

    之前就装了jupyter notebook,但今天打开来发现是python2,并且似乎没法转换到python3??? so,再把python3的版本安装一下 打开CMD pip install jup ...

  8. td使用word-break: break-all;强制换行无效的解决

    今天发现表格内容不换行,加了word-break: break-all;也没有效果,后来检查发现用户编辑的html内容包含了CSS,其中有一项: td {padding-top:1px;padding ...

  9. 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex

    题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...

  10. Python idle运行代码出现'ascii' codec can't encode characters in position 0-2

    编码问题,采用一种方法: Python代码 ,开头加: import sys reload(sys) sys.setdefaultencoding('utf8') 在idle中运行后没错误,但是不显示 ...