Web.XML 配置详解

eclipse中提示xml标签

http://blog.csdn.net/sd2131512/article/details/5168276

http://blog.csdn.net/qq7342272/article/details/7274700

分类: JAVA

 

   看了下外面的资料。说是选择"window"-->"preferences"--->"Myeclipse Enterprise Workbench"-->"Files and Editors"-->"xml"-->"xml category"

 

   在user specified Entries中新增一个. (Location选择dtd文件在本地的路径,keytype选择uri,key选择xml中的dtd文件,比如http://struts.apache.org/dtds/strutss-2.0.dtd)




这篇文章的地址:http://blog.csdn.net/jupiter97/article/details/1584635

每一个站的WEB-INF下都有一个web.xml的设定文件,它提供了我们站台的配置设定.

web.xml定义:
 .站台的名称和说明
 .针对环境参数(Context)做初始化工作
 .Servlet的名称和映射
 .Session的设定
 .Tag library的对映
 .JSP网页设定
 .Mime Type处理
 .错误处理
 .利用JDNI取得站台资源

要了解web.xml的设定值,必须了解它的schema,从web.xml中知道它的schema是由Sum Microsystems公司定制的,如果你想更为详细的了解它,
可以到http://java.sun.com/xml/ns/j2ee/web-mapp_2_4.xsd网页,那里有更为详细的介绍。这里我介绍我们平常见得最都的.
  
<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
<web-app>
这是一般在写XML时所做的声明,定义了XML的版本,编码格式,还有重要的指明schema的来源,为http://java.sun.com/xml/ns/j2ee
/web-app_2_4.xsd.


<description>,<display-name>,<icon>
____________________________________________

<description>站台描述</discription>
对站台做出描述.

<display-name>站台名称</display-name>
定义站台的名称.

<icon>
icon元素包含small-icon和large-icon两个子元素.用来指定web站台中小图标和大图标的路径.
<small-icon>/路径/smallicon.gif</small-icon>
small-icon元素应指向web站台中某个小图标的路径,大小为16 X 16 pixel,但是图象文件必须为GIF或JPEG格式,扩展名必须为:.gif或
.jpg.

<large-icon>/路径/largeicon-jpg</large-icon>
large-icon元素应指向web站台中某个大图表路径,大小为32 X 32 pixel,但是图象文件必须为GIF或JPEG的格式,扩展名必须为; gif
或jpg.
范例:
<display-name>Develop Example</display-name>
<description>JSP 2.0 Tech Book's Examples</description>
<icon>
   <small-icon>/images/small.gif</small-icon>
   <large-icon>/images/large.gir</large-icon>
</icon>


<distributable>
______________________________________

<distributable>
distributable 元素为空标签,它的存在与否可以指定站台是否可分布式处理.如果web.xml中出现这个元素,则代表站台在开发时已经
被设计为能在多个JSP Container 之间分散执行.
范例:
<distributable/>

 

<context-param>
___________________________________

<context-param>
context-param 元素用来设定web站台的环境参数(context),它包含两个子元素:
param-name和param-value.
<param-name>参数名称</param-name>
设定Context名称
<param-value>值</param-value>
设定Context名称的值
</context-param>
范例:
<context-param>
   <param-name>param_name</param-name>
   <param-value>param_value</param-value>
</context-param>
此所设定的参数,在JSP网页中可以使用下列方法来取得:
${initParam.param_name}
若在Servlet可以使用下列方法来获得:
String param_name=getServletContext().getInitParamter("param_name");

 

<filter>
_________________________________
filter元素用来声明filter的相关设定.filter元素除了下面介绍的的子元素之外,还包括<servlet>介绍过的<icon>,<display-name>
,<description>,<init-param>,其用途一样.
<filter-name>Filter的名称</filter-name>
定义Filter的名称.
<filter-class>Filter的类名称</filter-class>
定义Filter的类名称.例如:com.foo.hello
</filter>
范例:
<filter>
  <filter-name>setCharacterEncoding</filter-name>
  <filter-class>coreservlet.javaworld.CH11.SetCharacterEncodingFilter</filter-class>
  <init-param>
     <param-name>encoding</param-name>
     <param-value>GB2312</param-value>
  </init-param>
</filter>


<filter-mapping>
______________________________________
<filter-mapping>
filter-mapping 元素的两个主要子元素filter-name和url-pattern.用来定义Filter所对应的URL.
<filter-name>Filter的名称</filter-name>
定义Filter的名称.
<url-pattern>URL</url-pattern>
Filter所对应的RUL.例如:<url-pattern>/Filter/Hello</url-pattern>

<servlet-name>Servlet的名称<servlet-name>
定义servlet的名称.
<dispatcher>REQUEST|INCLUDE|FORWARD|ERROR</disaptcher>
设定Filter对应的请求方式,有RQUEST,INCLUDE,FORWAR,ERROR四种,默认为REQUEST.
</filter-mapping>
范例:
<filter-mapping>
   <filter-name>GZIPEncoding</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

 

<listener>
___________________________________________
<listener>
listener元素用来定义Listener接口,它的主要子元素为<listener-class>
<listen-class>Listener的类名称</listener-class>
定义Listener的类名称.例如: com.foo.hello
<listener>
范例:
<listener>
  <listener-class>coreservlet.javaworld.CH11.ContenxtListener</listener-class>
</listener>

 

<servlet-mapping>
_____________________________________________
servlet-mapping元素包含两个子元素servlet-name和url-pattern.用来定义servlet所对应URL.
<servlet-name>Servlet的名称</servlet-name>
定义Servlet的名称.
<url-pattern>Servlet URL</url-pattern>
定义Servlet所对应的RUL.例如:<url-pattern>/Servlet/Hello</url-pattern>
</servlet-mapping>
范例:
<servlet-mapping>
   <servlet-name>LoginChecker</servlet-name>
   <url-pattern>/LoginChecker</url-pattern>
</servlet-mapping>


<session-cofing>
__________________________________
<session-config>
session-config包含一个子元素session-timeout.定义web站台中的session参数.
<session-timeout>分钟</session-timeout>
定义这个web站台所有session的有效期限.单位为分钟.
</session-config>
范例:
<session-config>
   <session-timeout>20</session-timeout>
</session-config>


<mime-mapping>
___________________________________________________
<mima-mapping>
mime-mapping包含两个子元素extension和mime-type.定义某一个扩展名和某一MIME Type做对映.
<extension>扩展名名称</extension>
扩展名称
<mime-type>MIME格式</mime-type>
MIME格式.
</mime-mapping>
范例:
<mime-mapping>
   <extension>doc</extension>
   <mime-type>application/vnd.ms-word</mime-type>
</mime-mapping>
<mime-mapping>
   <extension>xls</extension>
   <mime-type>application/vnd.ms-excel</mime-type>
</mime-mapping>
<mime-mapping>
   <extension>ppt</extesnion>
   <mime-type>application/vnd.ms-powerpoint</mime-type>
</mime-mapping>


<welcome-file-list>
_____________________________________________
<welcome-file-list>
welcome-file-list包含一个子元素welcome-file.用来定义首页列单.
<welcome-file>用来指定首页文件名称</welcome-flie>
welcome-file用来指定首页文件名称.我们可以用<welcome-file>指定几个首页,而服务器会依照设定的顺序来找首页.
范例:
<welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>index.htm</welcome-file>
</welcome-file-list>

 

<error-page>
_________________________
<error-page>
error-page元素包含三个子元素error-code,exception-type和location.将错误代码(Error Code)或异常(Exception)的种类对应
到web站台资源路径.
<error-code>错误代码</error-code>
HTTP Error code,例如: 404
<exception-type>Exception</exception-type>
一个完整名称的Java异常类型
<location>/路径</location>
在web站台内的相关资源路径
</error-page>
范例:
<error-page>
   <error-code>404</error-code>
   <location>/error404.jsp</location>
</error-page>
<error-page>
   <exception-type>java.lang.Exception</exception-type>
   <location>/except.jsp</location>
</error-page>

 

<jsp-config>
_______________________________________________
<jsp-config>
jsp-config元素主要用来设定JSP的相关配置,<jsp:config>包括<taglib>和<jsp-property-group>两个子元素.其中<taglib>元素
在JSP 1.2时就已经存在了;而<jsp-property-group>是JSP 2.0新增的元素.

<taglib>
taglib元素包含两个子元素taglib-uri和taglib-location.用来设定JSP网页用到的Tag Library路径.
<taglib-uri>URI</taglib-uri>
   taglib-uri定义TLD文件的URI,JSP网页的taglib指令可以经由这个URI存取到TLD文件.
<taglib-location>/WEB-INF/lib/xxx.tld</taglib-laction>
   TLD文件对应Web站台的存放位置.
</taglib>

<jsp-property-group>
jsp-property-group元素包含8个元素,分别为:
<description>Description</descrition>
此设定的说明

<display-name>Name</display-name>
此设定的名称

<url-pattern>URL</url-pattern>
设定值所影响的范围,如:/CH2 或者/*.jsp

<el-ignored>true|false</el-ignored>
若为true,表示不支持EL语法.

<scripting-invalid>true|false</scripting-invalid>
若为true表示不支持<%scription%>语法.

<page-encoding>encoding</page-encoding>
设定JSP网页的编码

<include-prelude>.jspf</include-prelude>
设置JSP网页的抬头,扩展名为.jspf

<include-coda>.jspf</include-coda>
设置JSP网页的结尾,扩展名为.jspf
</jsp-property-group>
</jsp-config>
范例:
<jsp-config>
<taglib>
   <taglib-uri>Taglib</taglib-uri>
   <taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location>
</taglib>
<jsp-property-group>
   <description>
      Special property group for JSP Configuration JSP example.
   </description>
   <display-name>JSPConfiguration</display-name>
   <uri-pattern>/*</uri-pattern>
   <el-ignored>true</el-ignored>
   <page-encoding>GB2312</page-encoding>
   <scripting-inivalid>true</scripting-inivalid>
   ............
</jsp-property-group>
</jsp-config>

 

<resource-ref>
________________________________________________
<resource-ref>
resource-ref元素包括五个子元素description,res-ref-name,res-type,res-auth,res-sharing-scope.利用JNDI取得站台可
利用资源.
<description>说明</description>
资源说明

<rec-ref-name>资源名称</rec-ref-name>
资源名称

<res-type>资源种类</res-type>
资源种类

<res-auth>Application|Container</res-auth>
资源由Application或Container来许可

<res-sharing-scope>Shareable|Unshareable</res-sharing-scope>
 资源是否可以共享.默认值为 Shareable
范例:
<resource-ref>
   <description>JNDI JDBC DataSource of JSPBook</description>
   <res-ref-name>jdbc/sample_db</res-ref-name>
   <res-type>javax.sql.DataSoruce</res-type>
   <res-auth>Container</res-auth>
</resource-ref>

这些都是些比较常用的,详细可以登录: http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd

























这篇文章的地址:http://peter-kong.iteye.com/blog/41572

关于web.xml配置的详细说明

(转载)[TOMCAT]用web.xml控制Web应用的行为

1 定义头和根元素

部署描述符文件就像所有XML文件一样,必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。
DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本(如2.2或2.3)并指定管理此文件其余部分内容的语法的DTD(Document Type Definition,文档类型定义)。
所有部署描述符文件的顶层(根)元素为web-app。请注意,XML元素不像HTML,他们是大小写敏感的。因此,web-App和WEB-APP都是不合法的,web-app必须用小写。

2 部署描述符文件内的元素次序

XML 元素不仅是大小写敏感的,而且它们还对出现在其他元素中的次序敏感。例如,XML头必须是文件中的第一项,DOCTYPE声明必须是第二项,而web- app元素必须是第三项。在web-app元素内,元素的次序也很重要。服务器不一定强制要求这种次序,但它们允许(实际上有些服务器就是这样做的)完全拒绝执行含有次序不正确的元素的Web应用。这表示使用非标准元素次序的web.xml文件是不可移植的。
下面的列表给出了所有可直接出现在web-app元素内的合法元素所必需的次序。例如,此列表说明servlet元素必须出现在所有servlet-mapping元素之前。请注意,所有这些元素都是可选的。因此,可以省略掉某一元素,但不能把它放于不正确的位置。
l icon icon元素指出IDE和GUI工具用来表示Web应用的一个和两个图像文件的位置。
l display-name display-name元素提供GUI工具可能会用来标记这个特定的Web应用的一个名称。
l description description元素给出与此有关的说明性文本。
l context-param context-param元素声明应用范围内的初始化参数。
l filter 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。
l filter-mapping 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。
l listener servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。
l servlet 在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。
l servlet-mapping 服务器一般为servlet提供一个缺省的URL:http://host/webAppPrefix/servlet/ServletName。但是,常常会更改这个URL,以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。
l session-config 如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,或者可利用session-config元素制定缺省超时值。
l mime-mapping 如果Web应用具有想到特殊的文件,希望能保证给他们分配特定的MIME类型,则mime-mapping元素提供这种保证。
l welcom-file-list welcome-file-list元素指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件。
l error-page error-page元素使得在返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面。
l taglib taglib元素对标记库描述符文件(Tag Libraryu Descriptor file)指定别名。此功能使你能够更改TLD文件的位置,而不用编辑使用这些文件的JSP页面。
l resource-env-ref resource-env-ref元素声明与资源相关的一个管理对象。
l resource-ref resource-ref元素声明一个资源工厂使用的外部资源。
l security-constraint security-constraint元素制定应该保护的URL。它与login-config元素联合使用
l login-config 用login-config元素来指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。
l security-role security-role元素给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。
l env-entry env-entry元素声明Web应用的环境项。
l ejb-ref ejb-ref元素声明一个EJB的主目录的引用。
l ejb-local-ref ejb-local-ref元素声明一个EJB的本地主目录的应用。

3 分配名称和定制的UL

在web.xml中完成的一个最常见的任务是对servlet或JSP页面给出名称和定制的URL。用servlet元素分配名称,使用servlet-mapping元素将定制的URL与刚分配的名称相关联。
3.1 分配名称
为了提供初始化参数,对servlet或JSP页面定义一个定制URL或分配一个安全角色,必须首先给servlet或JSP页面一个名称。可通过 servlet元素分配一个名称。最常见的格式包括servlet-name和servlet-class子元素(在web-app元素内),如下所示:
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>moreservlets.TestServlet</servlet-class>
</servlet>
这表示位于WEB-INF/classes/moreservlets/TestServlet的servlet已经得到了注册名Test。给 servlet一个名称具有两个主要的含义。首先,初始化参数、定制的URL模式以及其他定制通过此注册名而不是类名引用此servlet。其次,可在 URL而不是类名中使用此名称。因此,利用刚才给出的定义,URL http://host/webAppPrefix/servlet/Test 可用于 http://host/webAppPrefix/servlet/moreservlets.TestServlet 的场所。
请记住:XML元素不仅是大小写敏感的,而且定义它们的次序也很重要。例如,web-app元素内所有servlet元素必须位于所有servlet- mapping元素(下一小节介绍)之前,而且还要位于5.6节和5.11节讨论的与过滤器或文档相关的元素(如果有的话)之前。类似地,servlet 的servlet-name子元素也必须出现在servlet-class之前。5.2节"部署描述符文件内的元素次序"将详细介绍这种必需的次序。
例如,程序清单5-1给出了一个名为TestServlet的简单servlet,它驻留在moreservlets程序包中。因为此servlet是扎根在一个名为deployDemo的目录中的Web应用的组成部分,所以TestServlet.class放在deployDemo/WEB- INF/classes/moreservlets中。程序清单5-2给出将放置在deployDemo/WEB-INF/内的web.xml文件的一部分。此web.xml文件使用servlet-name和servlet-class元素将名称Test与TestServlet.class相关联。图 5-1和图5-2分别显示利用缺省URL和注册名调用TestServlet时的结果。

程序清单5-1 TestServlet.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Simple servlet used to illustrate servlet naming
* and custom URLs.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/

public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String uri = request.getRequestURI();
out.println(ServletUtilities.headWithTitle("Test Servlet") +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H2>URI: " + uri + "</H2>\n" +
"</BODY></HTML>");
}
}


程序清单5-2 web.xml(说明servlet名称的摘录)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- … -->
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>moreservlets.TestServlet</servlet-class>
</servlet>
<!-- … -->
</web-app>

3.2 定义定制的URL
大多数服务器具有一个缺省的serlvet URL:
http://host/webAppPrefix/servlet/packageName.ServletName。虽然在开发中使用这个URL很方便,但是我们常常会希望另一个URL用于部署。例如,可能会需要一个出现在Web应用顶层的URL(如,http: //host/webAppPrefix/Anyname),并且在此URL中没有servlet项。位于顶层的URL简化了相对URL的使用。此外,对许多开发人员来说,顶层URL看上去比更长更麻烦的缺省URL更简短。
事实上,有时需要使用定制的URL。比如,你可能想关闭缺省URL映射,以便更好地强制实施安全限制或防止用户意外地访问无初始化参数的servlet。如果你禁止了缺省的URL,那么你怎样访问servlet呢?这时只有使用定制的URL了。
为了分配一个定制的URL,可使用servlet-mapping元素及其servlet-name和url-pattern子元素。Servlet- name元素提供了一个任意名称,可利用此名称引用相应的servlet;url-pattern描述了相对于Web应用的根目录的URL。url- pattern元素的值必须以斜杠(/)起始。
下面给出一个简单的web.xml摘录,它允许使用URL http://host/webAppPrefix/UrlTest而不是http://host/webAppPrefix/servlet/Test或
http: //host/webAppPrefix/servlet/moreservlets.TestServlet。请注意,仍然需要XML头、 DOCTYPE声明以及web-app封闭元素。此外,可回忆一下,XML元素出现地次序不是随意的。特别是,需要把所有servlet元素放在所有 servlet-mapping元素之前。
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>moreservlets.TestServlet</servlet-class>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/UrlTest</url-pattern>
</servlet-mapping>
URL模式还可以包含通配符。例如,下面的小程序指示服务器发送所有以Web应用的URL前缀开始,以..asp结束的请求到名为BashMS的servlet。
<servlet>
<servlet-name>BashMS</servlet-name>
<servlet-class>msUtils.ASPTranslator</servlet-class>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name>BashMS</servlet-name>
<url-pattern>/*.asp</url-pattern>
</servlet-mapping>
3.3 命名JSP页面
因为JSP页面要转换成sevlet,自然希望就像命名servlet一样命名JSP页面。毕竟,JSP页面可能会从初始化参数、安全设置或定制的URL中受益,正如普通的serlvet那样。虽然JSP页面的后台实际上是servlet这句话是正确的,但存在一个关键的猜疑:即,你不知道JSP页面的实际类名(因为系统自己挑选这个名字)。因此,为了命名JSP页面,可将jsp-file元素替换为servlet-calss元素,如下所示:
<servlet>
<servlet-name>Test</servlet-name>
<jsp-file>/TestPage.jsp</jsp-file>
</servlet>
命名JSP页面的原因与命名servlet的原因完全相同:即为了提供一个与定制设置(如,初始化参数和安全设置)一起使用的名称,并且,以便能更改激活 JSP页面的URL(比方说,以便多个URL通过相同页面得以处理,或者从URL中去掉.jsp扩展名)。但是,在设置初始化参数时,应该注意,JSP页面是利用jspInit方法,而不是init方法读取初始化参数的。
例如,程序清单5-3给出一个名为TestPage.jsp的简单JSP页面,它的工作只是打印出用来激活它的URL的本地部分。TestPage.jsp放置在deployDemo应用的顶层。程序清单5-4给出了用来分配一个注册名PageName,然后将此注册名与http://host/webAppPrefix/UrlTest2/anything 形式的URL相关联的web.xml文件(即,deployDemo/WEB-INF/web.xml)的一部分。

程序清单5-3 TestPage.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>
JSP Test Page
</TITLE>
</HEAD>
<BODY BGCOLOR="#FDF5E6">
<H2>URI: <%= request.getRequestURI() %></H2>
</BODY>
</HTML>


程序清单5-4 web.xml(说明JSP页命名的摘录)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<servlet>
<servlet-name>PageName</servlet-name>
<jsp-file>/TestPage.jsp</jsp-file>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name> PageName </servlet-name>
<url-pattern>/UrlTest2/*</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>


4 禁止激活器servlet

对servlet 或JSP页面建立定制URL的一个原因是,这样做可以注册从 init(servlet)或jspInit(JSP页面)方法中读取得初始化参数。但是,初始化参数只在是利用定制URL模式或注册名访问 servlet或JSP页面时可以使用,用缺省URL http://host/webAppPrefix/servlet/ServletName 访问时不能使用。因此,你可能会希望关闭缺省URL,这样就不会有人意外地调用初始化servlet了。这个过程有时称为禁止激活器servlet,因为多数服务器具有一个用缺省的servlet URL注册的标准servlet,并激活缺省的URL应用的实际servlet。
有两种禁止此缺省URL的主要方法:
l 在每个Web应用中重新映射/servlet/模式。
l 全局关闭激活器servlet。
重要的是应该注意到,虽然重新映射每个Web应用中的/servlet/模式比彻底禁止激活servlet所做的工作更多,但重新映射可以用一种完全可移植的方式来完成。相反,全局禁止激活器servlet完全是针对具体机器的,事实上有的服务器(如ServletExec)没有这样的选择。下面的讨论对每个Web应用重新映射/servlet/ URL模式的策略。后面提供在Tomcat中全局禁止激活器servlet的详细内容。
4.1 重新映射/servlet/URL模式
在一个特定的Web应用中禁止以http://host/webAppPrefix/servlet/ 开始的URL的处理非常简单。所需做的事情就是建立一个错误消息servlet,并使用前一节讨论的url-pattern元素将所有匹配请求转向该 servlet。只要简单地使用:
<url-pattern>/servlet/*</url-pattern>
作为servlet-mapping元素中的模式即可。
例如,程序清单5-5给出了将SorryServlet servlet(程序清单5-6)与所有以http://host/webAppPrefix/servlet/ 开头的URL相关联的部署描述符文件的一部分。

程序清单5-5 web.xml(说明JSP页命名的摘录)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<servlet>
<servlet-name>Sorry</servlet-name>
<servlet-class>moreservlets.SorryServlet</servlet-class>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name> Sorry </servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>


程序清单5-6 SorryServlet.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Simple servlet used to give error messages to
* users who try to access default servlet URLs
* (i.e., http://host/webAppPrefix/servlet/ServletName)
* in Web applications that have disabled this
* behavior.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/

public class SorryServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Invoker Servlet Disabled.";
out.println(ServletUtilities.headWithTitle(title) +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H2>" + title + "</H2>\n" +
"Sorry, access to servlets by means of\n" +
"URLs that begin with\n" +
"http://host/webAppPrefix/servlet/\n" +
"has been disabled.\n" +
"</BODY></HTML>");
}

public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}


4.2 全局禁止激活器:Tomcat
Tomcat 4中用来关闭缺省URL的方法与Tomcat 3中所用的很不相同。下面介绍这两种方法:
1.禁止激活器: Tomcat 4
Tomcat 4用与前面相同的方法关闭激活器servlet,即利用web.xml中的url-mapping元素进行关闭。不同之处在于Tomcat使用了放在 install_dir/conf中的一个服务器专用的全局web.xml文件,而前面使用的是存放在每个Web应用的WEB-INF目录中的标准 web.xml文件。
因此,为了在Tomcat 4中关闭激活器servlet,只需在install_dir/conf/web.xml中简单地注释出/servlet/* URL映射项即可,如下所示:
<!--
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
-->
再次提醒,应该注意这个项是位于存放在install_dir/conf的Tomcat专用的web.xml文件中的,此文件不是存放在每个Web应用的WEB-INF目录中的标准web.xml。
2.禁止激活器:Tomcat3
在Apache Tomcat的版本3中,通过在install_dir/conf/server.xml中注释出InvokerInterceptor项全局禁止缺省 servlet URL。例如,下面是禁止使用缺省servlet URL的server.xml文件的一部分。
<!--
<RequsetInterceptor
className="org.apache.tomcat.request.InvokerInterceptor"
debug="0" prefix="/servlet/" />
-->

5 初始化和预装载servlet与JSP页面

这里讨论控制servlet和JSP页面的启动行为的方法。特别是,说明了怎样分配初始化参数以及怎样更改服务器生存期中装载servlet和JSP页面的时刻。
5.1 分配servlet初始化参数
利用init-param元素向servlet提供初始化参数,init-param元素具有param-name和param-value子元素。例如,在下面的例子中,如果initServlet servlet是利用它的注册名(InitTest)访问的,它将能够从其方法中调用getServletConfig(). getInitParameter("param1")获得"Value 1",调用getServletConfig().getInitParameter("param2")获得"2"。
<servlet>
<servlet-name>InitTest</servlet-name>
<servlet-class>moreservlets.InitServlet</servlet-class>
<init-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</init-param>
<init-param>
<param-name>param2</param-name>
<param-value>2</param-value>
</init-param>
</servlet>
在涉及初始化参数时,有几点需要注意:
l 返回值。GetInitParameter的返回值总是一个String。因此,在前一个例子中,可对param2使用Integer.parseInt获得一个int。
l JSP中的初始化。JSP页面使用jspInit而不是init。JSP页面还需要使用jsp-file元素代替servlet-class。
l 缺省URL。初始化参数只在通过它们的注册名或与它们注册名相关的定制URL模式访问Servlet时可以使用。因此,在这个例子中,param1和 param2初始化参数将能够在使用URL http://host/webAppPrefix/servlet/InitTest 时可用,但在使用URL http://host/webAppPrefix/servlet/myPackage.InitServlet 时不能使用。
例如,程序清单5-7给出一个名为InitServlet的简单servlet,它使用init方法设置firstName和emailAddress字段。程序清单5-8给出分配名称InitTest给servlet的web.xml文件。
程序清单5-7 InitServlet.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Simple servlet used to illustrate servlet
* initialization parameters.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/

public class InitServlet extends HttpServlet {
private String firstName, emailAddress;

public void init() {
ServletConfig config = getServletConfig();
firstName = config.getInitParameter("firstName");
emailAddress = config.getInitParameter("emailAddress");
}

public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String uri = request.getRequestURI();
out.println(ServletUtilities.headWithTitle("Init Servlet") +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H2>Init Parameters:</H2>\n" +
"<UL>\n" +
"<LI>First name: " + firstName + "\n" +
"<LI>Email address: " + emailAddress + "\n" +
"</UL>\n" +
"</BODY></HTML>");
}
}


程序清单5-8 web.xml(说明初始化参数的摘录)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<servlet>
<servlet-name>InitTest</servlet-name>
<servlet-class>moreservlets.InitServlet</servlet-class>
<init-param>
<param-name>firstName</param-name>
<param-value>Larry</param-value>
</init-param>
<init-param>
<param-name>emailAddress</param-name>
<param-value>Ellison@Microsoft.com</param-value>
</init-param>
</servlet>
<!-- ... -->
</web-app>

5.2 分配JSP初始化参数
给JSP页面提供初始化参数在三个方面不同于给servlet提供初始化参数。
1)使用jsp-file而不是servlet-class。因此,WEB-INF/web.xml文件的servlet元素如下所示:
<servlet>
<servlet-name>PageName</servlet-name>
<jsp-file>/RealPage.jsp</jsp-file>
<init-param>
<param-name>...</param-name>
<param-value>...</param-value>
</init-param>
...
</servlet>
2) 几乎总是分配一个明确的URL模式。对servlet,一般相应地使用以http://host/webAppPrefix/servlet/ 开始的缺省URL。只需记住,使用注册名而不是原名称即可。这对于JSP页面在技术上也是合法的。例如,在上面给出的例子中,可用URL http://host/webAppPrefix/servlet/PageName 访问RealPage.jsp的对初始化参数具有访问权的版本。但在用于JSP页面时,许多用户似乎不喜欢应用常规的servlet的URL。此外,如果 JSP页面位于服务器为其提供了目录清单的目录中(如,一个既没有index.html也没有index.jsp文件的目录),则用户可能会连接到此 JSP页面,单击它,从而意外地激活未初始化的页面。因此,好的办法是使用url-pattern(5.3节)将JSP页面的原URL与注册的 servlet名相关联。这样,客户机可使用JSP页面的普通名称,但仍然激活定制的版本。例如,给定来自项目1的servlet定义,可使用下面的 servlet-mapping定义:
<servlet-mapping>
<servlet-name>PageName</servlet-name>
<url-pattern>/RealPage.jsp</url-pattern>
</servlet-mapping>
3)JSP页使用jspInit而不是init。自动从JSP页面建立的servlet或许已经使用了inti方法。因此,使用JSP声明提供一个init方法是不合法的,必须制定jspInit方法。
为了说明初始化JSP页面的过程,程序清单5-9给出了一个名为InitPage.jsp的JSP页面,它包含一个jspInit方法且放置于 deployDemo Web应用层次结构的顶层。一般,http://host/deployDemo/InitPage.jsp 形式的URL将激活此页面的不具有初始化参数访问权的版本,从而将对firstName和emailAddress变量显示null。但是, web.xml文件(程序清单5-10)分配了一个注册名,然后将该注册名与URL模式/InitPage.jsp相关联。

程序清单5-9 InitPage.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>JSP Init Test</TITLE></HEAD>
<BODY BGCOLOR="#FDF5E6">
<H2>Init Parameters:</H2>
<UL>
<LI>First name: <%= firstName %>
<LI>Email address: <%= emailAddress %>
</UL>
</BODY></HTML>
<%!
private String firstName, emailAddress;

public void jspInit() {
ServletConfig config = getServletConfig();
firstName = config.getInitParameter("firstName");
emailAddress = config.getInitParameter("emailAddress");
}
%>


程序清单5-10 web.xml(说明JSP页面的init参数的摘录)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<servlet>
<servlet-name>InitPage</servlet-name>
<jsp-file>/InitPage.jsp</jsp-file>
<init-param>
<param-name>firstName</param-name>
<param-value>Bill</param-value>
</init-param>
<init-param>
<param-name>emailAddress</param-name>
<param-value>gates@oracle.com</param-value>
</init-param>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name> InitPage</servlet-name>
<url-pattern>/InitPage.jsp</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>


5.3 提供应用范围内的初始化参数
一般,对单个地servlet或JSP页面分配初始化参数。指定的servlet或JSP页面利用ServletConfig的 getInitParameter方法读取这些参数。但是,在某些情形下,希望提供可由任意servlet或JSP页面借助ServletContext 的getInitParameter方法读取的系统范围内的初始化参数。
可利用context-param元素声明这些系统范围内的初始化值。context-param元素应该包含param-name、param-value以及可选的description子元素,如下所示:
<context-param>
<param-name>support-email</param-name>
<param-value>blackhole@mycompany.com</param-value>
</context-param>
可回忆一下,为了保证可移植性,web.xml内的元素必须以正确的次序声明。但这里应该注意,context-param元素必须出现任意与文档有关的元素(icon、display-name或description)之后及filter、filter-mapping、listener或 servlet元素之前。
5.4 在服务器启动时装载servlet
假如servlet或JSP页面有一个要花很长时间执行的init (servlet)或jspInit(JSP)方法。例如,假如init或jspInit方法从某个数据库或ResourceBundle查找产量。这种情况下,在第一个客户机请求时装载servlet的缺省行为将对第一个客户机产生较长时间的延迟。因此,可利用servlet的load-on- startup元素规定服务器在第一次启动时装载servlet。下面是一个例子。
<servlet>
<servlet-name> … </servlet-name>
<servlet-class> … </servlet-class> <!-- Or jsp-file -->
<load-on-startup/>
</servlet>
可以为此元素体提供一个整数而不是使用一个空的load-on-startup。想法是服务器应该在装载较大数目的servlet或JSP页面之前装载较少数目的servlet或JSP页面。例如,下面的servlet项(放置在Web应用的WEB-INF目录下的web.xml文件中的web-app元素内)将指示服务器首先装载和初始化SearchServlet,然后装载和初始化由位于Web应用的result目录中的index.jsp文件产生的 servlet。
<servlet>
<servlet-name>Search</servlet-name>
<servlet-class>myPackage.SearchServlet</servlet-class> <!-- Or jsp-file -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>Results</servlet-name>
<servlet-class>/results/index.jsp</servlet-class> <!-- Or jsp-file -->
<load-on-startup>2</load-on-startup>
</servlet>

6 声明过滤器

servlet版本2.3引入了过滤器的概念。虽然所有支持servlet API版本2.3的服务器都支持过滤器,但为了使用与过滤器有关的元素,必须在web.xml中使用版本2.3的DTD。
过滤器可截取和修改进入一个servlet或JSP页面的请求或从一个servlet或JSP页面发出的相应。在执行一个servlet或JSP页面之前,必须执行第一个相关的过滤器的doFilter方法。在该过滤器对其FilterChain对象调用doFilter时,执行链中的下一个过滤器。如果没有其他过滤器,servlet或JSP页面被执行。过滤器具有对到来的ServletRequest对象的全部访问权,因此,它们可以查看客户机名、查找到来的cookie等。为了访问servlet或JSP页面的输出,过滤器可将响应对象包裹在一个替身对象(stand-in object)中,比方说把输出累加到一个缓冲区。在调用FilterChain对象的doFilter方法之后,过滤器可检查缓冲区,如有必要,就对它进行修改,然后传送到客户机。
例如,程序清单5-11帝国难以了一个简单的过滤器,只要访问相关的servlet或JSP页面,它就截取请求并在标准输出上打印一个报告(开发过程中在桌面系统上运行时,大多数服务器都可以使用这个过滤器)。

程序清单5-11 ReportFilter.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

/** Simple filter that prints a report on the standard output
* whenever the associated servlet or JSP page is accessed.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/

public class ReportFilter implements Filter {
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest)request;
System.out.println(req.getRemoteHost() +
" tried to access " +
req.getRequestURL() +
" on " + new Date() + ".");
chain.doFilter(request,response);
}

public void init(FilterConfig config)
throws ServletException {
}

public void destroy() {}
}

一旦建立了一个过滤器,可以在web.xml中利用filter元素以及filter-name(任意名称)、file-class(完全限定的类名)和(可选的)init-params子元素声明它。请注意,元素在web.xml的web-app元素中出现的次序不是任意的;允许服务器(但不是必需的)强制所需的次序,并且实际中有些服务器也是这样做的。但这里要注意,所有filter元素必须出现在任意filter-mapping元素之前, filter-mapping元素又必须出现在所有servlet或servlet-mapping元素之前。
例如,给定上述的ReportFilter类,可在web.xml中作出下面的filter声明。它把名称Reporter与实际的类ReportFilter(位于moreservlets程序包中)相关联。
<filter>
<filter-name>Reporter</filter-name>
<filter-class>moresevlets.ReportFilter</filter-class>
</filter>
一旦命名了一个过滤器,可利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。关于此项工作有两种选择。
首先,可使用filter-name和servlet-name子元素把此过滤器与一个特定的servlet名(此servlet名必须稍后在相同的 web.xml文件中使用servlet元素声明)关联。例如,下面的程序片断指示系统只要利用一个定制的URL访问名为SomeServletName 的servlet或JSP页面,就运行名为Reporter的过滤器。
<filter-mapping>
<filter-name>Reporter</filter-name>
<servlet-name>SomeServletName</servlet-name>
</filter-mapping>
其次,可利用filter-name和url-pattern子元素将过滤器与一组servlet、JSP页面或静态内容相关联。例如,相面的程序片段指示系统只要访问Web应用中的任意URL,就运行名为Reporter的过滤器。
<filter-mapping>
<filter-name>Reporter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
例如,程序清单5-12给出了将ReportFilter过滤器与名为PageName的servlet相关联的web.xml文件的一部分。名字 PageName依次又与一个名为TestPage.jsp的JSP页面以及以模式http: //host/webAppPrefix/UrlTest2/ 开头的URL相关联。TestPage.jsp的源代码已经JSP页面命名的谈论在前面的3节"分配名称和定制的URL"中给出。事实上,程序清单5- 12中的servlet和servlet-name项从该节原封不动地拿过来的。给定这些web.xml项,可看到下面的标准输出形式的调试报告(换行是为了容易阅读)。
audit.irs.gov tried to access
http://mycompany.com/deployDemo/UrlTest2/business/tax-plan.html
on Tue Dec 25 13:12:29 EDT 2001.

程序清单5-12 Web.xml(说明filter用法的摘录)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<filter>
<filter-name>Reporter</filter-name>
<filter-class>moresevlets.ReportFilter</filter-class>
</filter>
<!-- ... -->
<filter-mapping>
<filter-name>Reporter</filter-name>
<servlet-name>PageName</servlet-name>
</filter-mapping>
<!-- ... -->
<servlet>
<servlet-name>PageName</servlet-name>
<jsp-file>/RealPage.jsp</jsp-file>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name> PageName </servlet-name>
<url-pattern>/UrlTest2/*</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>


7 指定欢迎页

假如用户提供了一个像http: //host/webAppPrefix/directoryName/ 这样的包含一个目录名但没有包含文件名的URL,会发生什么事情呢?用户能得到一个目录表?一个错误?还是标准文件的内容?如果得到标准文件内容,是 index.html、index.jsp、default.html、default.htm或别的什么东西呢?
Welcome-file-list 元素及其辅助的welcome-file元素解决了这个模糊的问题。例如,下面的web.xml项指出,如果一个URL给出一个目录名但未给出文件名,服务器应该首先试用index.jsp,然后再试用index.html。如果两者都没有找到,则结果有赖于所用的服务器(如一个目录列表)。
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
虽然许多服务器缺省遵循这种行为,但不一定必须这样。因此,明确地使用welcom-file-list保证可移植性是一种良好的习惯。

8 指定处理错误的页面

现在我了解到,你在开发servlet和JSP页面时从不会犯错误,而且你的所有页面是那样的清晰,一般的程序员都不会被它们的搞糊涂。但是,是人总会犯错误的,用户可能会提供不合规定的参数,使用不正确的URL或者不能提供必需的表单字段值。除此之外,其它开发人员可能不那么细心,他们应该有些工具来克服自己的不足。
error-page元素就是用来克服这些问题的。它有两个可能的子元素,分别是:error-code和exception- type。第一个子元素error-code指出在给定的HTTP错误代码出现时使用的URL。第二个子元素excpetion-type指出在出现某个给定的Java异常但未捕捉到时使用的URL。error-code和exception-type都利用location元素指出相应的URL。此 URL必须以/开始。location所指出的位置处的页面可通过查找HttpServletRequest对象的两个专门的属性来访问关于错误的信息,这两个属性分别是:javax.servlet.error.status_code和javax.servlet.error.message。
可回忆一下,在web.xml内以正确的次序声明web-app的子元素很重要。这里只要记住,error-page出现在web.xml文件的末尾附近,servlet、servlet-name和welcome-file-list之后即可。

8.1 error-code元素
为了更好地了解error-code元素的值,可考虑一下如果不正确地输入文件名,大多数站点会作出什么反映。这样做一般会出现一个404错误信息,它表示不能找到该文件,但几乎没提供更多有用的信息。另一方面,可以试一下在www.microsoft.com、www.ibm.com 处或者特别是在www.bea.com 处输出未知的文件名。这是会得出有用的消息,这些消息提供可选择的位置,以便查找感兴趣的页面。提供这样有用的错误页面对于Web应用来说是很有价值得。事实上rm-error-page子元素)。由form-login-page给出的HTML表单必须具有一个j_security_check的 ACTION属性、一个名为j_username的用户名文本字段以及一个名为j_password的口令字段。
例如,程序清单5-19指示服务器使用基于表单的验证。Web应用的顶层目录中的一个名为login.jsp的页面将收集用户名和口令,并且失败的登陆将由相同目录中名为login-error.jsp的页面报告。

程序清单5-19 web.xml(说明login-config的摘录)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<security-constraint> ... </security-constraint>
<login-config>
<auth-method> FORM </auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/login-error.jsp</form-error-page>
</form-login-config>
</login-config>
<!-- ... -->
</web-app>


9.2 限制对Web资源的访问
现在,可以指示服务器使用何种验证方法了。"了不起,"你说道,"除非我能指定一个来收到保护的 URL,否则没有多大用处。"没错。指出这些URL并说明他们应该得到何种保护正是security-constriaint元素的用途。此元素在 web.xml中应该出现在login-config的紧前面。它包含是个可能的子元素,分别是:web-resource-collection、 auth-constraint、user-data-constraint和display-name。下面各小节对它们进行介绍。
l web-resource-collection
此元素确定应该保护的资源。所有security-constraint元素都必须包含至少一个web-resource-collection项。此元素由一个给出任意标识名称的web-resource-name元素、一个确定应该保护的URL的url-pattern元素、一个指出此保护所适用的 HTTP命令(GET、POST等,缺省为所有方法)的http-method元素和一个提供资料的可选description元素组成。例如,下面的 Web-resource-collection项(在security-constratint元素内)指出Web应用的proprietary目录中所有文档应该受到保护。
<security-constraint>
<web-resource-coolection>
<web-resource-name>Proprietary</web-resource-name>
<url-pattern>/propritary/*</url-pattern>
</web-resource-coolection>
<!-- ... -->
</security-constraint>
重要的是应该注意到,url-pattern仅适用于直接访问这些资源的客户机。特别是,它不适合于通过MVC体系结构利用 RequestDispatcher来访问的页面,或者不适合于利用类似jsp:forward的手段来访问的页面。这种不匀称如果利用得当的话很有好处。例如,servlet可利用MVC体系结构查找数据,把它放到bean中,发送请求到从bean中提取数据的JSP页面并显示它。我们希望保证决不直接访问受保护的JSP页面,而只是通过建立该页面将使用的bean的servlet来访问它。url-pattern和auth-contraint元素可通过声明不允许任何用户直接访问JSP页面来提供这种保证。但是,这种不匀称的行为可能让开发人员放松警惕,使他们偶然对应受保护的资源提供不受限制的访问。
l auth-constraint
尽管web-resource-collention元素质出了哪些URL应该受到保护,但是auth-constraint元素却指出哪些用户应该具有受保护资源的访问权。此元素应该包含一个或多个标识具有访问权限的用户类别role- name元素,以及包含(可选)一个描述角色的description元素。例如,下面web.xml中的security-constraint元素部门规定只有指定为Administrator或Big Kahuna(或两者)的用户具有指定资源的访问权。
<security-constraint>
<web-resource-coolection> ... </web-resource-coolection>
<auth-constraint>
<role-name>administrator</role-name>
<role-name>kahuna</role-name>
</auth-constraint>
</security-constraint>
重要的是认识到,到此为止,这个过程的可移植部分结束了。服务器怎样确定哪些用户处于任何角色以及它怎样存放用户的口令,完全有赖于具体的系统。
例如,Tomcat使用install_dir/conf/tomcat-users.xml将用户名与角色名和口令相关联,正如下面例子中所示,它指出用户joe(口令bigshot)和jane(口令enaj)属于administrator和kahuna角色。
<tomcat-users>
<user name="joe" password="bigshot" roles="administrator,kahuna" />
<user name="jane" password="enaj" roles="kahuna" />
</tomcat-users>
l user-data-constraint
这个可选的元素指出在访问相关资源时使用任何传输层保护。它必须包含一个transport-guarantee子元素(合法值为NONE、 INTEGRAL或CONFIDENTIAL),并且可选地包含一个description元素。transport-guarantee为NONE值将对所用的通讯协议不加限制。INTEGRAL值表示数据必须以一种防止截取它的人阅读它的方式传送。虽然原理上(并且在未来的HTTP版本中),在 INTEGRAL和CONFIDENTIAL之间可能会有差别,但在当前实践中,他们都只是简单地要求用SSL。例如,下面指示服务器只允许对相关资源做 HTTPS连接:
<security-constraint>
<!-- ... -->
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
l display-name
security-constraint的这个很少使用的子元素给予可能由GUI工具使用的安全约束项一个名称。
9.3 分配角色名
迄今为止,讨论已经集中到完全由容器(服务器)处理的安全问题之上了。但servlet以及JSP页面也能够处理它们自己的安全问题。
例如,容器可能允许用户从bigwig或bigcheese角色访问一个显示主管人员额外紧贴的页面,但只允许bigwig用户修改此页面的参数。完成这种更细致的控制的一种常见方法是调用HttpServletRequset的isUserInRole方法,并据此修改访问。
Servlet的 security-role-ref子元素提供出现在服务器专用口令文件中的安全角色名的一个别名。例如,假如编写了一个调用 request.isUserInRole("boss")的servlet,但后来该servlet被用在了一个其口令文件调用角色manager而不是boss的服务器中。下面的程序段使该servlet能够使用这两个名称中的任何一个。
<servlet>
<!-- ... -->
<security-role-ref>
<role-name>boss</role-name> <!-- New alias -->
<role-link>manager</role-link> <!-- Real name -->
</security-role-ref>
</servlet>
也可以在web-app内利用security-role元素提供将出现在role-name元素中的所有安全角色的一个全局列表。分别地生命角色使高级IDE容易处理安全信息。

10 控制会话超时

如果某个会话在一定的时间内未被访问,服务器可把它扔掉以节约内存。可利用HttpSession的setMaxInactiveInterval方法直接设置个别会话对象的超时值。如果不采用这种方法,则缺省的超时值由具体的服务器决定。但可利用session-config和session- timeout元素来给出一个适用于所有服务器的明确的超时值。超时值的单位为分钟,因此,下面的例子设置缺省会话超时值为三个小时(180分钟)。
<session-config>
<session-timeout>180</session-timeout>
</session-config>

11 Web应用的文档化

越来越多的开发环境开始提供servlet和JSP的直接支持。例子有Borland Jbuilder Enterprise Edition、Macromedia UltraDev、Allaire JRun Studio(写此文时,已被Macromedia收购)以及IBM VisuaAge for Java等。
大量的web.xml元素不仅是为服务器设计的,而且还是为可视开发环境设计的。它们包括icon、display-name和discription等。
可回忆一下,在web.xml内以适当地次序声明web-app子元素很重要。不过,这里只要记住icon、display-name和description是web.xml的web-app元素内的前三个合法元素即可。
l icon
icon元素指出GUI工具可用来代表Web应用的一个和两个图像文件。可利用small-icon元素指定一幅16 x 16的GIF或JPEG图像,用large-icon元素指定一幅32 x 32的图像。下面举一个例子:
<icon>
<small-icon>/images/small-book.gif</small-icon>
<large-icon>/images/tome.jpg</large-icon>
</icon>
l display-name
display-name元素提供GUI工具可能会用来标记此Web应用的一个名称。下面是个例子。
<display-name>Rare Books</display-name>
l description
description元素提供解释性文本,如下所示:
<description>
This Web application represents the store developed for
rare-books.com, an online bookstore specializing in rare
and limited-edition books.
</description>

12 关联文件与MIME类型

服务器一般都具有一种让Web站点管理员将文件扩展名与媒体相关联的方法。例如,将会自动给予名为mom.jpg的文件一个image/jpeg的MIME 类型。但是,假如你的Web应用具有几个不寻常的文件,你希望保证它们在发送到客户机时分配为某种MIME类型。mime-mapping元素(具有 extension和mime-type子元素)可提供这种保证。例如,下面的代码指示服务器将application/x-fubar的MIME类型分配给所有以.foo结尾的文件。
<mime-mapping>
<extension>foo</extension>
<mime-type>application/x-fubar</mime-type>
</mime-mapping>
或许,你的Web应用希望重载(override)标准的映射。例如,下面的代码将告诉服务器在发送到客户机时指定.ps文件作为纯文本(text/plain)而不是作为PostScript(application/postscript)。
<mime-mapping>
<extension>ps</extension>
<mime-type>application/postscript</mime-type>
</mime-mapping>


13 定位TLD

JSP taglib元素具有一个必要的uri属性,它给出一个TLD(Tag Library Descriptor)文件相对于Web应用的根的位置。TLD文件的实际名称在发布新的标签库版本时可能会改变,但我们希望避免更改所有现有JSP页面。此外,可能还希望使用保持taglib元素的简练性的一个简短的uri。这就是部署描述符文件的taglib元素派用场的所在了。Taglib包含两个子元素:taglib-uri和taglib-location。taglib-uri元素应该与用于JSP taglib元素的uri属性的东西相匹配。Taglib-location元素给出TLD文件的实际位置。例如,假如你将文件chart-tags- 1.3beta.tld放在WebApp/WEB-INF/tlds中。现在,假如web.xml在web-app元素内包含下列内容。
<taglib>
<taglib-uri>/charts.tld</taglib-uri>
<taglib-location>
/WEB-INF/tlds/chart-tags-1.3beta.tld
</taglib-location>
</taglib>
给出这个说明后,JSP页面可通过下面的简化形式使用标签库。
<%@ taglib uri="/charts.tld" prefix="somePrefix" %>

14 指定应用事件监听程序

应用事件监听器程序是建立或修改servlet环境或会话对象时通知的类。它们是servlet规范的版本2.3中的新内容。这里只简单地说明用来向Web应用注册一个监听程序的web.xml的用法。
注册一个监听程序涉及在web.xml的web-app元素内放置一个listener元素。在listener元素内,listener-class元素列出监听程序的完整的限定类名,如下所示:
<listener>
<listener-class>package.ListenerClass</listener-class>
</listener>
虽然listener元素的结构很简单,但请不要忘记,必须正确地给出web-app元素内的子元素的次序。listener元素位于所有的servlet 元素之前以及所有filter-mapping元素之后。此外,因为应用生存期监听程序是serlvet规范的2.3版本中的新内容,所以必须使用 web.xml DTD的2.3版本,而不是2.2版本。
例如,程序清单5-20给出一个名为ContextReporter的简单的监听程序,只要Web应用的Servlet-Context建立(如装载Web应用)或消除(如服务器关闭)时,它就在标准输出上显示一条消息。程序清单5-21给出此监听程序注册所需要的web.xml文件的一部分。

程序清单5-20 ContextReporterjava
package moreservlets;

import javax.servlet.*;
import java.util.*;

/** Simple listener that prints a report on the standard output
* when the ServletContext is created or destroyed.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/

public class ContextReporter implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
System.out.println("Context created on " +
new Date() + ".");
}

public void contextDestroyed(ServletContextEvent event) {
System.out.println("Context destroyed on " +
new Date() + ".");
}
}


程序清单5-21 web.xml(声明一个监听程序的摘录)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<filter-mapping> … </filter-mapping>
<listener>
<listener-class>package.ListenerClass</listener-class>
</listener>
<servlet> ... </servlet>
<!-- ... -->
</web-app>


15 J2EE元素

本节描述用作J2EE环境组成部分的Web应用的web.xml元素。这里将提供一个简明的介绍,详细内容可以参阅http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf的Java 2 Plantform Enterprise Edition版本1.3规范的第5章。
l distributable
distributable 元素指出,Web应用是以这样的方式编程的:即,支持集群的服务器可安全地在多个服务器上分布Web应用。例如,一个可分布的应用必须只使用 Serializable对象作为其HttpSession对象的属性,而且必须避免用实例变量(字段)来实现持续性。distributable元素直接出现在discription元素之后,并且不包含子元素或数据,它只是一个如下的标志。
<distributable />
l resource-env-ref
resource -env-ref元素声明一个与某个资源有关的管理对象。此元素由一个可选的description元素、一个resource-env-ref- name元素(一个相对于java:comp/env环境的JNDI名)以及一个resource-env-type元素(指定资源类型的完全限定的类),如下所示:
<resource-env-ref>
<resource-env-ref-name>
jms/StockQueue
</resource-env-ref-name>
<resource-env-ref-type>
javax.jms.Queue
</resource-env-ref-type>
</resource-env-ref>
l env-entry
env -entry元素声明Web应用的环境项。它由一个可选的description元素、一个env-entry-name元素(一个相对于java: comp/env环境JNDI名)、一个env-entry-value元素(项值)以及一个env-entry-type元素(java.lang程序包中一个类型的完全限定类名,java.lang.Boolean、java.lang.String等)组成。下面是一个例子:
<env-entry>
<env-entry-name>minAmout</env-entry-name>
<env-entry-value>100.00</env-entry-value>
<env-entry-type>minAmout</env-entry-type>
</env-entry>
l ejb-ref
ejb -ref元素声明对一个EJB的主目录的应用。它由一个可选的description元素、一个ejb-ref-name元素(相对于java: comp/env的EJB应用)、一个ejb-ref-type元素(bean的类型,Entity或Session)、一个home元素(bean的主目录接口的完全限定名)、一个remote元素(bean的远程接口的完全限定名)以及一个可选的ejb-link元素(当前bean链接的另一个 bean的名称)组成。
l ejb-local-ref
ejb-local-ref元素声明一个EJB的本地主目录的引用。除了用local-home代替home外,此元素具有与ejb-ref元素相同的属性并以相同的方式使用。  




web-app_2_3.dtd

http://panqunjun.blogcn.com/articles/web-app_2_3-dtd.html

<web-app id="">
 <!-- icon元素指出IDE和GUI工具用来表示Web应用的一个和两个图像文件的位置 -->
 <icon>
  <small-icon id=""></small-icon>
  <large-icon id=""></large-icon>
 </icon>


 <!-- display-name元素提供GUI工具可能会用来标记这个特定的Web应用的一个名称 -->
 <display-name id=""></display-name>


 <!-- description元素给出与此有关的说明性文本 -->
 <description id=""></description>


 <!-- 是否可分布式处理 -->
 <distributable id=""></distributable>


 <!-- context-param元素声明应用范围内的初始化参数 -->
 <context-param id="">
  <param-name></param-name>
  <param-value></param-value>
  <description></description>
 </context-param>


 <!-- 声明过滤器 -->
 <filter id="">
  <icon>
   <small-icon id=""></small-icon>
   <large-icon id=""></large-icon>
  </icon>
  <filter-name></filter-name>
  <display-name></display-name>
  <description></description>
  <filter-class id=""></filter-class>
  <inint-param id="">
   <param-name></param-name>
   <param-value></param-value>
   <description></description>
  </inint-param>
 </filter>


 <!-- 映射过滤器 -->
 <filter-mapping id="">
  <filter-name id=""></filter-name>
  (<url-pattern id=""></url-pattern> | <servlet-name></servlet-name&gt ;)
 </filter-mapping>


 <!-- 设置事件监瑞脑消金兽听程序。-->
 <listener id="">
  <listener-class id=""></listener-class>
 </listener>


 <!-- 声明Servlet -->
 <servlet id="">
  <icon>
   <small-icon id=""></small-icon>
   <large-icon id=""></large-icon>
  </icon>
  <servlet-name id=""></servlet-name>
  <display-name></display-name>
  <description></description>
  (<servlet-class id=""></servlet-class> | <jsp-file id=""></jsp-file&gt ;)
  <init-param></init-param>
  <load-on-startup id=""></load-on-startup>
  <run-as id="">
   <description></description>
   <role-name></role-name>
  </run-as>
  <security-role-ref id="">
   <description><description>
   <role-name id=""></role-name>
   <role-link id=""></role-link>
  </security-role-ref>
 </servlet>


 <!-- 映射Servlet -->
 <servlet-mapping id="">
  <filter-name></filter-name>
  (<url-pattern></url-pattern>|<servlet-name></servlet-name>
 </servlet-mapping>


 <!-- 配置Session的超时值 -->
 <session-config id="">
  <session-timeout id=""></session-timeout>
 </session-config>


 <!-- 关联文件与MIME类型 -->
 <mime-mapping id="">
  <extension id=""></extension>
  <mime-type></mime-type>
 </mime-mapping>


 <!-- 首页文件列表 -->
 <welcome-file-list id="">
  <welcome-file id=""></welcome-file>
 </welcome-file-list>


 <!-- 根据HTTP状态码或者异常类型来定位出错页面 -->
 <error-page id="">
  <error-code id=""></error-code>
  <exception-type id=""></exception-type>
  <location id=""></location>
 </error-page>


 <!-- 定义TLD文件别名 -->
 <taglib id="">
  <taglib-uri id=""></taglib-uri>
  <taglib-location id=""></taglib-location>
 </taglib>


 <!-- 声明一个与某个资源有关的管理对象 -->
 <resource-env-ref id="">
  <description></description>
  <resource-env-ref-name id=""></resource-env-ref-name>
  <resource-env-ref-type id=""></resource-env-ref-type>
 </resource-env-ref>


 <!-- 声明一个资源工厂使用的外部资源 -->
 <resource-ref id="">
  <description></description>
  <res-ref-name id=""></res-ref-name>
  <res-type id=""></res-type>
  <res-auth id=""></res-auth>
  <res-sharing-scope id=""></res-sharing-scope>
 </resource-ref>


 <!-- 制定应该保护的URL -->
 <security-constraint id="">
  <display-name></display-name>
  <web-resource-collection id="">
   <web-resource-name id=""></web-resource-name>
   <description></description>
   <url-pattern></url-pattern>
   <http-method id=""></http-method>
  </web-resource-collection>
  <auth-constraint id="">
   <description></description>
   <role-name></role-name>
  </auth-constraint>
  <user-data-constraint id="">
   <description></description>
   <transport-guarantee id=""></transport-guarantee>
  </user-data-constraint>
 </security-constraint>


 <!-- 指定服务器应该怎样给试图访问受保护页面的用户授权 -->
 <login-config id="">
  <auth-method id=""><auth-method>
  <realm-name id=""></realm-name>
  <form-login-config id="">
   <form-login-page id=""></form-login-page>
   <form-error-page id=""></form-error-page>
  </form-login-config>
 </login-config>


 <!-- 给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中 -->
 <security-role id="">
  <description></description>
  <role-name></role-name>
 </security-role>


 <!-- 声明Web应用的环境项 -->
 <env-entry id="">
  <description></description>
  <env-entry-name id=""></env-entry-name>
  <env-entry-value id=""></env-entry-value>
  <env-entry-type id=""></env-entry-type>
 </env-entry>


 <!-- 声明一个EJB的主目录的引用 -->
 <ejb-ref id="">
  <description></description>
  <ejb-ref-name id=""></ejb-ref-name>
  <ejb-ref-type id=""></ejb-ref-type>
  <home id=""></home>
  <remote id=""><remote>
  <ejb-link id=""></ejb-link>
 </ejb-ref>


 <!-- 声明一个EJB的本地主目录的应用 -->
 <ejb-local-ref id="">
  <description></description>
  <ejb-ref-name></ejb-ref-name>
  <ejb-ref-type></ejb-ref-type>
  <local-home id=""></local-home>
  <local id=""></local>
  <ejb-link></ejb-link>
 </ejb-local-ref>
</web-app>



参照:
关于web.xml配置的详细说明
http://peter-kong.javaeye.com/blog/41572
web-app_2_4配置说明
http://blog.csdn.net/jupiter97/archive/2007/04/25/1584635.aspx

This entry was posted in JSP+Servlet and tagged , . Bookmark the permalink编辑






http://stauren.net/log/1oylji4pl.html


这篇文章地址:http://blog.csdn.net/gztoby/article/details/71871

<!--
为了学习需要把这个文档翻译了一遍,里面的词语和语法可能很不标准,而且也可能和原文相去甚
远。但是对于我自己的理解确是有益的。觉得它对其他人也许有用,所以冒昧把它共享出来,希望
能对大家有用。要是由于我的错误翻译而使使用者曲解了原文的意思,那么我也只能深表遗憾了,
至于责任我是不负的。但是希望你能把错误指出来,由我来修改,或者是你自己加以改进,并共享
出来。

第一次字面翻译这种类型的文档,错误和难读之处估计很多,尤其是我对除了servlet和jsp之外
的知识所知甚少。然而大牛们是不屑于翻译这种文档的(或者是我孤陋寡闻了),而我等无能之辈
只能勉而为之了。

说明:
()里面的是原文,()里面的是原文中()里面的内容

感谢: gaojunbo@csdn.expert提供的对于fully-qualified的理解。


justfly@cnpoems.net
2003.1.31 2:03完稿。
-->

<!--
Sun Microsystems,Inc.2000-2001 版权所有。901 San Antonio Road, Palo Alto, 
CA 94303,U.S.A. 保留所有权利.

这个产品或者文档在使用,复制,分发上受到了copyright and distributed的许可证限制保
护。在没有得到任何形式的上的Sun和它的许可证颁发者的授权下,任何人或组织不可以以任何形
式reproduced(复制,再生)本产品或文档的任何部分。

第三方软件,包括字型技术,已经得到Sun的供应者的授权和许可。

Sun, Sun Microsystems, the Sun Logo, Solaris, Java, JavaServer Pages, 
Java Naming and Directory Interface, JDBC, JDK, JavaMail 和 
Enterprise JavaBeans 在美国和其他国家已经注册为Sun Microsystems, Inc的商标。

所有的SPARC商标得到SPARC International, Inc在美国和其他国家的使用许可和商标使用权
的授予。和SPARC商标有关的产品是以Sun Microsystems, Inc. 开发的一个体系结构为基础
的。

PostScript 是Adoe Systems, Inc.的一个注册商标。

联合收购: 商业软件-政府用户服从标准的许可证期限和条件.
(Federal Acquisitions: Commercial Software - Government Users Subject to 
Standard License Terms and Conditions. 这句话翻译得不好)

除了根据法律无法拒绝的情况下,本文档不因任何任何明确的或者隐含的条件,请求,理由, 包括任
何含蓄的可做商品性的,因为特殊的目的或者非侵犯性的的理由而做修改。
-->

<!--
这是一个Servlet 2.3 配置描述器的XML DTD。所有的Servlet 2.3 配置描述器(deployment
descriptor) 必须包含一个如下形式的DOCTYPE:
  <!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd">

-->

<!--
下面的这些约定将用于所有的J2EE描述器元素,除非有额外说明。

-在包含有PCDATA的元素(elements)中,在数据中头部和尾部的空格可以忽略。

-值为“列举类型(enumerated)”的元素中,其值是区分大小写的。

-在同一个JAR file里指明了一个文件的路径名的元素中,相对方式的的文件名(不是用“/”开始
的路径名)都被认为是相对于该JAR 文件命名空间的根(root)的。绝对形式的文件名(以“/”开始
的)也是指定了以该JAR文件的根为起点的的名字。一般情况下,相对形式的文件名是首选的。也有
一个例外,为了servlet API的一致性,在.war文件中,绝对形式的文件名是首选的。
-->

<!--
web-app元素是一个web应用程序的配置描述器的根。
-->
<!ELEMENT web-app (icon?, display-name?, description?, distributable?,
context-param*, filter*, filter-mapping*, listener*, servlet*,
servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?,
error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*,
login-config?, security-role*, env-entry*, ejb-ref*,  ejb-local-ref*)>

<!--
auth-constraint元素标明了允许使用该资源集合的用户角色。role-name(角色名)必须对应为
该web应用程序所定义的一个security-role元素中的role-name,或者是“*”,“*”是一个专门
保留的role-name,它是一个用来标明web应用程序的所有角色的语法符号。如果“*”和角色名同时
出现了,那么容器就会认为它可以担任所有的角色。如果没有定义任何角色,则任何用户都无法使
用该web应用程序中所包含的security-constraint描述的部分。当当决定是否有使用权限时,
容器对角色名是大小写敏感的。

在security-constraint中使用
-->
<!ELEMENT auth-constraint (description?, role-name*)>

<!--
auth-method元素用来定义web容器的鉴定机制。为了获得对任何受授权约束保护的web资源的使
用权限,用户必须按照所本元素定义的机制来通过鉴证。本元素可选值为:"BASIC","DIGEST",
"FORM","CLIENT-CERT"。

在login-config中使用。
-->
<!ELEMENT auth-method (#PCDATA)>

<!--
context-param元素包含了web应用程序的servlet上下文(servlet context)的初始化参数
的声明。
-->
<!ELEMENT context-param (param-name, param-value, description?)>

<!--
description元素用来为其父元素提供文字说明。该元素用来提供所有web应用程序war文件生产者
想要提供给web应用程序war文件使用者(比如Deployer(配置器))所需要的信息。典型情况下,
web应用程序war文件使用者所使用的工具在处理该description元素的父元素时会显示该
description元素所提供的文字说明。

在auth-constraint, context-param, ejb-local-ref, ejb-ref,env-entry, filter,
init-param, resource-env-ref, resource-ref, run-as,security-role, 
security-role-ref, servlet, user-data-constraint,web-app, 
web-resource-collection中使用。
-->

<!ELEMENT description (#PCDATA)>

<!--
display-name元素包含一个用来给工具显示用的短名。该元素的值没有唯一性要求。

在filter, security-constraint, servlet, web-app中使用

Example:

<display-name>Employee Self Service</display-name>
-->
<!ELEMENT display-name (#PCDATA)>

<!--
distributable元素在一个web应用程序配置描述器中的出现标明了该web应用程序
可以配置到分布式的servlet容器中。

在web-app中使用
-->
<!ELEMENT distributable EMPTY>

<!--
ejb-link元素用来标明一个EJB引用(EJB reference)是连接到一个enterprise bean的。
ejb-link元素里的名字由一个包含了所引用的ejb的ejb-jar文件的路径名和所应用的ejb名组成,
ejb名在ejb-jar路径名之后,中间用一个"#"隔开。该路径名是相对于引用了该
enterprise bean的web应用程序所在的war文件的。这个元素允许多个enterprise beans用同
个ejb-name来唯一鉴别。(This allows multiple enterprise beans with the same 
ejb-name to be uniquely identified.)

在 ejb-local-ref, ejb-ref中使用

Examples:

 <ejb-link>EmployeeRecord</ejb-link>

 <ejb-link>../products/product.jar#ProductEJB</ejb-link>

-->
<!ELEMENT ejb-link (#PCDATA)>

<!--
ejb-local-ref元素是用来声明一个对enterprise bean的本地 home的引用。该声明由以下几
部分组成:
    - 一个可选的说明(description)
    - 在引用了该enterprise bean的web应用程序的代码中所使用的该EJB的引用名。
    - 所引用的enterprise bean所期望的类型。(the expected type of the 
      referenced enterprise bean)
    - 所期望的所引用的enterprise bean的本地 home和本地接口。(the expected local
      home and local interfaces of the referenced enterprise bean)
    - 可选的ejb-link信息,用来标明所引用的enterprise bean。

在 web-app中使用
-->
<!ELEMENT ejb-local-ref (description?, ejb-ref-name, ejb-ref-type,
  local-home, local, ejb-link?)>


<!--
ejb-ref元素是用来声明一个对enterprise bean的home的引用。该声明由以下几部分组成:
    - 一个可选的说明(description)
    - 在引用了该enterprise bean的web应用程序的代码中所使用的该EJB的引用名。
    - 所引用的enterprise bean所期望的类型。(the expected type of the 
      referenced enterprise bean)
    - 所期望的所引用的enterprise bean的home和远程接口。(the expected home and 
      remote interfaces of the referenced enterprise bean)
    - 可选的ejb-link信息,用来标明所引用的enterprise bean。

在web-app中使用
-->
<!ELEMENT ejb-ref (description?, ejb-ref-name, ejb-ref-type,
  home, remote, ejb-link?)>

<!--
ejb-ref-name元素包含了一个EJB引用的名字。EJB引用是该web应用程序环境中的一个实体并且
是和java:comp/env上下文(context)关联的。在该wen应用程序中,该名字必须是唯一的。

推荐在名字前面加上一个“ejb/”的前缀。

在ejb-local-ref, ejb-ref中使用。

Example:

<ejb-ref-name>ejb/Payroll</ejb-ref-name>
-->
<!ELEMENT ejb-ref-name (#PCDATA)>

<!--
ejb-ref-type 元素包含了所引用enterprise bean的期望类型

它必须是以下之一
 <ejb-ref-type>Entity</ejb-ref-type>
 <ejb-ref-type>Session</ejb-ref-type>

在ejb-local-ref,ejb-ref中使用
-->
<!ELEMENT ejb-ref-type (#PCDATA)>

<!--
env-entry元素的内容是一个web应用程序的环境入口(environment entry)的声明。该声明由
一个可选的描述,该环境入口的名字,和一个可选的值组成。如果值没有指定,则必须在配置的时
候提供一个。
-->
<!ELEMENT env-entry (description?, env-entry-name, env-entry-value?,
env-entry-type)>

<!--
env-entry-name 元素的内容是一个web应用程序的环境入口的名字。该名字是一个和
java:comp/env 上下文(context)相关的JNDI名字。该名字在一个web应用程序中必须是唯一
的。

Example:

<env-entry-name>minAmount</env-entry-name>

在 env-entry中使用
-->
<!ELEMENT env-entry-name (#PCDATA)>

<!--
env-entry-type 元素的内容是该web应用程序代码所期望的环境入口的值的完全形式
(fully-qualified)的Java类型。

其可选值有以下几个:

 java.lang.Boolean
 java.lang.Byte
 java.lang.Character
 java.lang.String
 java.lang.Short
 java.lang.Integer
 java.lang.Long
 java.lang.Float
 java.lang.Double

在env-entry中使用
-->
<!ELEMENT env-entry-type (#PCDATA)>

<!--
env-entry-value元素的内容是一个web应用程序的环境入口的值。该值必须是能满足所指定的
类型的只需要一个String参数的构造器的有效的String,或者是一个单独的字符,这个时候所指
定的类型为必须java.lang.Character。

Example:

<env-entry-value>100.00</env-entry-value>

在 env-entry中使用
-->
<!ELEMENT env-entry-value (#PCDATA)>

<!--
error-code元素的内容是一个HTTP错误字,比如:404

在error-page中使用
<!ELEMENT error-code (#PCDATA)>

<!--
error-page元素的内容是一个错误代码或者例外类型和该web应用程序里面的一个资源的路径的
映射。

在web-app中使用
-->
<!ELEMENT error-page ((error-code | exception-type), location)>

<!--
exception-type元素的内容是一个Java 例外类型的完全形式的类名。

在error-page中使用
-->
<!ELEMENT exception-type (#PCDATA)>

<!--
extension元素的内容是一个描述了一个扩展名的字符串。比如:“txt”

在mime-mapping中使用
-->
<!ELEMENT extension (#PCDATA)>

<!--
filter 元素声明了web应用程序里的一个filter。通过filter-name的值作为引用,在
filter-mapping元素里,filter被映射到一个Servlet或者是一个URL范式上。通过
FilterConfig接口,filter可以使用配置描述器所声明的初始化参数。

在web-app中使用
-->
<!ELEMENT filter (icon?,filter-name,display-name?, description?,
filter-class,init-param*)>

<!--
filter-class的内容是该filter的类名的全称。

在filter中使用
-->
<!ELEMENT filter-class(#PCDATA)>

<!--
filter-mapping元素声明了在wen应用程序里面的filter映射。容器根据filter-mapping声
明来决定哪些filter按照什么顺序应用于一个请求上。容器匹配按照正常方式访问一个Servlet的
请求URI。然后根据所有filter-mapping的servlet-name或者是url-pattern来决定哪个
filter可以应用到该URI之上。决定filter调用顺序的是适合该URI的filter-mapping列表中
的filter顺序。filter-name的值必须得是该配置描述器里面的filter声明的子元素
filter-name的值。

在web-app中使用
-->
<!ELEMENT filter-mapping(filter-name, (url-pattern | servlet-name))>

<!--
filter的逻辑名。这个名字是用来映射filter的,在web应用程序里各个filter-name是唯一的。

在filter,filter-mapping中使用
-->
<!ELEMENT filter-name(#PCDATA)>

<!--
form-error-page 元素定义了在web应用程序里能找到登陆失败时所显示的错误页面的位置。路
径名的形式是相对于该WAR文件的根以/打头。

在form-login-config中使用
-->
<!ELEMENT form-error-page (#PCDATA)>

<!--
form-login-config元素定义了以form方式的鉴定机制所需要使用的登陆和错误页面。如果没有
使用以form为基础形式的鉴定机制,则该元素会被忽略。

在login-config中使用
-->
<!ELEMENT form-login-config (form-login-page, form-error-page)>

<!--
form-login-page元素定义了在该web应用程序的能找到登陆页面可以的位置。路径名的形式是相
对于该WAR文件的根以/打头。

在form-login-config中使用
-->
<!ELEMENT form-login-page (#PCDATA)>

<!--
home元素的内容是enterprise beans的home 接口的完全形式的名字。

在ejb-ref中使用

Example:

<home>com.aardvark.payroll.PayrollHome</home>
-->
<!ELEMENT home (#PCDATA)>

<!--
http-method元素的内容是一个HTTP方法(GET|POST|...)。

在web-resource-coloction中使用
-->
<!ELEMENT http-method (#PCDATA)>

<!--
icon元素的内容是用来在GUI工具里代表其父元素的,指定文件名字的小的和大的,GIF或者JPEG
icon图片的small-icon和large-icon元素。

在filter,servlet,web-app中使用
-->
<!ELEMENT icon(small-icon?, large-icon?)>

<!--
init-param元素的内容是一个作为servlet的初始化参数的名值对。

在filter,servlet中使用
-->
<!ELEMENT init-param (param-name, param-value, description?)>

<!--
jsp-file元素的内容是一个以/打头的指向该web应用程序里的一个JSP文件的完整路径。

在servlet中使用
-->
<!ELEMENT jsp-file (#PCDATA)>

<!--
large-icon元素的内容是一个32x32像素的icon图片文件的文件名。该文件名是一个相对于该
web应用程序的war文件的路径名。

该图片文件可以是JPEG格式,也可以是GIF格式。它是由图形工具使用的。

在icon中使用

Example:

<large-icon>employee-service-icon32x32.jpg</large-icon>
-->
<!ELEMENT large-icon (#PCDATA)>

<!--
listener元素标明了一个web应用程序的listener bean的配置属性。

在web-app中使用
-->
<!ELEMENT listener (listener-class)>

<!--
listener-class声明了该应用程序里一个必须要注册为该web应用程序listener bean的一个
类。其值为该listener类的完全形式的类名。

在listener中使用
-->
<!ELEMENT listener-class(#PCDATA)>

<!--
load-on-startup元素标明了该servlet必须得在该web应用程序开始运行的时候被装入(初始
化一个对象,并调用该servlet的init()方法)。其值为一个可选的整数,标明了该servlet被
载入的次序。如果值为一个负整数或者该元素不出现的话,则容器可以在其选定的任何时候载入该
servlet。如果该值是一个正整数或者是零,则容器必须在启动该应用程序的时候载入并初始化该
servlet。容器必须保证用小的整数标明的servlet比用大的整数标明的servlet先载入。容器可
以在用同个整数标明的servlet中自由的选择载入次序。

在srvlet中使用
-->
<!ELEMENT load-on-startup (#PCDATA)>

<!--
local元素的内容是该enterprise bean的本地接口的完全形式的名字。

在ejb-local-ref中使用

-->
<!ELEMENT local (#PCDATA)>

<!--
local-home元素的内容是该enterprise bean的本地home接口的完全形式的名字。

在ejb-local-ref中使用
-->
<!ELEMENT local-home (#PCDATA)>

<!--
location元素的内容是该web应用程序里的资源的位置,该位置是一个以“/”打头的相对于该web
应用程序的根的相对路径。

在error-page中使用
-->
<!ELEMENT location (#PCDATA)>

<!--
login-config 元素的作用是配置该应用程序中应该使用什么身份鉴定方法,所使用的域名
(realm name),还有form登陆机制所需要的一些属性。

在web-app中使用
-->
<!ELEMENT login-config (auth-method?, realm-name?, form-login-config?)>

<!--
mime-mapping 元素定义了一个在后缀名和mime类型之间的映射。

在web-app中使用
-->
<!ELEMENT mime-mapping (extension, mime-type)>

<!--
mime-type元素的内容是一个规定了的mime类型。比如:“text/plain”。
-->
<!ELEMENT mime-type (#PCDATA)>

<!--
param-name元素的内容是一个参数的名字。每个参数名字在该wenb应用程序中必须是唯一的。

在context-param,init-param中使用
-->
<!ELEMENT param-name (#PCDATA)>

<!--
param-value元素的内容是该参数的值。

在context-param,init-param中使用
-->
<!ELEMENT param-value (#PCDATA)>

<!--
realm-name元素指定了以HTTP为基础的身份鉴定中所用的域名。

在login-config中使用
-->
<!ELEMENT realm-name (#PCDATA)>

<!--
remote元素的内容是该enterprise bean的远程接口的完全形式的名字。
Example:

<remote>com.wombat.empl.EmployeeService</remote>
-->
<!ELEMENT remote (#PCDATA)>

<!--
res-auth元素指定了web应用程序的代码中是否包含有注册到资源管理器上的程序,或者指定了容
器是否可以因为web应用程序的需要而注册到资源管理器上。如果是后者,则容器将会使用配置者
所提供的信息。

其值必须为一下两种之一:

 <res-auth>Application</res-auth>
 <res-auth>Container</res-auth>
在resource-ref中使用
-->
<!ELEMENT res-auth (#PCDATA)>

<!--
res-ref-name元素指定了一个资源管理器连接工厂引用的名字。这个名字是一个相对于
java:comp/env上下文(context)的JNDI名字。在一个web应用程序里,该名字必须是唯一的。

在resource-ref中使用
<!ELEMENT res-ref-name (#PCDATA)>

<!--
res-sharing-scope元素指定了是否能共享通过资源管理器连接工厂引用得到的连接。如果指定了
该元素,则其值必须为以下两者之一:

 <res-sharing-scope>Shareable</res-sharing-scope>
 <res-sharing-scope>Unshareable</res-sharing-scope>

默认值是 Shareable
在resource-ref中使用
-->
<!ELEMENT res-sharing-scope (#PCDATA)>

<!--
res-type 元素定义了数据源的类型。该类型必须为可以为该数据源所实现(be implemented)的
Java语言的类或者接口的完全形式的名字。

在resource-ref中使用
-->
<!ELEMENT res-type (#PCDATA)>

<!--
resource-env-ref元素的内容是一个web应用程序对一个和一个web应用程序环境里的资源联合了
的管理对象的应用。它由以下几个组成:一个可选的描述,该资源的环境引用的名字,和一个该web
应用程序代码所需要的资源环境引用类型的指明。

在web-app中使用

Example:

<resource-env-ref>
    <resource-env-ref-name>jms/StockQueue</resource-env-ref-name>
    <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type>
</resource-env-ref>
-->
<!ELEMENT resource-env-ref (description?, resource-env-ref-name,
  resource-env-ref-type)>

<!--
resource-env-ref-name元素指定了一个资源环境引用的名字;它的值是该web应用程序代码中
所使用的环境实体的名字。该名字是一个和java:comp/env上下文(context)相关联的JNDI名字,
它必须在该web应用程序中唯一。

在resource-env-ref中使用
-->
<!ELEMENT resource-env-ref-name (#PCDATA)>

<!--
resource-env-ref-type元素指定了一个资源环境引用的类型。它是一个Java语言类型或者接口
的完全形式的名字。

在resource-evn-ref中使用
-->
<!ELEMENT resource-env-ref-type (#PCDATA)>

<!--
resource-ref元素的内容是一个对web应用程序对一个外部资源的引用。它由一个可选的描述,一
个资源管理器连接工厂引用的名字,web应用程序代码中所需要的资源管理器连接工厂的类型指示,
应用程序或者容器的身份鉴证的类型和一个可选的从该资源所得连接得可共享性说明(其值为
Shareable或者是Unchareable)。

在web-app中使用

Example:

    <resource-ref>
 <res-ref-name>jdbc/EmployeeAppDB</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
 <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
-->
<!ELEMENT resource-ref (description?, res-ref-name, res-type, res-auth,
  res-sharing-scope?)>

<!--
role-link元素是一个对已定义安全角色得引用。该元素必须包含有在security-role元素中定义
的安全角色之一的名字。

在security-role-ref中使用
-->
<!ELEMENT role-link (#PCDATA)>

<!--
role-name元素的内容是一个安全角色的名字。

该名字必须符合NMTOKEN词法规则。

在auth-constraint, run-as, security-role, security-role-ref中使用
-->
<!ELEMENT role-name (#PCDATA)>

<!--
run-as 元素指定了该web应用程序运行时所需用的运行身份。它由一个可选的描述和一个安全角色
的名字组成。

在servlet中使用
-->
<!ELEMENT run-as (description?, role-name)>

<!--
security-constaint元素用来在联合一个或多个web资源集合和安全约束时使用。

在web-app中使用
-->
<!ELEMENT security-constraint (display-name?, web-resource-collection+,
auth-constraint?, user-data-constraint?)>

<!--
security-role元素定义了一个安全角色。该定义定义由一个可选的对该安全角色的说明和该安全
角色的名字组成。

在web-app中使用

Example:

    <security-role>
 <description>
     This role includes all employees who are authorized
     to access the employee service application.
 </description>
 <role-name>employee</role-name>
    </security-role>
-->
<!ELEMENT security-role (description?, role-name)>

<!--
security-role-ref 元素的内容是一个该web应用程序代码里的一个安全角色引用的声明。该声
明由一个可选的描述,代码中所用到的该安全角色的名字和一个可选的指向该安全角色的链接。如
果该安全角色没有指定,则配置者必须选择一个适当的安全角色。

role-name元素的值必须是一个在EJBContext.isCallerInrole(String roleName)方法或者
是HttpServletRequest.isUserInRole(String role)方法中的参数字符串。

在servlet中使用

-->
<!ELEMENT security-role-ref (description?, role-name, role-link?)>

<!--
servlet元素的内容是一个servlet的数据声明。如果指定了一个jsp文件而且load-on-startup
元素出现了,则该JSP必须被预编译并载入。

在web-app中使用
-->
<!ELEMENT servlet (icon?, servlet-name, display-name?, description?,
(servlet-class|jsp-file), init-param*, load-on-startup?, run-as?, 
security-role-ref*)>


<!--
servlet-class元素的内容是该servlet类名的完全形式。

在servlet中使用
-->
<!ELEMENT servlet-class (#PCDATA)>

<!--
servlet-mapping元素定义了一个在一个servlet和一个url范式之间的映射。

在web-app中使用
-->
<!ELEMENT servlet-mapping (servlet-name, url-pattern)>

<!--
servlet-name元素的内容是该servlet的规范的名字,每个servlet名字在其所在web应用程序
中必须是唯一的。

在filter-mapping, servlet, servlet-mapping中使用
-->
<!ELEMENT servlet-name (#PCDATA)>

<!--
session-config元素定义了该web应用程序的session参数。

在web-app中使用
-->
<!ELEMENT session-config (session-timeout?)>

<!--
session-timeout元素定义了在该web应用程序中创造的session的默认超时时间间隔。该时间间
隔必须是一个以分钟为单文的整数。如果该时间间隔是0或者更小,则容器默认为session永远不会
超时。

在session-config中使用
-->
<!ELEMENT session-timeout (#PCDATA)>

<!--
small-icon元素的内容是一个16x16像素的icon图片文件的文件名。该文件名是一个相对于该
web应用程序的war文件的路径名。

该图片文件可以是JPEG格式,也可以是GIF格式。它是由图形工具使用的。

在icon中使用

Example:

<small-icon>employee-service-icon16x16.jpg</small-icon>
-->
<!ELEMENT small-icon (#PCDATA)>

<!--
taglib元素是用来描述一个JSP标志库的。

在web-app中使用
-->
<!ELEMENT taglib (tablib-uri, taglib-location)>

<!--
taglib-location元素的内容是一个能找到该标志库的描述文件的路径,如同一个相对于该web应
用程序的资源。

在tablib中使用
-->
<!ELEMENT tablib-location (#PCDATA)>

<!--
tablib-uri元素描述了一个相对于web.xml文档位置的URI,唯一标志着一个该web应用程序所使
用的标志库。

在tablib中使用
-->
<!ELEMENT tablib-uri (#PCDATA)>

<!--
transport-guarantee元素指定了客户端和服务器之间的信息传输方式应该是NONE, INTEGRAL
还是CONFIDENTIAL。NONE表示该应用程序不需要任何传输保证。INTEGRAL表示应用程序要求在
客户端和服务器端的之间传输的数据需要在一种数据不会在传输过程中被修改的传输方式传输。
CONFIDENTIAL表示应用程序要求数据必须在一种防止其他实体看到传输的内容的方式中传送。大
多数情况下,INTEGRAL或者CONFIDENTIAL表示需要使用SSL。

在user-data-constraint中使用
-->
<!ELEMENT transport-guarantee (#PCDATA)>

<!--
url-pattern元素的内容是映射的url范式。它必须遵守Servlet API规范的11.2节所指定的规
则。

在filter-mapping,servlet-mapping,web-resource-collection中使用
-->
<!ELEMENT url-pattern (#PCDATA)>

<!--
user-data-constraint元素用来指定在客户端和容器之间的数据传输需要受到什么样的保护。

在security-constraint中使用
-->
<!ELEMENT user-data-constraint (description?, transport-guarantee)>

<!--
web-resource-collection 元素用来识别一个安全约束在一个web应用程序里所适用的资源和
HTTP请求方法的一个子集。如果没有指定任何HTTP请求方法,则该安全约束对所有的HTTP请求方
法有效。

在security-constraint中使用
-->
<!ELEMENT web-resource-collection (web-resource-name, description?,
url-pattern*, http-method*)>

<!--
web-resource-name元素的内容是该web资源集合的名字。

在web-resource-collection中使用
-->
<!ELEMENT web-resource-name (#PCDATA)>

<!--
welcome-file元素的内容是一个默认的欢迎页面的名字,比如index.html

在welcome-file-list中使用。
-->
<!ELEMENT welcome-file (#PCDATA)>

<!--
welcome-file-list的内容是welcome-file元素的序列表。

在web-app中使用
-->
<!ELEMENT welcome-file-list (welcome-file+)>

<!--
ID机制允许用来加入额外配置信息(在标准的配置描述器以外的信息)的工具把非标准的信息存储
在其他的文件上,并可以很容易的从这些工具读有的文件上引用到标准的配置描述器上的信息。

这些工具都不能把非标准的信息加入到标准的配置描述器中。
-->

<!ATTLIST auth-constraint id ID #IMPLIED>
<!ATTLIST auth-method id ID #IMPLIED>
<!ATTLIST context-param id ID #IMPLIED>
<!ATTLIST description id ID #IMPLIED>
<!ATTLIST display-name id ID #IMPLIED>
<!ATTLIST distributable id ID #IMPLIED>
<!ATTLIST ejb-link id ID #IMPLIED>
<!ATTLIST ejb-local-ref id ID #IMPLIED>
<!ATTLIST ejb-ref id ID #IMPLIED>
<!ATTLIST ejb-ref-name id ID #IMPLIED>
<!ATTLIST ejb-ref-type id ID #IMPLIED>
<!ATTLIST env-entry id ID #IMPLIED>
<!ATTLIST env-entry-name id ID #IMPLIED>
<!ATTLIST env-entry-type id ID #IMPLIED>
<!ATTLIST env-entry-value id ID #IMPLIED>
<!ATTLIST error-code id ID #IMPLIED>
<!ATTLIST error-page id ID #IMPLIED>
<!ATTLIST exception-type id ID #IMPLIED>
<!ATTLIST extension id ID #IMPLIED>
<!ATTLIST filter id ID #IMPLIED>
<!ATTLIST filter-class id ID #IMPLIED>
<!ATTLIST filter-mapping id ID #IMPLIED>
<!ATTLIST filter-name id ID #IMPLIED>
<!ATTLIST form-error-page id ID #IMPLIED>
<!ATTLIST form-login-config id ID #IMPLIED>
<!ATTLIST form-login-page id ID #IMPLIED>
<!ATTLIST home id ID #IMPLIED>
<!ATTLIST http-method id ID #IMPLIED>
<!ATTLIST icon id ID #IMPLIED>
<!ATTLIST init-param id ID #IMPLIED>
<!ATTLIST jsp-file id ID #IMPLIED>
<!ATTLIST large-icon id ID #IMPLIED>
<!ATTLIST listener id ID #IMPLIED>
<!ATTLIST listener-class id ID #IMPLIED>
<!ATTLIST load-on-startup id ID #IMPLIED>
<!ATTLIST local id ID #IMPLIED>
<!ATTLIST local-home id ID #IMPLIED>
<!ATTLIST location id ID #IMPLIED>
<!ATTLIST login-config id ID #IMPLIED>
<!ATTLIST mime-mapping id ID #IMPLIED>
<!ATTLIST mime-type id ID #IMPLIED>
<!ATTLIST param-name id ID #IMPLIED>
<!ATTLIST param-value id ID #IMPLIED>
<!ATTLIST realm-name id ID #IMPLIED>
<!ATTLIST remote id ID #IMPLIED>
<!ATTLIST res-auth id ID #IMPLIED>
<!ATTLIST res-ref-name id ID #IMPLIED>
<!ATTLIST res-sharing-scope id ID #IMPLIED>
<!ATTLIST res-type id ID #IMPLIED>
<!ATTLIST resource-env-ref id ID #IMPLIED>
<!ATTLIST resource-env-ref-name id ID #IMPLIED>
<!ATTLIST resource-env-ref-type id ID #IMPLIED>
<!ATTLIST resource-ref id ID #IMPLIED>
<!ATTLIST role-link id ID #IMPLIED>
<!ATTLIST role-name id ID #IMPLIED>
<!ATTLIST run-as id ID #IMPLIED>
<!ATTLIST security-constraint id ID #IMPLIED>
<!ATTLIST security-role id ID #IMPLIED>
<!ATTLIST security-role-ref id ID #IMPLIED>
<!ATTLIST servlet id ID #IMPLIED>
<!ATTLIST servlet-class id ID #IMPLIED>
<!ATTLIST servlet-mapping id ID #IMPLIED>
<!ATTLIST servlet-name id ID #IMPLIED>
<!ATTLIST session-config id ID #IMPLIED>
<!ATTLIST session-timeout id ID #IMPLIED>
<!ATTLIST small-icon id ID #IMPLIED>
<!ATTLIST taglib id ID #IMPLIED>
<!ATTLIST taglib-location id ID #IMPLIED>
<!ATTLIST taglib-uri id ID #IMPLIED>
<!ATTLIST transport-guarantee id ID #IMPLIED>
<!ATTLIST url-pattern id ID #IMPLIED>
<!ATTLIST user-data-constraint id ID #IMPLIED>
<!ATTLIST web-app id ID #IMPLIED>
<!ATTLIST web-resource-collection id ID #IMPLIED>
<!ATTLIST web-resource-name id ID #IMPLIED>
<!ATTLIST welcome-file id ID #IMPLIED>
<!ATTLIST welcome-file-list id ID #IMPLIED>






这篇文章地址:http://hi.baidu.com/cuigq_hr/blog/item/c5c1ec3f3035182e71cf6c43.html

严重: Parse Error at line 31 column 11: The content of element type "web-app" must match "(icon?,display-name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet-mapping*,session-config?,mime-mapping*,welcome-file-list?,error-page*,taglib*,resource-env-ref*,resource-ref*,security-constraint*,login-config?,security-role*,env-entry*,ejb-ref*,ejb-local-ref*)"

今天把tomcat5.0的axis配置信息迁移到tomcat4.1上时,报出了上面的错误,配置信息如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
 <display-name>webservices</display-name>
 <welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
 </welcome-file-list>
 <servlet>
     <servlet-name>AxisServlet</servlet-name>
     <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
 </servlet>
  <servlet-mapping>
      <servlet-name>AxisServlet</servlet-name>
      <url-pattern>/servlet/AxisServlet/*</url-pattern>
    </servlet-mapping>
   <servlet-mapping>
     <servlet-name>AxisServlet</servlet-name>
     <url-pattern>*.jws</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
     <servlet-name>AxisServlet</servlet-name>
      <url-pattern>/services/*</url-pattern>
   </servlet-mapping>
</web-app>

启动tomcat总是报错,想了好多办法都没搞定,于是又认真的仔细阅读了一遍错误信息,感觉这个配置信息是由顺序的,于是按照报错信息调整后,启动tomcat后,错误消除。以前这个地方还真是没有太注意过。正确信息如下:

<display-name>webservices</display-name>
 <servlet>
     <servlet-name>AxisServlet</servlet-name>
     <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
 </servlet>
  <servlet-mapping>
      <servlet-name>AxisServlet</servlet-name>
      <url-pattern>/servlet/AxisServlet/*</url-pattern>
    </servlet-mapping>
   <servlet-mapping>
     <servlet-name>AxisServlet</servlet-name>
     <url-pattern>*.jws</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
     <servlet-name>AxisServlet</servlet-name>
      <url-pattern>/services/*</url-pattern>
   </servlet-mapping>
 <welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
 </welcome-file-list>




在flex整合java生成的web.xml中添加引用servelet的代码就报错如下:

The content of element type "web-app" must match "(icon?,display-name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet-mapping*,session-config?,mime-mapping*,welcome-file-list?,error-page*,taglib*,resource-env-ref*,resource-ref*,security-constraint*,login-config?,security-role*,env-entry*,ejb-ref*,ejb-local-ref*)". eoso/WebRoot/WEB-INF        web.xml line 5

添加的代码如下:

   <servlet>
     <servlet-name>downLoadServlet</servlet-name>
     <display-name>downLoadServlet</display-name>
     <servlet-class>jp.co.snjp.eos.web.odermanger.service.DownLoad</servlet-class>
    </servlet>
   
    <servlet-mapping>
     <servlet-name>downLoadServlet</servlet-name>
     <url-pattern>/download</url-pattern>
    </servlet-mapping>
如果把添加的代码删掉,web.xml就正常了,不会显示错误。但是这段代码是flex下载调用服务端的servlet用的,必须添加。说明,网上都是说顺序问题,但我已经按照icon?,display-name?,description?,distributable等等这种顺序添加节点的,但还是错误。后来,我把  <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">这一段校验代码删掉,问题就解决了。原因是:我添加的那部分代码符合xml文档规范,但不符合web-app_2_3.dtd所定义的规范。


























XML

XML代表Extensible Markup Language(eXtensible Markup Language的缩写,意为可扩展的标记语言)。XML 被设计用来传输和存储数据。XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。

XML特点

  • 标记需要自己去创建!一个最大的特殊处(与HTML不同处),它可以创建标签,包括使用中文标签
  • 语法更严格!标签必需成对嵌套,并且属性必须有属性值,属性值也必须包含在引号中
  • XML仅仅用来存储数据,不包含与数据显示相关的样式信息(这部分信息可以通过CSS等语言来传递),XML是具有语义的

书写XML

(本文规约,XML注释为了方法而不使用<!---->,而使用//,推荐使用XMLSpy编辑及验证XML)

一个完整的XML必须包含XML声明与一个文档根元素!XML声明必须包含版本信息,文档根元素可以是空元素,但一个XML文档只能有一个根元素!

Xml代码 复制代码  收藏代码
  1. <?xml version="1.0"?>  
  2. <root />  
 

注意:XML目前存在1.0与1.1两个版本,但浏览器只支持1.0版. XML声明的version属性是必须的. XML声明之前不能有任何东西,比如空格及注释(XML注释和HTML注释是一样的).XML文档只能且必须包含一个根元素,当元素是空元素时需要闭合

XML 声明还有其它两个属性:standalone与encoding.encoding属性用来指明XML文档所使用的字符编码,如指定为gbk或 gb2312则可以使用中文本,standalone属性指明XML文档是否独立不依赖于外部文档,默认值是yes,当使用外部XML DTD时需要将这个属性设为no

格式良好的XML与有效的XML

格式良好的XML(Well-formed XML)是指文档格式符合XML语法规范的XML,解释器在解释一个Not Well-formed XML的时会出现错误而停止!

一个遵守XML语法规则,并遵守相应DTD文件规范的XML文档称为有效的XML文档(Valid XML)。注意我们比较"Well-formed XML"和"Valid XML",它们最大的差别在于一个完全遵守XML规范,一个则有自己的"文件类型定义(DTD)"。将XML文档和它的DTD文件进行比较分析,看是否符合DTD规则的过程叫validation(确认)。这样的过程通常我们是通过一个名为parser 的软件来处理的。

DTD——文档类型定义(Document Type Definition)

由于XML可以自定义标签,那么自然各人编写的标签不一样,这样同步数据便成了问题,因为其它人不知道某个标签应该怎么用,表示什么意思.DTD就是为了解决此问题的!

DTD是一种保证XML文档格式正确的有效方法,可以比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。一个DTD文档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的实体或符号规则。

DTD分为内部DTD与外部DTD,内部DTD包含在XML文档中,外部DTD则通过URL引用.一个DTD文件是以.dtd结尾的文本文件

在XML中引入DTD DOCTYPE 文档类型声明

内部DTD,可以将standalone设置成yes.

Xml代码 复制代码  收藏代码
  1. <?xml version="1.0" standalone="yes"?>  
  2. <!DOCTYPE root [   
  3. <!ELEMENT root EMPTY>  
  4. ]>  
 

 

外部DTD,需要将standalone设成no

 

Xml代码 复制代码  收藏代码
  1. <?xml version="1.0" standalone="no"?>  
  2. <!DOCTYPE root SYSTEM "http://www.test.org/test.dtd">  
 

DOCTYPE分析

DTD声明始终以!DOCTYPE开头,空一格后跟着文档根元素的名称,如果是内部DTD,则再空一格出现[],在中括号中是文档类型定义的内容. 而对于外部DTD,则又分为私有DTD与公共DTD,私有DTD使用SYSTEM表示,接着是外部DTD的URL. 而公共DTD则使用PUBLIC,接着是DTD公共名称,接着是DTD的URL.下面是一些示例

公共DTD,DTD名称格式为"注册//组织//类型 标签//语言","注册"指示组织是否由国际标准化组织(ISO)注册,+表示是,-表示不是."组织"即组织名称,如:W3C; "类型"一般是DTD,"标签"是指定公开文本描述,即对所引用的公开文本的唯一描述性名称,后面可附带版本号。最后"语言"是DTD语言的ISO 639语言标识符,如:EN表示英文,ZH表示中文,在下面的地址有完整的ISO 639语言标识符列表http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt

Xml代码 复制代码  收藏代码
  1. <!DOCTYPE root SYSTEM "http://www.test.org/test.dtd">  
 

 

下面是XHTML 1.0 Transitional的DTD.以!DOCTYPE开始,html是文档根元素名称,PUBLIC表示是公共DTD,后面是DTD名称,以-开头表示是非ISO组织 组织名称是W3C,EN表示DTD语言是英语,最后是DTD的URL

Xml代码 复制代码  收藏代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"    
  2.     "http://www.w3.org/TR/xhtml/DTD/xhtml1-transitional.dtd">  
 

 

注意:虽然DTD的文件URL可以使用相对URL也可以使用绝对URL,但推荐标准是使用绝对URL.另一方面,对于公共DTD,如果解释器能够识别其名称,则不去查看URL上的DTD文件

开始编写DTD

XML 文档构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素 , 元素即所说的自定义标签,它是 XML 以及 HTML 文档的主要构建模块。
  • 属性 , 属性可提供有关元素的额外信息。属性总是被置于某元素的开始标签中。属性总是以名称/值的形式成对出现的。
  • 实体 , 实体是用来定义普通文本的变量。实体引用是对实体的引用。如HTML文档中的&nbsp;即是一个实体引用当文档被 XML 解析器解析时,实体就会被展开。
  • PCDATA , PCDATA 的意思是被解析的字符数据(parsed character data)。可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。PDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。不过,被解析的字符数据不应当包含任何&、< 或者 > 字符;需要使用 &amp;、&lt; 以及 &gt; 实体来分别替换它们。
  • CDATA , CDATA 的意思是字符数据(character data)。CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
CDATA

PCDATA 是指会被解析的字符串,这解析是指将其中的实体引用换成对应的实体内容.也就是说,一般的XML中的文本节点都是PCDATA,当这些文本中要包含一些 XML特殊字符时,需要使用实体引用,当这些字符很少时,使用实体引用还不是很麻烦,而当特殊字符很多时,则需要使用CDATA,即不解析字符串. CDATA 区段开始于 "<![CDATA[",结束于 "]]>",CDATA段中可以包含除CDATA限定符之外的任何字符

元素声明

元素声明使用<!ELEMENT 元素名称 (元素内容)>或<!ELEMENT 元素名称 类别>的语法

Xml代码 复制代码  收藏代码
  1. <!ELEMENT root EMPTY> //EMPTY关键字表示元素是个空元素   
  2.     <!ELEMENT root ANY> //ANY关键字表示元素中可以出现任何内容,也可以为空   
  3.     //下面这个声明表示root中可以有文本,也可以是空   
  4.     <!ELEMENT root (#PCDATA)> //()表示一个分组,其中是放的允许在元素出现的内容,#PCDATA表示文本   
  5.     <!ELEMENT root (child)> //child是子元素的名称,这个声明表示root中必须且只能有一个child元素   
  6.     <!ELEMENT root (child1,child2)> //以逗号分隔,表示子元素依次出现   
  7.     <!ELEMENT root (child1|child2)> //竖线与"OR"的意思相近,表示root元素中只能出现child1或child2   
  8.     <!ELEMENT root (child?)> //root中child子元素可以出现一次,也可以不出现   
  9.     <!ELEMENT root (child+)> //root中child子元素至少出现一次   
  10.     <!ELEMENT root (child*)> //root中child子元素可以出现任意次数或不出现   
  11.     <!ELEMENT root (child,(a,b))> //()还可以嵌套,这里表示root元素中第一次子元素必须是child   
  12.     //紧接着是a或b   
  13.     <!ELEMENT root (child,(a,b)+)> //*,?,+这些量词可作用于分组,这里表示root元素中第一次子元素必须是child   
  14.     //紧接着是a或b出现一次或多次  
 

 

Xml代码 复制代码  收藏代码
  1. <![CDATA[  
  2.     ABC-abc-ABC><&amp;//&amp;这个不并被替换成&  
  3. ]]>  
 

 

属性声明

属性声明使用<!ATTLIST 元素名称 属性名称 属性类型 默认值>的语法.示例如下:

Xml代码 复制代码  收藏代码
  1. <!ATTLIST input type CDATA "text">  
 

 

上面的属性声明表示:元素input的type属性值是文本,默认值是text;

以下是属性类型表

类型 描述
CDATA值为字符数据 (character data)
(en1|en2|..)此值是枚举列表中的一个值
ID值为唯一的 id
IDREF值为另外一个元素的 id
IDREFS值为其他 id 的列表
NMTOKEN值为合法的 XML 名称
NMTOKENS值为合法的 XML 名称的列表
ENTITY值是一个实体
ENTITIES值是一个实体列表
NOTATION此值是符号的名称
xml:值是一个预定义的 XML 值

默认值参数可以使用下列值

 

值 解释
属性的默认值.该属性可以出现,也可以不出现,当没有明确指定该属性时,属性值使用默认值
#REQUIRED属性值是必需的
#IMPLIED属性不是必需的,可以出现,可以不出现
#FIXED value属性值是固定的.属性可有可无,但有的时候,其值必须是value

Xml代码 复制代码  收藏代码
  1. <!ATTLIST img src CDATA #REQUIRED> //img元素的src属性是必须的,值为字符串   
  2. <!ATTLIST script type CDATA "text/javascript"> //script元素的type属性默认值是text/javascript   
  3. <!ATTLIST div id ID #IMPLIED> //div元素的id属性是唯一的ID标识,可有可无   
  4. <!ATTLIST input type(text|radio|checkbox) "text"> //input元素的type属性是三个值中的一个,默认值是text   
  5. <!ATTLIST label for IDREF #IMPLIED> //label元素的for属性是页面中另一个元素的ID  
 
实体声明
一般实体

实体是用于定义用于定义引用普通文本或特殊字符的快捷方式的变量。实体引用是对实体的引用。实体可在内部或外部进行声明。

一个内部实体是以<!ENTITY 实体名称 "实体的值">的形式声明的,一个外部私有实体是以<!ENTITY 实体名称 SYSTEM "URI/URL">格式声明 ,一个外部公共实体是以 <!ENTITY 实体名称 PUBLIC "公共实体名称" "URI/URL"> ,其中公共实体名称和DOCTYPE中的公共DTD名称格式是一样的. 一个实体引用是&实体名称;格式

 

Xml代码 复制代码  收藏代码
  1. //实体定义   
  2. <!ENTITY abc "ABCabcABC"> //内部实体   
  3. <!ENTITY abc SYSTEM "abc.ent"> //外部私有实体   
  4. <!ENTITY test PUBLIC "-//AjaxLife//ENTITIES TEST 1 for XML//EN" "test.ent"> //外部公共实体   
  5. //实体引用   
  6. <abc>&abc;</abc>  
 
参数实体

参数实体是只在DTD中使用的实体(并且参数实体只能在外部DTD中声明),它的声明语法与一般实体不同处在于其要在实体名称前加个百分号,而引用时则使用%实体名称;的形式

 

Xml代码 复制代码  收藏代码
  1. <!ENTITY % abc "root">  
  2. <!ELEMENT %abc; (child)>//这句将声明元素root,具有一个子元素child  
 

XML 命名空间

XML 命名空间可提供避免元素命名冲突的方法。由于 XML 中的元素名是预定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。命名空间其实就是给这些标签名加个前缀!

Xml代码 复制代码  收藏代码
  1. <root>  
  2.     <svg:template />  
  3.     <xsl:template />  
  4. </root>  
 

 

现在,root下仍然是两个template元素,它们的节点名称仍然是template,但是它们的意义不一样了,因为它们使用了不同的前缀!但是XML命名空间前缀需要声明才可以使用,如果不声明,则被视为元素名称的一部分! XML 命名空间属性被放置于某个元素的开始标签之中,并使用以下的语法:xmlns:namespace-prefix="namespaceURI" . 当一个命名空间被定义在某个元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。 注意,用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向某个实存的网页,这个网页包含着有关命名空间的信息。

 

Xml代码 复制代码  收藏代码
  1. <root xmlns:svg="http://www.svg.org" xmlns:xsl="http://www.xsl.org">  
  2.     <svg:template />  
  3.     <xsl:template />  
  4. </root>  
 

这样,为了区分那些名称相同而含义不同的元素,必须在每个元素名前面加前缀.其实还可以在父级元素上声明默认命名空间,让所有没有前缀子元素的默认使用此命名空间.HTML的命名空间便是一个例子.

Xml代码 复制代码  收藏代码
  1. <html xmlns="http://www.w3.org/1999/xhtml">  
  2. </html>  
 

 

对于使用命名空间的XML文档,其DTD中对元素的声明也应该包含命名空间前缀(即应与文档中所书写的一致).另外,命名空间不但作用于元素,还作用于属性

 http://www.iteye.com/topic/517520


http://book.51cto.com/art/201107/279264.htm






[原]用DTD规范XML文档 阴
http://www.linuxfly.org/post/439/
linuxing , 15:15 , 编程 » (X)HTML , 评论(0) , 引用(0) , 阅读(3620) , Via 本站原创 | |
引用地址:
注意: 该地址仅在今日23:59:59之前有效
    DTD全称为Document Type Definition,即文档类型定义。DTD是一套关于标记符的语法规则,它是XML 1.0版规范的一部分,也是XML文档的一个组成部分,它为XML文档提供了验证机制。DTD是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文件来检查文档是否符合规范,以及元素和属性的使用方法是否正确。
    XML文档为应用程序提供了一种数据交换的格式,DTD则让XML文档能够成为数据交换的标准。只需定义好标准的DTD,不同用户都按照DTD来创建XML文档并进行验证,这样就可以轻松地建立标准并进行数据交换,以实现数据共享。

一、内部DTD与外部DTD
若要通过DTD对XML文档格式进行验证,就需要在XML文档中引入DTD。既可以直接在XML文档中定义DTD(内部DTD),也可以通过URI引用外部DTD文件,两者可以同时使用。
使用内部DTD的优点是,DTD声明与XML文档正文包含在同一个文件中,在阅读时可以相互对照,比较直观,而且便于修改。外部DTD可适用于,使用相同的DTD对多个XML文档进行检查,可以把DTD声明存储在一个单独的文件中,然后在XML文档中引入。
1、内部DTD
使用内部DTD时,应将DTD声明放在XML文档声明之后、根元素的开始标记之前:

<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE rootelement [
元素声明、属性声明和实体声明
]>
XML文档正文部分

其中,“<!DOCTYPE”表示DTD声明开始,关键字DOCTYPE必须大写。rootelement表示根元素的名称。DTD声明序列用来对XML文档中使用的元素、属性和实体进行声明。

2、外部DTD
把DTD定义写到一个独立的文本文件中,其文件扩展名为.dtd,文件中还可以加入使用注释。
根据性质不同,外部DTD可以分为:
引用
a、私有DTD:指未公开的DTD文件,通常属于某个组织或个人所有;
b、公共DTD:指由某一应用领域或行业制定的,被国际上的标准组织等认可的、公开的、标准的DTD文件。

若要在一个XML文档中引入外部DTD,需要把standalone属性更改为no,然后在文档序言区域添加引用。
对于私有DTD文件,格式为:

<!DOCTYPE rootelement SYSTEM "URI">

对于公共DTD文件,格式为:

<!DOCTYPE rootelement PUBLIC "DTD_name" "URI">

其中,各关键字必须大写。DTD_name表示公共DTD文件的逻辑名称。公共DTD文件都有一个逻辑名称,也称为公共标识符。具体使用,可参考: [转]使用正确的DOCTYPE 声明

二、DTD元素声明
在XML文档中,一个元素的内容可以是各种各样的,既可以为空,也可以包含字符数据等。通过在DTD中对该文档使用的每个元素进行声明,以定义元素的名称、元素内容的数据类型、允许元素包含的子元素及其出现顺序等规范XML文档。
DTD对元素进行声明决定了整个XML文档的逻辑结构。语法格式:

<!ELEMENT element_name element_definition>

其中,“<!ELEMENT ”表示元素声明的开始,关键字ELEMENT必须大写。element_name表示要声明的元素名称。element_definition表示对该元素内容的定义,用来规定该元素可以包含哪些内容。在元素名称与内容定义之间必须包含空格。
一个XML元素可以不包含任何内容,也可以包含字符数据或子元素,也可以包含字符数据和子元素,还可以包含任何形式的内容。
1、声明空元素
若一个元素既不包含字符数据,也不包含子元素,就是空元素。声明为:

<!ELEMENT 元素名称 EMPTY>

2、声明元素包含字符数据
若一个元素仅包含字符数据,而不包含任何子元素,可声明为:

<!ELEMENT 元素名称 (#PCDATA)>

3、声明元素包含子元素
一个元素可以包含若干个子元素,这些子元素可以按照指定顺序依次出现,或者多个子元素只能出现其中的一个。
若在一个元素中系列子元素只能按指定顺序出现,可声明为:

<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>

若在一个元素中系列子元素只能出现其中之一,可声明为:
<!ELEMENT 元素名称 (子元素名称 1|子元素名称 2|.....)>

以上介绍了顺序子元素和互斥子元素。默认情况下,这些子元素在其父元素中都只能出现一次。若要指定一个子元素在其父元素中出现的次数,则可以通过在子元素名称之后附件以下元组运算符来实现。
引用
加号(+):指定子元素可以出现一次或多次;
星号(*):指定子元素可以出现零次或多次;
问号(?):指定子元素可以出现零次或一次。

例如:

<!ELEMENT student (studentno,name,email*,mobilephone?,interest+)>

除了使用元组运算符指定子元素出现的次数外,还可以使用圆括号把若干个子元素括起来,把它们作为一个元素组来处理。在该元素组中可以包含若干个顺序子元素,也可以包含若干个互斥子元素。对于元素组,可以使用元组运算符来控制其出现的次数。
例如:

<!ELEMENT customer (name,homeaddress?,(phone|mobilephone))>

4、声明元素包含字符数据和子元素
若一个元素中可以包含字符数据以及零个或多个子元素,可以声明为:

<!ELEMENT 元素名称 (#PCDATA|子元素名称 1|子元素名称 2|...)*>

声明包含混合内容的元素时,应注意以下几点:
引用
a、#PCDATA关键字必须是圆括号中的第一项;
b、在圆括号中可以使用短竖线,但不能使用逗号、问号或加号;
c、在圆括号中虽然使用了短竖线,但并不表明各个并列项之间存在互斥关系;
d、在圆括号后面必须添加星号,即混合内容必须声明为零个或多个。

5、声明元素包含任意内容
若一个元素可以包含任意内容,可声明为:

<!ELEMENT 元素名称 ANY>

ANY关键字表示该元素可以包含字符数据,也可以包含子元素。
若把一个元素声明为ANY类型,则对该元素几乎没有任何约束;这不符合DTD的设计目标。因此,在实际应用中,应尽量避免声明ANY元素。

三、DTD属性声明
若要创建有效的XML文档,不仅要在DTD中对该文档中的所有元素进行声明外,还要在DTD中对元素的所有属性进行声明,以设置元素所拥有的每个属性的名称、数据类型、是必选或可选等。
在有效的XML文档中,应将在DTD中声明的属性名称和属性值包含在元素的开始标记中。
声明元素属性的语法格式如下:

<!ATTLIST 元素名称 属性名称 属性类型 声明值>

若要声明多个属性,可以把这些属性放在不同行上,也可以放在同一行上并用空格分隔。

在XML规范中,允许为元素属性指定一下类型:
引用
CDATA:值为字符数据 (character data)
Enumerated:此值是枚举列表中的一个值,各个值之间用短竖线分隔,(en1|en2|..)
ID: 值为唯一的 id
IDREF: 值为另外一个元素的 id
IDREFS: 值为其他 id 的列表
NMTOKEN: 值为合法的 XML 名称
NMTOKENS: 值为合法的 XML 名称的列表
ENTITY: 值是一个实体
ENTITIES: 值是一个实体列表
NOTATION: 此值是符号的名称
xml: 值是一个预定义的 XML 值

声明值是可选的,有以下4种情况:
引用
值: 属性的默认值
#REQUIRED:属性值是必需的
#IMPLIED: 属性不是必需的
#FIXED value: 属性值是固定的

四、DTD实体声明
在DTD中,可以把XML声明、XML元素、DTD或其他类型的数据事先定义为一个实体的单元,然后在DTD内部或XML文档中通过实体的名称来引用实体的具体内容。这样可以实现一次编写重复使用的目的,每当在实体声明中修改实体内容时,所有引用该实体的DTD或XML文档就会自动更新。
1、内部实体
在XML文档中声明的实体称为内部实体,它只能在该文档内部引用。语法是:

<!ENTITY 实体名称 "实体的值">

在文档中引用内部实体的语法是:

&实体名称;

※ 注意,除了在XML文档中引用实体外,也可以再DTD中声明实体时引用已经声明的其他实体,但不能在元素和属性声明中引用实体。

2、外部实体

外部实体存储在一个独立的外部文件中,可以在多个XML文档中引用。语法为:

<!ENTITY 实体名称 SYSTEM "URI/URL">

引用外部实体的语法格式与引用内部实体时相同。但引用外部实体时,要记住把XML文档声明中的standalone属性设置为“no”。

3、内部参数实体
内部参数实体是指在独立的DTD文件内部定义的实体,并且该实体只能在这个DTD文档内部引用,而不能在XML文档中引用。语法是:

<!ENTITY % name "content">

百分号(%)表示这是一个参数实体;name表示要声明的实体名称,contenet表示该实体的具体内容。
在DTD中引用内部参数实体的语法格式为:

%name;

4、外部参数实体
还可以引用在其他独立DTD文件中声明的实体,语法是:

<!ENTITY % name SYSTEM "URI">

在DTD中引用外部参数实体与引用内部参数实体的语法相同。

四、通过 XML 解析器进行验证
当您试图打开某个 XML 文档时,XML 解析器有可能会产生错误。通过访问 parseError 对象,就可以取回引起错误的确切代码、文本甚至所在的行。

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="true"
xmlDoc.load("note_dtd_error.xml")

document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)

注释:load( ) 方法用于文件,而 loadXML( ) 方法用于字符串。通过把 XML 解析器的 validateOnParse 设置为 "false",就可以关闭验证。

五、参考文档
DTD 教程
解码 XML 和 DTD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福海鑫森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值