Spring MVCを使用して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の構成を確認する必要がある場合はお知らせください。ビューリゾルバなどで標準のディスパッチャサーブレットを使用しています。
リンクにコンテキストパスを追加する必要があります。
// 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>
c:url
タグは、コンテキストパスをURLに追加します。例えば:
<c:url value="/admin/listPeople"/>
あるいは、Spring MVCアプリでも可能な限り相対URLを使用することを好みます。そのため、ページが/MyApp/index
にある場合、リンク<a href="admin/listPeople">
はlistPeople
ページに移動します。
これは、URL階層がより深い場合にも機能します。 ..
を使用して、レベルをさかのぼることができます。そのため、ページ[/MyApp/admin/people/aPerson
で、<a href="../listPeople">
を使用すると、リストページに戻ります
私はBASEタグを使用することを好みます:
<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/" />
その後、すべてのリンクは次のようになります。
<a href="admin/listPeople">Go to People List</a>
私はちょうどこの質問に対する答えを見つけようとしているので、これは最初のグーグルの結果です。
これは、MvcUriComponentsBuilderを使用して行うことができます
これは、Spring MVCの4.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) { ... }
}
JSPは、次のようにコントローラーメソッドへのURLを準備できます。
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<a href="${s:mvcUrl('PC#getPerson').arg(0,"123").build()}">Get Person</a>
通常、「/」のコンテキストルートを使用するか、ROOT.warとしてwarをデプロイするようにTomcatを構成します。いずれにせよ、戦争名はURLの一部にはなりません。
数年前から、私はこれを探している他の人のためにチップインすると思っていました。注釈を使用しており、たとえば次のようなコントローラーアクションがある場合:
@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}">Nuevo consultor</a>
どこ
value
の値は、コントローラーアクションの@RequestMapping
の引数と一致する必要があり、
var's
valueは、href
に使用する変数の名前です
こんにちは
ServletRelativeActionを使用できます。これがどのバージョンで利用できるかわかりません(現在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.");
}
}
}