2012-03-05 14 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

相關問題