将spring mvc项目部署到tomcat时,有没有办法自动重写URL?

时间:2012-03-05 00:13:58

标签: spring url tomcat deployment spring-mvc

所以我第一次使用Spring MVC。 我使用IntelliJ创建了一个应用程序,一切正常,但现在我正在尝试将此应用程序部署到tomcat。 我有战争文件“myapplication.war”,当我将它部署到tomcat时,我可以成功浏览localhost:8080 / myapplication。 在这个页面上,我有一个链接到我的一个控制器。

<a href="/register">Register</a>

将我重定向到localhost:8080 / register而不是localhost:8080 / myapplication / register。 如果我自己更改URL,它可以正常工作。

有没有办法自动重写此网址? 我不想更改项目中的所有URL,因为这样就无法从IntelliJ中运行它。

5 个答案:

答案 0 :(得分:5)

使用

中的<c:url>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

例如:

<c:url var="registerVar" value="/register" />
...
<a href="${registerVar}">Registration</a>

答案 1 :(得分:3)

我不喜欢<c:url...>,因为它需要两行JSP,而其他模板引擎通常只需要一行。另一种选择是:

<a href="${pageContext.request.contextPath}/register">Register</a>

这将有效地与<c:url...>

做同样的事情

编辑:应该是更改IDE中所有URL的简单任务:

搜索:href="/ 替换:href="${pageContext.request.contextPath}/

答案 2 :(得分:1)

如果你在 http:// localhost:8080 / myapplication / welcome 并且您的链接是 href =“register”(没有斜线),您将被重定向到 http:// localhost:8080 / myapplication / register

问题出在您 http:// localhost:8080 / myapplication / foo / bar 时。然后,相同的链接会将您重定向到 http:// localhost:8080 / myapplication / foo / register 。我用来处理这个问题的方法是使用基本标记。如果你在头标记中加上&lt; base href =“http:/ localhost:8080 / myapplication”/&gt; ,它将适用于这两种情况。

答案 3 :(得分:1)

当您将应用程序war重命名为ROOT.war(大写字母为“ROOT”!)时,应用程序将在没有任何“前缀”的情况下运行。

答案 4 :(得分:0)

创建包含base as属性的过滤器,例如/src/java/company/project/web/filter/BaseFilter.java

import java.io.IOException;
import javax.servlet.*;

/**
 * Make sane JSP, instead of:
 *   <pre>&lt;a href="&lt;c:url value='/my/path/${id}.html'/&gt;"&gt;Title&lt;/a&gt;</pre>
 * allow to use:
 *   <pre>&lt;a href="${ctx}/my/path/${id}.html"&gt;Title&lt;/a&gt;</pre>
 */
public class BaseFilter implements Filter {
    private String min;

    @Override
    public void init(FilterConfig fc) {
        min = fc.getServletContext().getInitParameter("min");
        if (min == null)
            min = fc.getInitParameter("min");
        if (min == null)
            min = "min";
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setAttribute("base", request.getServletContext().getContextPath());
    request.setAttribute("min", min);
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() { }
}

并在web.xml注册该过滤器:

<filter>
    <filter-name>BaseFilter</filter-name>
    <filter-class>company.project.web.filter.BaseFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>BaseFilter</filter-name>
    <url-pattern>*.htm</url-pattern>
    <url-pattern>*.json</url-pattern>
</filter-mapping>

并使用干净的语法:

<script src="${base}/js/jquery.${min}.js"></script>
<link href="${base}/css/bootstrap.${min}.css" rel="stylesheet" type="text/css">
<a href="${base}/index.html">Home</a>

注意我在该过滤器中设置了其他属性,例如在CSS / JS的开发和缩小版本之间切换我使用min属性,该属性可以在上下文中设置为WAR文件外部部署描述符(请参阅Java EE容器文档)。

另见我的回答:https://stackoverflow.com/a/13993570/173149