一尘不染

在JSP中使用@WebServlet url模式注释进行映射

jsp

尝试制作一个简单的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的文件夹结构,还是不可能?


阅读 480

收藏
2020-06-10

共1个答案

一尘不染

这是由您在中指定的前导斜线引起的<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">
2020-06-10