16. Servlet规范简介
<!-- catalog的Servlet,它的实现类为com.mycorp.
The servlet element contains the CatalogServlet,并且带有一个catalog参数,参数
declarative data of a 值为Spring,所有向/catalog/*的请求都被映射到
servlet. If a jsp-file is specified and the 名称为catalog的Servlet。
load-on-startup element
is present, then the JSP should be
precompiled and loaded.
Used in: web-app 映射请求到Servlet
-->
<!ELEMENT servlet (icon?, servlet-name, 接收到一个请求后,WEB容器要确定转到哪一个
display-name?, description?, WEB应用程序。被选择的应用程序的最长的上下文路
(servlet-class|jsp-file), init-param*, 径必须和请求的URL开始部分匹配。URL匹配的部分
load-on-startup?, runas?, 是映射到Servlet的上下文路径。
security-role-ref*)> WEB容器下一步必须按照下面的程序定位处理请
<!-- 求的Servlet。
The servlet-class element contains the 用来映射到Servlet的路径是请求对象的URL减
fully qualified class name 去上下文的路径。下面的URL路径映射规则按顺序执
of the servlet. 行,容器选择第一个成功的匹配并且不在进行下一
Used in: servlet 个匹配:
--> 容器试着对请求的路径和Servlet的路径
<!ELEMENT servlet-class (#PCDATA)> 进行精确匹配,如果匹配成功则选择这个
<!-- Servlet。
The servlet-mapping element defines a 容器会循环的去试着匹配最长的路径前缀:
mapping between a servlet 把’/’当作路径分隔符,按照路径树逐级
and a url pattern 递减的完成,选择最长匹配的Servlet。
Used in: web-app 如 果 这 个 U R L 路 径 的 最 后 有 扩 展 名 (比
--> 如.jsp),Servlet容器会试着匹配处理这个
<!ELEMENT servlet-mapping (servlet-name, 扩展名的Servlet。
url-pattern)> 如果前面的没有与前面三条规则相匹配的
<!-- Servlet,容器会试着为资源请求提供适
The servlet-name element contains the 当的资源,如果有“默认”的Servlet定义
canonical name of the 给这个应用程序,那么这个Servlet会被使
servlet. Each servlet name is unique within 用。
the web application.
Used in: filter-mapping, servlet, servlet- 容器必须使用一个大小写敏感的匹配方式。
mapping 在部署描述符中,用下面的语法定义映射:
--> 一个以’/’开始并且以’/*’结束的字符
<!ELEMENT servlet-name (#PCDATA)> 串用来映射路径。
一个以’*.’为前缀的字符串用来映射扩展
根据以上DTD,一个典型的Servlet的声明的格式如 名。
下: 一个只包含’/’的字符串指示着这个应用
<servlet>
程序“默认”的Servlet,在这种情况下,
<servlet-name>catalog</servlet-name>
servlet的路径是请求的URI减去上下文路
<servlet-class>com.mycorp.CatalogServlet</
径,并且这个路径是null。
servlet-class>
所有其他的字符只用来精确匹配。
<init-param>
如果容器内置JSP容器,那么*.jsp被映射到
<param-name>catalog</param-name>
这个容器,并允许JSP页面在需要的时候被执行。
<param-value>Spring</param-value>
这种映射叫做隐含映射。如果WEB应用程序中定义
</init-param>
了*.jsp的映射,那么这个映射有比隐含映射高的优
</servlet>
先级。
一个典型的Servlet映射如下: WEB容器允许显式的声明隐含映射以获得优先
<servlet-mapping> 级,例如,*.shtml的隐含映射可以在服务器上被映
<servlet-name>catalog</servlet-name> 射为包含功能。
<url-pattern>/catalog/*</url-pattern> 映射实例:
</servlet-mapping> path pattern servlet
/foo/bar/* servlet1
/baz/* servlet2
通过上面的方法,我们就声明了一个名称为 /catalog servlet3
*.bop servlet4