所以我第一次使用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中运行它。
答案 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><a href="<c:url value='/my/path/${id}.html'/>">Title</a></pre>
* allow to use:
* <pre><a href="${ctx}/my/path/${id}.html">Title</a></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容器文档)。