web-dev-qa-db-ja.com

Thymeleafは変数を含むURLを構築します

私のコントローラーで変数を設定する次のコードがあります:

model.set("type", type);

Thymeleafビューで、アクションurlを使用してフォームを作成します。

/mycontroller/{type}

これを達成する方法はありますか?幸運にもthymeleafのドキュメントを読みました。

51
Chris

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
92

文字列の連結を使用したくない場合( Sotiriosによって提案 )、 式前処理 in RLリンク を使用できます。

<form th:action="@{/mycontroller/__${type}__}">
33
lu_ko

@ {}内で文字列を連結する必要があります。

<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構文

13
user482745

必要なのは:

_<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})}">

2
Witold Kaczurba
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>
0
erhun