当试图使一个简单的webservlet偶然发现这个问题时:如果我使用包含/../的名称,它将无法找到该资源。
这就是我的工作:
Controller.java
@WebServlet(urlPatterns = {"/Controller"})
public class Controller extends HttpServlet{ ... }
JSP页面:
<form action="Controller">
...
</form>
但是,我尝试将名称指定为文件夹,以便更有条理地工作。这是我挣扎的代码,它不起作用:
@WebServlet(urlPatterns = {"/servletController/Controller"})
public class Controller extends HttpServlet{ ... }
JSP页:
<form action="/servletController/Controller">
...
</form>
我尝试了很多变化。所以我的问题是,如何正确使用带有urlPatters-annotation的文件夹结构,还是只是不可能?
答案 0 :(得分:0)
它是由您在<form action>
中指定的前导斜杠引起的。它使指定的URL域相对。即如您在浏览器的地址栏中所看到的那样,它相对于URL中的域根解析,而不是在浏览器的地址栏中看到URL中当前请求的路径(文件夹)。
想象一下,您的JSP是由
打开的http://localhost:8080/contextname/some.jsp
,因此URL中包含文件夹/contextname
。您提交的表单操作将提交到
http://localhost:8080/servletController/Controller
虽然servlet与您的映射实际位于以下URL:
http://localhost:8080/contextname/servletController/Controller
相应地修复表单操作以使其成为路径相对而不是域相对:
<form action="servletController/Controller">
或者,通过指定有效的域相对URL:
<form action="/contextpath/servletController/Controller">
或者,如果您担心上下文路径的动态性,而不是硬编码:
<form action="${pageContext.request.contextPath}/servletController/Controller">