Servlet @WebServlet urlPatterns

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

host host/ host/BaseServlet 

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

我订的时候

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

只要

 host/ host/BaseServlet 

作品

如果我订

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

将不断循环请求BaseServlet …

为什么?

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

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

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

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

     host/ host/BaseServlet 

    使用

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

     host 

    将其添加到您的欢迎文件中(您无法使用注释指定欢迎文件)

      /BaseServlet  
  3. servlet规范说“只包含’/’字符的字符串表示应用程序的”默认“servlet。”

    但事后直接说

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

    换句话说,如果您的url是

     host 

    那么servlet路径就是

     "" (empty string) 

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

编辑:

如果你想进行预处理,那么你可以使用带有url-pattern“/ *”的filter,并将调度程序设置为REQUEST,这样就会忽略forward。

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

结帐讨论: 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());