这是一个简单的问题,但我找不到快速的答案。 现在我有一个servlet BaseServlet, 当用户请求以下任何网址时:
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成为我的默认设置。为什么它不起作用?
答案 0 :(得分:11)
正如您在Q中所述,如果您需要以下内容:
host/
host/BaseServlet
使用
@WebServlet({"/BaseServlet", ""})
如果您需要以下内容:
host
将此添加到您的欢迎文件中(您无法使用注释指定欢迎文件)
<welcome-file-list>
<welcome-file>/BaseServlet</welcome-file>
</welcome-file-list>
servlet规范说“只包含'/'字符的字符串表示应用程序的”默认“servlet。”
但事后直接说
在这种情况下,servlet路径是请求URI减去上下文路径 并且路径信息为空。
换句话说,如果您的网址是
host
然后servlet路径将是
"" (empty string)
所以你需要一个欢迎文件列表(但是webapp目录中的index.htm [l]和index.jsp,而不是WEB-INF,被隐含地包含在一个起始的欢迎文件列表中)
答案 1 :(得分: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());