10

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

host
host/
host/BaseServlet

它应该始终引用同一个 servlet 并重定向到主页。

当我设置

@WebServlet({"/BaseServlet", ""})

仅有的

host/
host/BaseServlet

作品

如果我设置

@WebServlet({"/BaseServlet", "", "/"})

BaseServlet 将在循环中不断被请求...

为什么?

编辑:BaseServlet 对隐藏在 WEB-INF 文件夹中的 index.html 进行转发,仅此而已。

getServletContext().getRequestDispatcher("/WEB-INF/index.html").forward(request,response);

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

4

2 回答 2

12
  1. 正如您在 Q 中所说,如果您想要以下内容:

    host/
    host/BaseServlet
    

    利用

    @WebServlet({"/BaseServlet", ""})
    
  2. 如果您想要以下内容:

    host
    

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

    <welcome-file-list>
        <welcome-file>/BaseServlet</welcome-file>
    </welcome-file-list>
    
  3. servlet 规范说“仅包含 '/' 字符的字符串表示应用程序的“默认”servlet。”

    但事后直接说

    在这种情况下,servlet 路径是请求 URI 减去上下文路径,并且路径信息为空。

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

    host
    

    那么servlet路径将是

    "" (empty string)
    

    因此您将需要一个欢迎文件列表(但 webapp 目录中的 index.htm[l] 和 index.jsp,而不是 WEB-INF,被隐式包含为起始欢迎文件列表)

于 2013-06-28T03:16:19.727 回答
2

编辑:

如果要进行预处理,则可以使用带有 url-pattern "/*" 的过滤器并将调度程序设置为 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());
于 2013-05-22T11:38:54.390 回答