web-dev-qa-db-de.com

Thymeleaf-Konstrukt-URL mit Variable

Ich habe den folgenden Code, um eine Variable in meinem Controller einzustellen:

model.set("type", type);

In der Thymeleaf-Ansicht möchte ich ein Formular mit Aktions-URL erstellen:

/mycontroller/{type}

Irgendwelche Ideen, wie man das erreichen kann? Ich habe thymeleafische Dokumentation ohne Glück gelesen.

47
Chris

Wie user482745 in den Kommentaren vorschlägt (jetzt gelöscht), habe ich die String-Verkettung vorgeschlagen, die ich zuvor vorgeschlagen habe

<form th:action="@{/mycontroller/} + ${type}">

wird in einigen Webkontexten fehlschlagen.

Thymeleaf verwendet LinkExpression , das den @{..}-Ausdruck auflöst. Intern verwendet dies HttpServletResponse#encodeURL(String) . Seine Javadoc-Staaten

Für eine robuste Sitzungsüberwachung sollten alle von einem Servlet ausgegebenen URLs .__ sein. Durchlaufen Sie diese Methode. Andernfalls kann die URL-Umschreibung nicht mit .__ verwendet werden. Browser, die keine Cookies unterstützen.

In Webanwendungen, bei denen die Sitzungsverfolgung über die URL erfolgt, wird dieser Teil an die Zeichenfolge angehängt, die für @{..} ausgegeben wird, bevor der ${..} angehängt wird. Du willst das nicht.

Verwenden Sie stattdessen Pfadvariablen wie in der Dokumentation vorgeschlagen.

Sie können auch Parameter in Form von Pfadvariablen einschließen Ähnlich wie bei normalen Parametern, jedoch mit Angabe eines Platzhalters in der URL Ihrer URL:

<a th:href="@{/order/{id}/details(id=3,action='show_all')}">

So würde dein Beispiel aussehen

<form th:action="@{/mycontroller/{path}(path=${type})}"> //adding ending curly brace
85

Wenn Sie keine String-Verkettung verwenden möchten ( vorgeschlagen von Sotirios ), können Sie Ausdrucksvorverarbeitung in URL-Link verwenden :

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

Sie benötigen eine verkettete Zeichenfolge in @ {}.

<form th:action="@{'/mycontroller/' + ${type}}">

@ {} wird zum Umschreiben von URLs verwendet. Ein Teil des URL-Umschreibens besteht darin, die Sitzung zu verfolgen. Die URL der ersten Benutzeranforderung fügt der App-Server der URL ;jsessionid=somehexvalue hinzu und generiert ein Cookie mit jsessionid. Wenn der Client bei der nächsten Anforderung ein Cookie sendet, weiß der Server, dass er Cookies unterstützt. Wenn der Server weiß, dass die Clients Cookies unterstützen, behält der Server die URL addind jsessionid nicht bei.

Mein bevorzugter Weg ist die wörtliche Ersetzung mit der Pipeline-Syntax (|).

<form th:action="@{|/mycontroller/${type}|}">

Die Thymeleaf-Pfadvariablensyntax lautet 

<form th:action="@{/mycontroller/{pathParam}(pathParam=${type}}">

Referenz: Thymeleaf-Standard-URL-Syntax

13
user482745

Was Sie brauchen, ist:

<a th:href="@{/mycontroller/{type}(type=${type})}">

Dokumentation:

Eine große Hilfe ist hier: http://www.thymeleaf.org/doc/articles/standardurlsyntax.html . Was ich von dort verwendete, war:

Sie können auch Parameter in Form von Pfadvariablen einschließen, die den normalen Parametern ähneln, jedoch einen Platzhalter im Pfad Ihrer URL angeben:

<a th:href="@{/order/{id}/details(id=3,action='show_all')}">

... Mehr noch: Ein URL-Ausdruck wie:

<a th:href="@{/order/details(id=${order.id})}">

2
Witold Kaczurba
Exception evaluating SpringEL expression: "businessId" (login:50)

Ich habe das gleiche Problem und löse es mit der String-Concatination wie folgt.

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