如何在JavaScript中执行相当于JSTL的c:url?

问题描述 投票:6回答:1

我有一些JavaScript,使用jQuery对一个相对url进行Ajax调用。

var servletUrl = "someservlet";

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

其中 "someservlet" 是。

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

我在多个页面中使用同一个脚本 当从一个处于servlet上下文根目录的页面中使用时,则相对url解析为相对于servlet上下文根目录,这是对的,但当从一个处于子文件夹的页面中使用时,url解析为相对于子文件夹,这将返回404错误。当从子文件夹中的页面使用时,URL相对于子文件夹解析,这将返回404错误。

我希望能够重用这个JavaScript,而不需要根据使用它的页面类型来修改它。理想情况下,我需要相当于JSTL的 <c:url> 标签。在JavaScript中有没有什么东西可以让我创建相对于servlet上下文根的URL?

javascript jquery jsp servlets
1个回答
11
投票

几个选项。

  1. 设置一个HTML <base> 的元素(注:有自己的 利弊)

    <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";
    // ...
    
© www.soinside.com 2019 - 2024. All rights reserved.