Servlet @WebServlet urlPatterns

kak*_*cii 9 java servlets url-pattern

这是一个快速的问题,但我找不到快速的答案.现在我有一个servlet BaseServlet,当用户请求下面的任何url时:

host
host/
host/BaseServlet
Run Code Online (Sandbox Code Playgroud)

它应始终引用相同的servlet并重定向到主页.

当我设置

@WebServlet({"/BaseServlet", ""})
Run Code Online (Sandbox Code Playgroud)

只要

host/
host/BaseServlet
Run Code Online (Sandbox Code Playgroud)

作品

如果我订

@WebServlet({"/BaseServlet", "", "/"})
Run Code Online (Sandbox Code Playgroud)

BaseServlet将被循环请​​求...

为什么?

编辑:BaseServlet转发到WEB-INF文件夹中的index.html hid,就是这样.

getServletContext().getRequestDispatcher("/WEB-INF/index.html").forward(request,response);
Run Code Online (Sandbox Code Playgroud)

servlet规范说"只包含/字符的字符串表示应用程序的"默认"servlet." 所以我希望BaseServlet成为我的默认设置.为什么它不起作用?

Gle*_*est 11

  1. 正如您在Q中所述,如果您需要以下内容:

    host/
    host/BaseServlet
    
    Run Code Online (Sandbox Code Playgroud)

    使用

    @WebServlet({"/BaseServlet", ""})
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您需要以下内容:

    host
    
    Run Code Online (Sandbox Code Playgroud)

    将此添加到您的欢迎文件(您不能使用注释指定欢迎文件)

    <welcome-file-list>
        <welcome-file>/BaseServlet</welcome-file>
    </welcome-file-list>
    
    Run Code Online (Sandbox Code Playgroud)
  3. servlet规范说"只包含'/'字符的字符串表示应用程序的"默认"servlet."

    但事后直接说

    在这种情况下,servlet路径是请求URI减去上下文路径,路径信息为null.

    换句话说,如果您的网址是

    host
    
    Run Code Online (Sandbox Code Playgroud)

    那么servlet路径就是

    "" (empty string)
    
    Run Code Online (Sandbox Code Playgroud)

    所以你需要一个欢迎文件列表(但是webapp目录中的index.htm [l]和index.jsp,而不是WEB-INF,被隐含地包含在一个起始的欢迎文件列表中)


Sne*_*tel 2

编辑:

如果您想进行预处理,则可以使用带有 url 模式“/*”的过滤器,并将调度程序设置为 REQUEST,这样它将忽略转发。

最后一个值“/”表示所有请求。

查看讨论:http://www.coderanch.com/t/366340/Servlets/java/servlet-mapping-url-pattern

在 Servlet 内部,会生成另一个对 index.html 的转发请求,该请求也被 servlet 拦截。

如果您尝试与 @WebServlet({"/BaseServlet", "", "/"}) 相同的 @WebServlet({"/BaseServlet", "/"}) 将导致相同的错误。

您可以通过在 servlet 中键入以下输出语句来检查这一点:

System.out.println(req.getRequestURL());
Run Code Online (Sandbox Code Playgroud)