【问题标题】:Deploy web app as ROOT.war app in tomcat from Intellij从 Intellij 在 tomcat 中将 Web 应用程序部署为 ROOT.war 应用程序
【发布时间】:2014-12-15 06:48:41
【问题描述】:

如何将应用程序部署到 Intellij 中的 tomcat 作为 ROOT.war?

我部署的 2 个应用程序都有这样的页面:

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

在上下文路径/ 上部署的应用程序给出以下结果:

/someLink

而在上下文路径/something 上部署的其他应用程序给出以下结果:

http://localhost:8080/something/someLink

我如何确保部署在上下文路径/ 上的应用程序也能做到这一点? 所以最终的结果是这样的

http://localhost:8080/someLink

【问题讨论】:

  • 你的问题不是很清楚。你得到的结果是预期的。对于第一个结果,使用根上下文的“问题”是否是 http://localhost:80890/someLink 而不是 /someLink 的完全限定 URL?
  • 马克,确实,我希望它是 http://localhost:8080/someLink 而不是 /someLink

标签: tomcat web-applications deployment intellij-idea


【解决方案1】:

我不确定为什么在根上下文中得到的结果与在命名上下文中不同。对我来说,JSTL &lt;c:url&gt; 总是给出一个相对路径,不管它是根上下文还是命名上下文。我刚刚在 Tomcat 7 中进行了测试以确定。显然,您正在使用的 JSTL 实现中存在一些不同之处,导致结果不一致。

JSTL 1.2 Specification 对于&lt;c:url&gt; 实现应该做什么是模棱两可的。从第 7.5 节开始:

URL 必须是一个以模式开头的绝对 URL(例如“http:// server/context/page.jsp") 或 JSP 1.2 在 JSP.2.2.1 中定义的相对 URL “相对 URL 规范”

我建议您查看Accessing the full url, including hostname with jstl 的答案,它可以告诉您如何获取完全限定的 URL。您可能需要进行调整(即在为服务器 URL 加上前缀之前查看它是完全限定的)以弥补您的 &lt;c:url&gt; 实现在根上下文中的行为与命名上下文不同的事实。最终,最简单的事情是编写自己的标签来处理所有这些(即包装其他标签)。

【讨论】:

    【解决方案2】:

    我找到了解决这个问题的方法。 问题是 Intellij 在上下文 / 下部署了应用程序。

    当使用&lt;c:url&gt;-tag 时具有以下值&lt;c:url value="/someLink"/&gt; &lt;c:url&gt;-标签将链接更改为//someLink。 当 URL 放在响应中时,它不会在其前面加上主机名。

    我解决的方法是在war的META-INF目录下添加一个context.xml文件,内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <Context path="" />
    

    这会导致 Intellij 在上下文 "" 而不是 "/" 下部署应用程序。 &lt;c:url&gt;tag 将链接转换为 /someLink 并放入包含主机名的响应。

    您还必须确保从 Intellij 部署的战争被命名为 ROOT.war 以使其正常工作。

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 2012-08-12
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      相关资源
      最近更新 更多