2013-02-18 7 views
35

Ich habe den folgenden Code eine Variable in meiner Reglereinstellung:Thymeleaf konstruiert URL mit variablen

model.set("type", type); 

In der thymeleaf Ansicht, die ich ein Formular mit Action-URL konstruieren will:

/mycontroller/{type} 

Irgendwelche Ideen Wie erreiche ich das? Ich habe thymeleaf Dokumentation ohne Glück gelesen.

Antwort

64

Als user482745 suggests in the comments (jetzt gelöscht), die String-Verkettung ich zuvor vorgeschlagen,

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

wird in einigen Web-Kontexten scheitern.

Thymeleaf verwendet LinkExpression, die den Ausdruck @{..} löst. Intern verwendet dies HttpServletResponse#encodeURL(String). Seine javadoc-Zustände

Für robustes Sitzungs-Tracking sollten alle URLs, die von einem Servlet ausgegeben werden, über diese Methode ausgeführt werden. Andernfalls kann das URL-Rewriting nicht mit Browsern verwendet werden, die keine Cookies unterstützen.

In Web-Anwendungen, bei denen das Session-Tracking über die URL getan wird, wird dieser Teil auf die für @{..} vor den ${..} emittierten Zeichenkette angehängt werden wird angefügt. Du willst das nicht.

Stattdessen Variablen Verwendung Pfad wie in den

documentation vorgeschlagen

können Sie auch Parameter in Form von Pfadvariablen ähnlich zu normalen Parametern, sondern einen Platzhalter innerhalb Ihres URL Pfad angeben:

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

So würde Ihr Beispiel wie

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

Dies funktioniert nicht für mich. Für das obige Beispiel würde '{user}' wordentlich in die URL übernommen. Zum Beispiel, 'First' gibt mir einen Link von 'http: // host/users/{user.first}' mit dem Text 'Rick'. – Rick

+0

@rick Innerhalb des '@ {...}' haben Sie den Wert des Platzhalters '{user.first}' nicht angegeben. Wenn mein Thymoleaf noch korrekt ist, benötigen Sie '@ {/ users/{path} (Pfad = $ {user.first})}'. –

+0

Danke, Sotirios, das scheint es zu sein. Ich wünschte mir, ich könnte einfach '$ {user.first}' (oder was auch immer) in den Pfad schreiben, ohne den ganzen Text. Ich verstehe wirklich nicht, warum es solche offensichtliche Verwendung nicht unterstützt. – Rick

25

Wenn Sie nicht wollen, String-Verkettung (proposed by Sotirios) verwenden, Sie können expression preprocessing in URL link verwenden:

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

Ich denke auch, dass dies eine bessere Lösung als die von Sotirios vorgeschlagene Lösung ist. Ich habe Links wie 'th: action =" @ {/ Angebote/__ $ {offer.id} __/changeStatus} "'. – sebast26

11

Sie benötigen concatenate Zeichenfolge innerhalb @ {}.

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

@ {} wird zum Umschreiben von URLs verwendet. Ein Teil des URL-Neuschreibens verfolgt die Sitzung. Benutzeranfragen-URL zum ersten Mal, App-Server fügt URL ;jsessionid=somehexvalue hinzu und generiert Cookie mit jsessionid. Wenn der Client einen Cookie während der nächsten Anfrage sendet, weiß der Server, dass der Client Cookies unterstützt. Wenn der Server die Cookies für die Clientunterstützung kennt, behält der Server die URL addind jsessionid nicht bei.

Meine bevorzugte Art ist literale Substitution mit der Pipeline-Syntax (|).

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

Thymeleaf Pfadvariablen Syntax ist

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

Referenz: Thymeleaf Standard URL Syntax

+1

Ich bevorzuge auch die wörtliche Ersetzung, da es klarer und einfacher zu pflegen ist. Die Thymelfleck-Syntax ist zu komplex für einfache Aufgaben. –

+0

Doing String Verkettung funktioniert für mich, aber das ist sehr hässlich. Warum funktioniert es nicht einfach, um 'th: href =" @ {/ foo/bar/{obj.property}} "' zu schreiben? Das funktioniert nicht für mich. – Rick

0
Exception evaluating SpringEL expression: "businessId" (login:50) 

ich das gleiche Problem haben und wie unten über Zeichenfolge Verketten zu lösen.

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

Was Sie brauchen, ist:

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

Dokumentation:

Große Hilfe ist hier: http://www.thymeleaf.org/doc/articles/standardurlsyntax.html. Was habe ich von dort war:

Sie auch Parameter in Form von Pfadvariablen enthalten können ähnlich den normalen Parameter, sondern einen Platzhalter innerhalb Ihre URL Pfad angeben:

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

. .. Was ist mehr: ein URL Ausdruck wie:

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

+0

Eine Sache zu erwähnen ist, dass die Parameter alle am Ende des Verknüpfungsausdrucks sein müssen. Dies ist eine falsche Syntax: '@ {/ order/{id} (id = $ {anIdExpression})/detail/{Detail} (Detail = $ {aDetailExpression)}' Aber das ist richtig: '@ {/ order/{id}/detail/{detail} (id = $ {anIdExpression}, detail = $ {aDetailExpression)}' Die Dokumente sind in diesem Punkt nicht sehr klar, also dachte ich, ich würde rette anderen die Zeit, die ich mit Versuch und Irrtum verbracht habe. – rdguam