jsp - 如何在不包含上下文根名称的情况下使用相对路径?

标签 jsp servlets resources relative-path contextpath

要使用我的静态文件(CSS、JS),我必须编写绝对路径,如 /AppName/templates/style/main.css。是否有任何解决方案,我可以编写像 style/main.css 这样的相对路径?

最佳答案

如果您真正关注的是 webapp 上下文的动态性(“AppName”部分),那么只需通过 HttpServletRequest#getContextPath() 动态检索它即可.

<head>
    <link rel="stylesheet" href="${pageContext.request.contextPath}/templates/style/main.css" />
    <script src="${pageContext.request.contextPath}/templates/js/main.js"></script>
    <script>var base = "${pageContext.request.contextPath}";</script>
</head>
<body>
    <a href="${pageContext.request.contextPath}/pages/foo.jsp">link</a>
</body>

如果你想为所有相关链接设置一个基本路径,这样你就不需要重复${pageContext.request.contextPath}每个 相关链接中,使用<base>标签。这是在 JSTL functions 帮助下的示例.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<head>
    <c:set var="url">${pageContext.request.requestURL}</c:set>
    <base href="${fn:substring(url, 0, fn:length(url) - fn:length(pageContext.request.requestURI))}${pageContext.request.contextPath}/" />
    <link rel="stylesheet" href="templates/style/main.css" />
    <script src="templates/js/main.js"></script>
    <script>var base = document.getElementsByTagName("base")[0].href;</script>
</head>
<body>
    <a href="pages/foo.jsp">link</a>
</body>

这样每个相对链接(即不是/ 或方案开头)都将成为相对于<base> 的链接.

顺便说一句,这与 Tomcat 没有任何关系。它只与 HTTP/HTML 基础知识有关。您在所有其他网络服务器中都会遇到同样的问题。

另见:

关于jsp - 如何在不包含上下文根名称的情况下使用相对路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38070367/

相关文章:

jsp - 按名称动态调用 JSP 标签

java - 是否可以使用 Java 类将字符串从 Java 传递到 JSP?

php - PHP 在不相关的代码上浪费了多少资源(如果有的话)?

java - 如何使用spring访问外部jar文件中的资源?

javascript - 为动态创建的标签添加 id 属性

java - 无法初始化类 com.sun.jna.Native

java - 访问 servlet 上下文中的对象时是否需要同步块(synchronized block)?

scala - 从 sbt 中的依赖项获取资源文件

java - JSP:如何检查用户是否登录?

java - 我们必须将 .class 文件放在 Tomcat 目录中的位置