2012-03-05 15 views
1

所以我第一次使用Spring MVC。 我已经创建了一个使用IntelliJ的应用程序,一切正常,但现在我试图将这个应用程序部署到tomcat。 我有战争文件“myapplication.war”,当我将它部署到tomcat时,我可以成功地浏览到localhost:8080/myapplication。 在这个页面上,我有一个指向我的控制器的链接。当你将一个spring mvc项目部署到tomcat时,有什么方法可以自动重写URL的吗?

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

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

有什么办法自动改写这个URL吗? 我不想更改我的项目中的所有URL,因为这样就无法从IntelliJ运行它。

+1

您使用的是jsp吗?如果是这样,那么使用'' – sourcedelica 2012-03-05 05:32:33

回答

3

我不喜欢<c:url...>,因为它需要两个线JSP的,而其他的模板引擎通常要求只有一个。另一种方法是:

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

这将有效地做同样的事情,<c:url...>

编辑:要改变所有URL在IDE的一个简单的任务:

搜索:href="/ 取代:href="${pageContext.request.contextPath}/

1

如果你在的http://本地主机:8080 /为MyApplication /欢迎和你的链接是HREF = “注册”(没有斜杠),你会被重定向到的http://本地主机:8080/myapplication/register

问题是当你在http:// localhost:8080/myapplication/foo/bar。然后,相同的链接将重定向到http:// localhost:8080/myapplication/foo/register。我所处理的是使用基本标记。如果您将head标签中的< base href =“http:/ localhost:8080/myapplication”/>它将在两种情况下都能正常工作。

1

当您将应用程序战争重命名为ROOT.war(“ROOT”!的大写字母!)时,应用程序将运行时不带任何“前缀”。

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> 
+0

(+1)这是唯一正确的方式,顺便说一句,它也将启用回退到基于会话链接的id,而不是cookie。 – Ralph 2012-03-05 09:01:25

+0

也可以工作 – pap 2012-03-05 10:05:19

0

创建包含基本属性的过滤器,例如对于/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

+0

ServletRequest没有名为getServletContext()的方法(或者我不能看到O_X) – 2016-01-20 06:49:43

+0

https://docs.oracle.com/javaee/5/api/javax/servlet/ServletRequest.html与https:/ /docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html我使用的是EE API v6的Tomcat 8。 – gavenkoa 2016-01-20 10:49:29

+0

啊哈!你是对的。我用你的代码,它为我工作。谢谢。 HttpServletRequest帮助了我。 – 2016-01-20 16:41:31

相关问题