【问题标题】:Servlet path is not included in <c:url><c:url> 中不包含 Servlet 路径
【发布时间】:2015-08-29 06:35:18
【问题描述】:

我有一个简单的 Java Webapp(例如test),其中包含两个不同的 SpringMVC 应用程序。

我的 web.xml 将它们映射为:

    <servlet-mapping>
        <servlet-name>web</servlet-name>
        <url-pattern>/web/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>restful</servlet-name>
        <url-pattern>/restful/*</url-pattern>
    </servlet-mapping>

web 部分中,我使用的是“经典”库,例如 JSTL 核心。

我不明白如何避免 JSTL c:url 标记忽略 URL 模式。

如果我写

<c:url value="/browse/"/>

链接呈现为/test/browse 而不是/test/web/browse

我错过了什么?

谢谢

【问题讨论】:

  • 它按照您指定的方式呈现。您在 web.xml 中所说的除了添加内容名称外,不会导致任何 URL 重写。

标签: jsp url servlets jstl


【解决方案1】:

&lt;c:url&gt; 确实没有考虑 servlet 路径。那是你自己的责任。 &lt;c:url&gt; 仅考虑 HttpServletRequest#getContextPath()

自己硬编码:

<c:url value="/web/browse" />

或者HttpServletRequest#getServletPath()的内联结果:

<c:url value="${pageContext.request.servletPath}/browse" />

或者如果你正在转发,内联结果RequestDispatcher#FORWARD_SERVLET_PATH

<c:url value="${requestScope['javax.servlet.forward.servlet_path']}/browse" />

如有必要,在自定义标记中包装以保存样板。

【讨论】:

  • 是的,我已经在使用 ,但是如果明天我需要通过 web.xml 修改映射,这可能是一个真正的问题。 .. 第二个选项似乎更好,因为它独立于配置。
  • 很抱歉,第二个选项不起作用...我正在使用瓷砖...所以如果我写了您的建议,链接将变为localhost:8080/test/WEB-INF/jsp/template/master.jsp/browse ...
  • 是的,你的答案工作正常......顺便说一句,我认为自定义标签在“编程舒适性”和代码的可重用性方面是最好的主意......我写了这个问题因为,在我看来,标准 taglib 中没有这个选项很奇怪......所以我认为我错过了一些东西...... :)
  • JSTL 不是 MVC 感知标签库。然而,Java EE 的 MVC 框架 JSF 有一堆您正在寻找的标签。例如。 &lt;h:link&gt; 生成一个带有正确 URL 的 HTML &lt;a&gt; 元素,并在仅指定视图文件的服务器端路径时完成上下文路径和 servlet 映射。
  • 我的问题不依赖于 MVC:它只是相对于 servlet 映射。所以说“JSTL in not a servlet-mapping-aware lib”是正确的... :D 是的,我知道 JSF 非常丰富,但是(在我看来)我认为如果你不使用它是非常不方便的有使用组件的经验(例如 .net,仅提供一个示例)。
猜你喜欢
  • 2011-04-10
  • 1970-01-01
  • 2021-02-06
  • 2015-05-14
  • 2017-12-04
  • 1970-01-01
  • 2020-02-05
  • 2021-12-27
  • 2011-04-03
相关资源
最近更新 更多