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
<think>我们正在解决用户使用cpanm安装GSSAPI和LWP::Authen::Negotiate失败的问题。根据之前的分析,这两个模块的安装失败通常是因为系统缺少必要的开发库和工具。特别是GSSAPI模块需要Kerberos开发库(krb5-devel)的支持。 解决方案步骤: 1. 安装系统级依赖 - 确保已安装Kerberos开发库(krb5-devel)和必要的开发工具 - 启用EPEL仓库(如果尚未启用)以获取更多Perl模块的RPM包 2. 使用系统包管理器安装(推荐) - 如果系统有可用的Perl模块包,优先使用yum/dnf安装 3. 使用CPAN安装(当系统包不可用时) - 配置CPAN以使用系统库 4. 环境检查 具体步骤: 步骤1:安装系统依赖 对于CentOS/RHEL: ```bash # 启用EPEL仓库 sudo yum install -y epel-release # 安装开发工具链和Kerberos开发包 sudo yum groupinstall -y "Development Tools" sudo yum install -y krb5-devel perl-devel ``` 步骤2:尝试使用系统包安装Perl模块 ```bash sudo yum install -y perl-GSSAPI perl-LWP-Authen-Negotiate ``` 如果步骤2成功,则问题解决。如果系统包不存在或版本太旧,则进入步骤3。 步骤3:使用CPAN安装 ```bash # 安装cpanm(如果尚未安装) sudo yum install -y perl-App-cpanminus # 设置环境变量,告知cpanm使用系统库(重要!) export KRB5_INCLUDE=/usr/include/kerberos5 export KRB5_LIB=/usr/lib64 # 安装GSSAPI cpanm --configure-args="INC=-I$KRB5_INCLUDE LIBS=-L$KRB5_LIB" GSSAPI # 安装LWP::Authen::Negotiate cpanm LWP::Authen::Negotiate ``` 注意:上面的路径(KRB5_INCLUDE和KRB5_LIB)可能需要根据系统实际情况调整。例如,在32位系统上,库路径可能是/usr/lib。 步骤4:验证安装 ```bash perl -MGSSAPI -e 'print "GSSAPI installed\n"' perl -MLWP::Authen::Negotiate -e 'print "LWP::Authen::Negotiate installed\n"' ``` 如果验证命令没有报错,则安装成功。 常见问题及解决: 1. 如果安装GSSAPI时出现头文件或库文件找不到的错误,请检查krb5-devel是否安装正确,并确认头文件和库文件的路径。 可以使用以下命令查找: find /usr -name 'gssapi.h' find /usr -name 'libgssapi_krb5.so*' 2. 如果系统存在多个Kerberos版本(如Heimdal和MIT Kerberos),需要确保使用的开发文件与系统运行时一致。 总结:通过安装系统开发依赖,并正确配置cpanm使用这些依赖,可以成功安装GSSAPI和LWP::Authen::Negotiate模块。 相关问题: 1. 如何确认krb5-devel已经正确安装? 2. 如何设置环境变量以便cpanm能够找到Kerberos库? 3. 安装过程中出现链接错误(如undefined reference)如何解决? 4. 如何为Perl模块指定非标准路径的Kerberos开发文件? 5. 在非CentOS/RHEL系统(如Ubuntu)上如何解决相同问题?</think>### 解决 cpanm 安装 GSSAPI 和 LWP::Authen::Negotiate 失败问题 #### 🔧 核心问题分析 1. **GSSAPI 安装失败** - 需要 Kerberos 开发库(`krb5-devel`) - 缺少头文件:`gssapi/gssapi.h` - 需要指定 Kerberos 库路径 2. **LWP::Authen::Negotiate 依赖问题** - 依赖于 GSSAPI 模块 - 需要正确配置 HTTP 工具链 --- #### ✅ 完整解决方案(分步操作) ##### 步骤 1:安装系统级依赖 ```bash # 安装 Kerberos 开发库(关键) sudo yum install -y krb5-devel # 安装 Perl 开发工具链 sudo yum install -y perl-devel perl-ExtUtils-MakeMaker # 安装编译工具 sudo yum install -y gcc make openssl-devel ``` ##### 步骤 2:配置 Kerberos 路径环境变量 ```bash # 设置 Kerberos 头文件和库路径 export KRB5_INCLUDE=/usr/include/krb5 export KRB5_LIB=/usr/lib64 # 32位系统用 /usr/lib # 验证路径存在 ls $KRB5_INCLUDE/gssapi/gssapi.h # 应显示文件 ``` ##### 步骤 3:强制安装 GSSAPI 模块 ```bash # 指定 Kerberos 路径安装 cpanm --configure-args="INC=-I$KRB5_INCLUDE LIBS=-L$KRB5_LIB" GSSAPI # 备用方案:手动安装 cpanm --force https://cpan.metacpan.org/authors/id/A/AG/AGROLMS/GSSAPI-0.28.tar.gz ``` ##### 步骤 4:安装 LWP::Authen::Negotiate ```bash # 先安装 HTTP 工具链 cpanm LWP::Protocol::https Mozilla::CA # 安装主模块 cpanm LWP::Authen::Negotiate ``` ##### 步骤 5:验证安装 ```bash perl -MGSSAPI -e 'print "GSSAPI OK\n"' perl -MLWP::Authen::Negotiate -e 'print "LWP::Authen::Negotiate OK\n"' ``` --- #### ⚠️ 常见错误处理 **错误 1:`gssapi.h not found`** ```bash # 查找实际路径 find /usr -name gssapi.h # 通常位于 /usr/include/gssapi 或 /usr/include/krb5 # 更新环境变量 export KRB5_INCLUDE=$(dirname $(find /usr -name gssapi.h | head -1)) ``` **错误 2:`Undefined symbol: gss_acquire_cred`** ```bash # 添加 Kerberos 库链接 export PERL_MM_OPT="LIBS='-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err'" cpanm --reinstall GSSAPI ``` **错误 3:证书验证失败** ```bash # 跳过 SSL 验证(临时方案) cpanm --notest --skip-satisfied LWP::Authen::Negotiate ``` --- #### 🌐 替代安装方案 ```bash # 使用系统包安装(如果可用) sudo yum install -y \ perl-GSSAPI \ perl-LWP-Authen-Negotiate # 使用 Docker 隔离环境 docker run -it perl:5.36 cpanm LWP::Authen::Negotiate ``` --- #### 📊 验证结果 | 模块 | 测试命令 | 成功标志 | |------------------------|----------------------------------------|------------------| | `GSSAPI` | `perl -MGSSAPI -e 'exit 0'` | 返回码 0 | | `LWP::Authen::Negotiate` | `perl -MLWP::Authen::Negotiate -e 1` | 无错误输出 | --- #### ❓ 相关问题 1. 如何修复 `gss_accept_sec_context` 符号未定义错误? 2. 在非 Kerberos 环境中如何绕过 GSSAPI 依赖? 3. 如何为 cpanm 永久设置 Kerberos 库路径? 4. 使用 `--force` 安装后模块无法加载怎么办? 5. 如何调试 Perl 模块的 C 语言层链接错误? > 提示:提供 `perl -V` 和 `ls -l /usr/lib*/libgssapi*` 输出可进一步诊断问题[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值