Servlet的XML配置-6.23

本文详细介绍了在web.xml中配置Servlet的过程,包括如何定义Servlet的类和映射。讨论了Servlet容器如何根据URL路径和<servlet-mapping>元素进行请求匹配,解释了精确匹配、最长路径前缀匹配和扩展名匹配的规则,并给出了例子说明。同时提到了Tomcat默认Servlet的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面是在web.xml里定义一个Servlet,包括类位置和servlet-mapping

 <servlet>
 <servlet-name>SayHello</servlet-name>
 <servlet-class>common.SayHello</servlet-class>
< /servlet>

<servlet-mapping>
  <servlet-name>SayHello</servlet-name>
  <url-pattern>/SayHello</url-pattern>
 </servlet-mapping>

当在浏览器里执行 http://localhost:8080/站点名称/SayHello,是可以执行该Servlet,这里的SayHello对应servlet-mapping里的url-pattern定义的SayHello,如果我们将servlet-mapping修改:

<servlet-mapping>
  <servlet-name>SayHello</servlet-name>
  <url-pattern>/SayHello123456</url-pattern>
 </servlet-mapping>

那么在浏览器执行http://localhost:8080/站点名称/SayHello是不对的,这是应该是http://localhost:8080/站点名称/SayHello123456

所以url-pattern完全对应浏览器的输入

<servlet-mapping>元素及其子元素

<servlet-mapping>元素在Servlet和URL样式之间定义一个映射。它包含了两个子元素<servlet- name>和<url-pattern>,<servlet-name>元素给出的Servlet名字必须是在<servlet>元素中声明过的Servlet的名字。<url-pattern>元素指定对应于Servlet的URL路径,该路径是相对于Web应用程序上下文根的路径。例如:

<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
Servlet 2.5规范允许<servlet-mapping>的<url-pattern>子元素出现多次,之前的规范只允许一个<servlet-mapping>元素包含一个<url-pattern>子元素。我们看下面的例子:
<servlet-mapping>
<servlet-name>welcome</servlet-name>
<url-pattern>/en/welcome</url-pattern>
<url-pattern>/zh/welcome</url-pattern>
</servlet-mapping>

在配置了Servlet与URL样式之间的映射后,当Servlet容器接收到一个请求,它首先确定该请求应该由哪一个Web应用程序来响应。这是通过比较请求URI的开始部分与Web应用程序的上下文路径来确定的。映射到Servlet的路径是请求URI减去上下文的路径,Web应用程序的Context对象在去掉请求URI的上下文路径后,将按照下面的路径映射规则的顺序对剩余部分的路径进行处理,并且在找到第一个成功的匹配后,不再进行下一个匹配。

容器试着对请求的路径和Servlet映射的路径进行精确匹配,如果匹配成功,则调用这个Servlet来处理请求。

容器试着匹配最长的路径前缀,以斜杠(/)为路径分隔符,按照路径树逐级递减匹配,选择最长匹配的Servlet来处理请求。

如果请求的URL路径最后有扩展名,如.jsp,Servlet容器会试着匹配处理这个扩展名的Servlet。

如果按照前面3条规则没有找到匹配的Servlet,容器会调用Web应用程序默认的Servlet来对请求进行处理,如果没有定义默认的Servlet,容器将向客户端发送HTTP 404错误信息(请求资源不存在)。

在部署描述符中,可以使用下面的语法来定义映射。

以/开始并且以 /* 结束的字符串用来映射路径,例如:

 <url-pattern>/admin/*</url-pattern>

如果没有精确匹配,那么对/admin/路径下的资源的所有请求将由映射了上述URL样式的Servlet来处理。

以 *. 为前缀的字符串用来映射扩展名,例如:

<url-pattern>*.do</url-pattern>

如果没有精确匹配和路径匹配,那么对具有.do扩展名的资源的请求将由映射了上述URL样式的Servlet来处理。

以一个单独的/指示这个Web应用程序默认的Servlet,例如:

 <url-pattern>/</url-pattern>

如果对某个请求没有找到匹配的Servlet,那么将使用Web应用程序的默认Servlet来处理。

所有其他的字符被用于精确匹配,例如:

<url-pattern>/login</url-pattern>

如果请求/login,那么将由映射了URL样式/login的Servlet来处理。

下面我们看几个请求映射的例子,如表3-2和表3-3所示。

表3-2  Servlet映射

映射的URL

对应的Servlet

/hello

servlet1

/bbs/admin/*

servlet2

/bbs/*

servlet3

*.jsp

servlet4

/

servlet5

 实际请求映射的结果

去掉上下文路径的剩余路径

处理请求的Servlet

/hello

servlet1

/bbs/admin/login

servlet2

/bbs/admin/index.jsp

servlet2

/bbs/display

servlet3

/bbs/index.jsp

servlet3

/bbs

servlet3

/index.jsp

servler4

/hello/index.jsp

servlet4

/hello/index.html

servlet5

/news

servlet5

Tomcat在%CATALINA_HOME%\conf\web.xml文件中配置了默认的Servlet,配置代码如下:

<servlet>
<servlet-name>default</servlet-name>
<servlet-class>
org.apache.catalina.servlets.DefaultServlet </servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

[root@localhost yum.repos.d]# cpanm -f Net::HTTP GSSAPI Params::Validate Test::Mock::LWP LWP::Authen::Negotiate --> Working on Net::HTTP Fetching https://www.cpan.org/authors/id/O/OA/OALDERS/Net-HTTP-6.23.tar.gz ... OK Configuring Net-HTTP-6.23 ... OK Building and testing Net-HTTP-6.23 ... OK Successfully installed Net-HTTP-6.23 --> Working on GSSAPI Fetching https://www.cpan.org/authors/id/A/AG/AGROLMS/GSSAPI-0.28.tar.gz ... OK Configuring GSSAPI-0.28 ... N/A ! Configure failed for GSSAPI-0.28. See /root/.cpanm/work/1752032584.51560/build.log for details. --> Working on Params::Validate Fetching https://www.cpan.org/authors/id/D/DR/DROLSKY/Params-Validate-1.31.tar.gz ... OK Configuring Params-Validate-1.31 ... OK Building and testing Params-Validate-1.31 ... OK Successfully reinstalled Params-Validate-1.31 --> Working on Test::Mock::LWP Fetching https://www.cpan.org/authors/id/L/LU/LUKEC/Test-Mock-LWP-0.08.tar.gz ... OK Configuring Test-Mock-LWP-0.08 ... OK Building and testing Test-Mock-LWP-0.08 ... OK Successfully reinstalled Test-Mock-LWP-0.08 --> Working on LWP::Authen::Negotiate Fetching https://www.cpan.org/authors/id/A/AG/AGROLMS/LWP-Authen-Negotiate-0.08.tar.gz ... OK Configuring LWP-Authen-Negotiate-0.08 ... OK ==> Found dependencies: GSSAPI, LWP::Debug --> Working on LWP::Debug Fetching https://www.cpan.org/authors/id/O/OA/OALDERS/libwww-perl-6.79.tar.gz ... OK Configuring libwww-perl-6.79 ... OK Building and testing libwww-perl-6.79 ... OK Successfully installed libwww-perl-6.79 ! Installing the dependencies failed: Module 'GSSAPI' is not installed ! Bailing out the installation for LWP-Authen-Negotiate-0.08. 4 distributions installed [root@localhost yum.repos.d]#
最新发布
07-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值