【问题标题】:How to perform equivalent of JSTL's c:url in JavaScript?如何在 JavaScript 中执行相当于 JSTL 的 c:url?
【发布时间】:2011-12-02 15:08:58
【问题描述】:

我有一些 JavaScript 正在对相对 url 进行 Ajax 调用(使用 jQuery)。

var servletUrl = "someservlet";

$.ajax({
    type: "POST",
    url: servletUrl,
    success: function(response) {
        // ...
    }
});

"someservlet" 在哪里:

@WebServlet("/someservlet")
public class SomeServlet extends HttpServlet

我在多个页面中使用相同的脚本。当从 servlet 上下文根中的页面使用时,相对 url 相对于 servlet 上下文根进行解析,这是正确的。从子文件夹中的页面使用时,URL 相对于子文件夹进行解析,这将返回 404 错误。

我希望能够重用此 JavaScript,而无需根据所使用的页面类型对其进行修改。理想情况下,我需要相当于 JSTL 的 <c:url> 标记。 JavaScript 中有什么东西可以让我创建相对于 servlet 上下文根的 URL?

【问题讨论】:

    标签: javascript jquery jsp servlets


    【解决方案1】:

    几个选项:

    1. 使用该值设置 HTML <base> 元素(注意:有自己的 advantages and disadvantages

      <head>
          <base href="${pageContext.request.contextPath}/" />
          ...
      </head>
      

      然后在 JS 中:

      var contextPath = $("base").attr("href");
      var servletUrl = contextPath + "someservlet";
      // ...
      

    2. 或者在某处设置数据属性

      <html data-contextPath="${pageContext.request.contextPath}/">
          ...
      </html>
      

      然后在 JS 中:

      var contextPath = $("html").data("contextPath");
      var servletUrl = contextPath + "someservlet";
      // ...
      

    3. 或者使用该值设置一个全局 JS 变量(不好的做法):

      <head>
          ...
          <script>var contextPath = "${pageContext.request.contextPath}/";</script>
      </head>
      

      然后在 JS 中:

      var servletUrl = contextPath + "someservlet";
      // ...
      

    【讨论】:

    • 我尝试了您的第二个选项,它确实有效,只是稍作调整。我不得不将第二个子字符串参数从 1 修改为 0,因为它给了我一个在端口号后面带有两个斜杠的 URL。这导致了 404 错误。但是有了这个小修复它就很好用。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2011-09-07
    • 2011-05-14
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多