2011-08-07 38 views
20

Spring MVCを使用してWebアプリケーションを作成しています。私は(明らかに省略)私はこれを持って、現在、それはアプリケーション(などフォームアクション、<a>タグ、)での実際のリンクに来るときを除いて、すべてが正常に動作しているなど、コントローラの注釈を使用しています:Spring MVC JSPでのリクエストURL

//In the controller 
@RequestMapping(value="/admin/listPeople", method=RequestMethod.GET) 

//In the JSP 
<a href="/admin/listPeople">Go to People List</a> 

"http:// localhost:8080/MyApp/admin/listPeople"のようなURLを直接入力すると、ページが正しく読み込まれます。ただし、上記のリンクは機能しません。アプリケーション名 "MyApp"が失われます。

誰かがそこにアプリケーション名をスローするようにSpringを設定する方法があるかどうか知っていますか?

Springの設定を確認する必要がある場合はお知らせください。私はビューリゾルバなどで標準のディスパッチャサーブレットを使用しています。

+1

これが有するばね3.0で可能です'">People' –

答えて

43

リンクにコンテキストパスを追加する必要があります。

// somewhere on the top of your JSP 
<c:set var="contextPath" value="${pageContext.request.contextPath}"/> 

... 
<a href="${contextPath}/admin/listPeople">Go to People List</a> 
+0

+1ありがとう、私はこれを考えましたが、私はむしろ何らかの形で春とそれをやりたいと思います。 –

+2

これを行うには "春"の方法はありません:) $ {contextPath}をリンク先に置かないようにするオプションだけは、コンテキストパスが "/"になるようにアプリケーションをルートとしてデプロイすることです);アプリケーションの展開に依存するようになるため、このアプローチはお勧めしません。 – craftsman

+0

正しくリコールすれば、server.xmlとのやり取りもあります。 – Kevin

0

通常、コンテキストルートを「/」に設定するか、warをROOT.warとして展開するようにtomcatを設定します。いずれにしても、戦争名はURLの一部にならない。私はBASEタグを使用することを好む

6

c:urlタグはあなたのURLにコンテキストパスを追加します

<a href="admin/listPeople">Go to People List</a> 
+0

ベースタグを使用する前にこれをお読みください:http://stackoverflow.com/questions/1889076/is-it-recommended-to-use-the-base-html-tag –

13

:次に

<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/" /> 

を、すべてのリンクは次のようにすることができます。例:

<c:url value="/admin/listPeople"/> 

代わりに、Spring MVCアプリケーションでもできるだけ相対URLを使用することをお勧めします。ページが/MyApp/indexの場合、<a href="admin/listPeople">というリンクはlistPeopleページに移動します。

これは、URL階層が深い場合にも機能します。 ..を使用してレベルをトラバースすることができます。したがって、/MyApp/admin/people/aPersonのページで<a href="../listPeople">を使用すると、リストページに戻ります

0

サーブレットのリレーションアクションを使用できます。私は現在どのバージョンが利用可能か(私は現在4.0.xを使用しています)、これに関する多くのドキュメントは見ていませんが、スプリングフォームを裏付けるコードを見れば、おそらく推測できます。渡すパスが "/"で始まることを確認してください。

例:

<form:form class="form-horizontal" name="form" servletRelativeAction="/j_spring_security_check" method="POST"> 

参照org.springframework.web.servlet.tags.form.FormTag:

protected String resolveAction() throws JspException { 
    String action = getAction(); 
    String servletRelativeAction = getServletRelativeAction(); 
    if (StringUtils.hasText(action)) { 
     action = getDisplayString(evaluate(ACTION_ATTRIBUTE, action)); 
     return processAction(action); 
    } 
    else if (StringUtils.hasText(servletRelativeAction)) { 
     String pathToServlet = getRequestContext().getPathToServlet(); 
     if (servletRelativeAction.startsWith("/") && !servletRelativeAction.startsWith(getRequestContext().getContextPath())) { 
      servletRelativeAction = pathToServlet + servletRelativeAction; 
     } 
     servletRelativeAction = getDisplayString(evaluate(ACTION_ATTRIBUTE, servletRelativeAction)); 
     return processAction(servletRelativeAction); 
    } 
    else { 
     String requestUri = getRequestContext().getRequestUri(); 
     ServletResponse response = this.pageContext.getResponse(); 
     if (response instanceof HttpServletResponse) { 
      requestUri = ((HttpServletResponse) response).encodeURL(requestUri); 
      String queryString = getRequestContext().getQueryString(); 
      if (StringUtils.hasText(queryString)) { 
       requestUri += "?" + HtmlUtils.htmlEscape(queryString); 
      } 
     } 
     if (StringUtils.hasText(requestUri)) { 
      return processAction(requestUri); 
     } 
     else { 
      throw new IllegalArgumentException("Attribute 'action' is required. " + 
        "Attempted to resolve against current request URI but request URI was null."); 
     } 
    } 
} 
4

私はちょうどこの質問への答えを見つけようとしてきたとおり、これ最初のGoogleの結果です。

これはこれが4の一部であるMvcUriComponentsBuilder

を用いて今行うことができます。ドキュメントから、Spring MVCの

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.html

の0バージョンに必要な方法はfromMappingName

です:

は、Spring MVCのコントローラメソッドの要求マッピングの名前からURLを作成します。 構成されたHandlerMethodMappingNamingStrategyは、起動時にコントローラメソッド要求マッピングの名前を決定します。デフォルトでは、すべてのマッピングには、クラス名の大文字に基づいて名前が割り当てられ、その後に区切り文字として「#」が付けられ、次にメソッド名が割り当てられます。たとえば、getPersonメソッドを持つPersonControllerという名前のクラスの「PC#getPerson」。命名規則が一意的な結果をもたらさない場合、@RequestMapping注釈のname属性を通じて明示的な名前を割り当てることができる。

これは、主にビューレンダリング技術とEL式での使用を目的としています。 Spring URLタグライブラリは、このメソッドを "mvcUrl"という関数として登録します。例えば

、このコントローラを与え次のよう

@RequestMapping("/people") 
class PersonController { 

    @RequestMapping("/{id}") 
    public HttpEntity getPerson(@PathVariable String id) { ... } 

} 

A JSPは、コントローラメソッドへのURLを作成することができる:

<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %> 

<a href="${s:mvcUrl('PC#getPerson').arg(0,"123").build()}">Get Person</a> 
関連する問題