22

SpringMVCを使用してWebアプリケーションを作成しています。私はコントローラーなどに注釈を使用しています。アプリケーション内の実際のリンク(フォームアクション、<a>タグなど)を除いて、すべてが正常に機能しています。現在、私はこれを持っています(明らかに省略されています):

//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の構成を確認する必要がある場合はお知らせください。ビューリゾルバーなどで標準のディスパッチャーサーブレットを使用しています。

4

7 に答える 7

50

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

// 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>
于 2011-08-07T01:28:58.613 に答える
14

タグは、c:urlURLにコンテキストパスを追加します。例えば:

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

または、SpringMVCアプリでも可能な限り相対URLを使用することを好みます。したがって、ページがにある場合/MyApp/index、リンク<a href="admin/listPeople">をクリックするとそのlistPeopleページに移動します。

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

于 2011-08-14T05:17:24.920 に答える
6

私はBASEタグを使用することを好みます:

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

次に、すべてのリンクは次のようになります。

<a href="admin/listPeople">Go to People List</a>
于 2011-08-08T11:39:39.290 に答える
4

私はちょうどこの質問への答えを見つけようとしていて、これは最初のグーグルの結果です。

これは、MvcUriComponentsBuilderを使用して実行できるようになりました

これはSpringMVCの4.0バージョンの一部です

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

必要なメソッドはfromMappingNameです

ドキュメントから:

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

これは主に、ビューレンダリングテクノロジとEL式での使用を目的としています。Spring URLタグライブラリは、このメソッドを「mvcUrl」と呼ばれる関数として登録します。

たとえば、このコントローラーが与えられた場合:

@RequestMapping("/people")
 class PersonController {

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

 }

JSPは、次のようにコントローラーメソッドへのURLを準備できます。

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

 <a href="${s:mvcUrl('PC#getPerson').arg(0,"123").build()}">Get Person</a>
于 2016-07-19T15:28:10.807 に答える
0

私は通常、「/」のコンテキストルートを使用するようにtomcatを構成するか、またはROOT.warとしてwarをデプロイします。いずれにせよ、戦争名はURLの一部にはなりません。

于 2011-08-07T01:30:36.863 に答える
0

あなたはservletRelativeActionを使うことができます。これがどのバージョンで利用できるかはわかりません(現在4.0.xを使用しています)。これに関するドキュメントはあまり見ていませんが、Springフォームの裏にあるコードを見るとおそらく推測できます。渡すパスが「/」で始まることを確認してください。

例:

<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.");
        }
    }
}
于 2014-02-01T02:02:05.717 に答える
-1

数年経ちましたので、これを探している他の人のためにチップを入れたいと思いました。アノテーションを使用していて、たとえば次のようなコントローラーアクションがある場合:

@RequestMapping("/new")   //<--- relative url
public ModelAndView newConsultant() {
    ModelAndView mv = new ModelAndView("new_consultant");
    try {
        List<Consultant> list = ConsultantDAO.getConsultants();
        mv.addObject("consultants", list);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return mv;
}

.jsp(ビュー)にこのディレクティブを追加します

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

単に使用する

<spring:url value="/new" var="url" htmlEscape="true"/>
<a href="${url}">New consultant</a>

どこ

value@RequestMappingの値は、コントローラーアクションのの引数と 一致する必要があります。

var'svalueは、使用する変数の名前です。href

こんにちは

于 2018-09-24T05:38:47.987 に答える