私のコントローラーで変数を設定する次のコードがあります:
model.set("type", type);
Thymeleafビューで、アクションurlを使用してフォームを作成します。
/mycontroller/{type}
これを達成する方法はありますか?幸運にもthymeleafのドキュメントを読みました。
ser482745がコメントで示唆している (現在削除済み)として、以前に提案した文字列連結
<form th:action="@{/mycontroller/} + ${type}">
一部のWebコンテキストでは失敗します。
Thymeleafは、@{..}
式を解決する LinkExpression
を使用します。内部的には、これは HttpServletResponse#encodeURL(String)
を使用します。そのjavadocの状態
堅牢なセッショントラッキングを行うには、サーブレットが発行するすべてのURLをこのメソッドで実行する必要があります。それ以外の場合、CookieをサポートしないブラウザーではURL書き換えを使用できません。
セッショントラッキングがURLを介して行われるWebアプリケーションでは、@{..}
が追加される前に、その部分が${..}
に対して発行された文字列に追加されます。これは必要ありません。
代わりに、 documentation で提案されているパス変数を使用してください
通常のパラメーターと同様にパス変数の形式でパラメーターを含めることもできますが、URLのパス内にプレースホルダーを指定します。
<a th:href="@{/order/{id}/details(id=3,action='show_all')}">
あなたの例は次のようになります
<form th:action="@{/mycontroller/{path}(path=${type})}"> //adding ending curly brace
文字列の連結を使用したくない場合( Sotiriosによって提案 )、 式前処理 in RLリンク を使用できます。
<form th:action="@{/mycontroller/__${type}__}">
@ {}内で文字列を連結する必要があります。
<form th:action="@{'/mycontroller/' + ${type}}">
@ {}はURLの書き換えに使用されます。 URL書き換えの一部は、セッションの追跡です。ユーザーが最初にURLをリクエストすると、アプリサーバーはurlに追加します;jsessionid=somehexvalue
そしてjsessionidでcookieを生成します。次のリクエスト中にクライアントがクッキーを送信すると、サーバーはクライアントがクッキーをサポートしていることを認識します。サーバーがクライアントがcookieをサポートしていることを知っている場合、サーバーはaddind jsessionidをURLに保持しません。
私の好ましい方法は、パイプライン構文(|)によるリテラル置換です。
<form th:action="@{|/mycontroller/${type}|}">
Thymeleafパス変数の構文は
<form th:action="@{/mycontroller/{pathParam}(pathParam=${type}}">
参照: Thymeleaf標準URL構文
必要なのは:
_<a th:href="@{/mycontroller/{type}(type=${type})}">
_
ドキュメント:
素晴らしいヘルプがここにあります: http://www.thymeleaf.org/doc/articles/standardurlsyntax.html 。そこから私が使用したのは:
通常のパラメーターと同様にパス変数の形式でパラメーターを含めることもできますが、URLのパス内にプレースホルダーを指定します。
<a th:href="@{/order/{id}/details(id=3,action='show_all')}">
...さらに、次のようなURL表現
<a th:href="@{/order/details(id=${order.id})}">
Exception evaluating SpringEL expression: "businessId" (login:50)
私は同じ問題を抱えており、以下のような文字列連結を介して解決します。
LoginController.Java
@RequestMapping(value = "/login/{businessId}", method = RequestMethod.GET)
public ModelAndView get(HttpServletRequest request, @PathVariable String businessId) {
ModelAndView modelAndView = new ModelAndView("login");
modelAndView.addObject("businessId", businessId);
return modelAndView;
}
login.html
<form role="form" th:action="@{/login} + '/'+ ${businessId}" th:method="post">
<fieldset>
<div class="form-group">
<input class="form-control" placeholder="E-mail" name="userName"
type="email"></input>
</div>
<div class="form-group">
<input class="form-control" placeholder="Password"
name="password" type="password" value=""></input>
</div>
<div class="checkbox">
<label> <input name="remember" type="checkbox"
value="Remember Me"></input>Remember Me
</label>
</div>
<!-- Change this to a button or input when using this as a form -->
<button id="login" class="btn btn-lg btn-success btn-block" type="submit">Login</button>
</fieldset>
</form>