gpt4 book ai didi

java - 关于 Servlet 绑定(bind)模式和默认 servlet

转载 作者:行者123 更新时间:2023-11-28 22:46:38 30 4
gpt4 key购买 nike

我有一个 Servlet,我想绑定(bind)到 "/" 模式。之后,所有 URL 都可以正常工作,包括应用程序根目录,但我还需要 default servlet 来支持静态文件。

以这种方式将其添加到 web.xml 后,我在应用程序根 URL 处收到 404 错误,但所有其他 URL 仍由分配给 "/"< 的 Servlet 成功处理.

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>*.js</url-pattern>
<servlet-mapping>

在我将 Servlet 也绑定(bind)到 "" 模式后,它工作正常。我对这种模式的理解与应用程序的根 URL 有关。

你能帮我找出这种行为的原因吗?

附言我使用 TomCat 和 Undertow 检查行为。

最佳答案

我使用 Apache Tomcat 9.0.21 和以下 servlet 重现了您的问题:

package my.sample;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Servlet1 extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("servlet1: " + req.getServletPath());
}
}

和 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="myApp" version="4.0">
<display-name>myWebApp</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>my.sample.Servlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
</web-app>

打开 URL http://localhost:8080/myWebApp/导致您所描述的错误 404。不匹配任何 default 的其他网址小服务程序 url-pattern由我处理 servlet1并产生类似 servlet1: /hello 的输出例如当打开 http://localhost:8080/myWebApp/hello

删除 <url-pattern>*.html</url-pattern> 时来自 default servlet 映射,你的问题消失了,我得到了 servlet1: /作为打开时的响应 http://localhost:8080/myWebApp/ .

添加 <url-pattern>*.html</url-pattern> 时至 servlet1我得到 servlet 映射 servlet1: /index.html作为打开时的响应 http://localhost:8080/myWebApp/ .

这表明您的问题的原因是路径 /在内部转发到欢迎文件 index.html,它与为 default 配置的 *.html url 模式完全匹配在你的情况下是 servlet - 因此是 default选择 servlet 来处理 /请求路径。如果 index.html 不存在,default servlet 发送您观察到的 404 错误。

关于java - 关于 Servlet 绑定(bind)模式和默认 servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58287537/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com