【问题标题】:How to prepend front controller servlet mapping to urls in jsp如何在jsp中预先将前端控制器servlet映射到url
【发布时间】:2017-08-10 15:59:18
【问题描述】:

我有一个在 Tomcat 中运行的简单 Java Web 应用程序。

在其中,FrontController.java servlet 有映射@WebServlet("/controller/*")。因此,为了触发 servlet,我需要我的每个 url 都以 /controller/ 开头。我需要能够在页面上显示图像图像存储在容器外部,以便我将它们写入OutputStream)。但是,如果我将我的 src url 写成 ${pageContext.request.contextPath}images/picture.jpg,那么生成的 url 显然是 localhost:8080/rootFolder/images/picture.jpg 而不是 localhost:8080/rootFolder/controller/images/picture.jpg

要加载这些文件,我可以在每个 ${pageContext.request.contextPath} 之后手动添加 controller/,这很糟糕,或者我可以按照此处找到的建议 append dispathcer servlet mapping to url 并将行 request.setAttribute("frontControllerMapping", "controller/"); 添加到每个处理请求然后编码 URL 的方法像这样${pageContext.request.contextPath}${frontControllerMapping}images/picture.jpg 更好。

我的问题是如何将控制器映射添加到必须由 servlet 处理的每个 url 以及如何正确执行?第二个选项是正确的方法吗?

【问题讨论】:

    标签: java jsp tomcat servlets front-controller


    【解决方案1】:

    您可以使用相对 URL,而不是为每个资源添加完整的 URL。如果这不是一个选项,那么您可以像这样简单地将所有请求映射到您的 servlet:

    @WebServlet("/*")
    

    那么你就不用担心将控制器路径添加到所有 URL 中了。

    【讨论】:

    • 感谢您的回答!但是,你看,每次图像出现在应用程序的任何页面上时,我都想映射一个特定的命令来向客户端发送图像。所以它应该由相同的 url 触发,比如/image/imagename.jpg。但是如果当前 url 像 localhost:8080/rootFolder/controller/page1/page2 那么相对 url 将附加在 page1 之后并且控制器不会触发正确的命令。
    • 好的,排除了相对url,使用/*映射通过控制器映射所有请求怎么样?
    • 我从其他帖子中看到,最好不要将前端控制器映射到 /*,而是提供更具体的 url,例如 /app/*。我尝试使用 /* 但它实际上拦截了所有内容,我不知道如何通过过滤或 web.xml 配置来修复它。
    猜你喜欢
    • 2015-07-28
    • 2014-10-04
    • 2013-08-17
    • 1970-01-01
    • 2015-07-17
    • 2011-11-09
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    相关资源
    最近更新 更多