4

我有一个 Web 应用程序,它是在根上下文(“/”)下设计并始终工作的。所以所有css,js和链接都以/(例如/css/style.css)开头。现在我需要将此 Web 应用程序移动到一些不同的上下文中(比方说/app1)。使用item可以很容易地更改server.xml配置文件并在新的上下文中启动 Web 应用程序。但是网页已损坏,因为所有链接现在都不正确。它们指向旧的根上下文而不是新的app1[Context path=""]/css/style.cssapp1语境。有没有什么神奇的方法可以解决这个问题,而无需通过前缀一些“上下文”变量来修复每个链接?使用的服务器 - Tomcat 5。应用程序是用 Java 编写的,并使用 JSP、Struts2、Spring 和 UrlRewrite 过滤器。更有趣的是听到与理论辩论的此类问题作斗争的真实经验。谢谢你。

PS 我看不到 UrlRewrite 过滤器如何帮助我,因为它只能在app1上下文中工作。所以对链接的请求/css/style.css不会被传递给它。

4

2 回答 2

3

如果您使用 URL 重写将 ROOT 重定向到您的应用程序,那不会消除在 ROOT 中拥有应用程序的能力吗?如果是这样,通过切换上下文可以获得什么?

我认为链接资源的一般方法是附加一个“上下文”变量并使链接成为绝对:${pagecontext.request.contextpath}/css/style.css或者只是使链接相对:css/style.css

除非您有无法修改代码的特定原因,否则我会在链接上进行搜索/替换并完成它。您应该找到不超过三个或四个表达式,/css、/images、/javascript 等。

于 2010-01-14T16:59:47.140 回答
2

您应该始终通过 url 重写来创建 url,不仅可以在需要时将会话信息添加到 url,还可以添加上下文路径。您应该将所有 url 创建为从应用程序顶部开始的绝对路径,然后让 url-rewriting 处理将上下文路径添加到前面,视情况而定。

<c:url value="/css/site.css"/>

如果他们没有启用 cookie,这将呈现/&lt;context-path&gt;/css/site.css或呈现到一个 jsp 文件中。/&lt;context-path&gt;/css/site.css;jsessionid=134345434543您还可以使用 c:url 标记将 url 呈现为变量,然后在整个文档中多次使用该变量。只需var="x"向标签添加一个属性,然后${x}将 url 呈现到您的文档中。如果您不使用 jsp 来呈现您的输出,则需要为您的视图层找到合适的机制,但它们都会有一个。如果您在 java 代码中呈现 url,只需查看 c:url 标签的源代码,您就会看到它是如何完成的。

一个尴尬是 CSS 文件(和 js 文件)没有被处理,所以 css 和 js 文件中的 url 需要是相对路径,否则当你更改上下文路径时它们会中断。大多数 js 已经使用相对路径,因为库维护者不知道您要将其库安装到哪个路径。另一方面,CSS 背景图像通常被指定为绝对 url,因为相同的 CSS 文件可能包含在文件层次结构的不同级别的 html 文件中。除了创建适当的符号链接以使相对 url 始终有效或通过 JSP 提供问题 CSS 文件以便可以根据需要重写 url 之外,我知道没有简单的解决方法。我确定您可能可以运行过滤器或 apache 模块来替换 url,但是您'

于 2010-07-27T19:16:40.073 回答