2016-07-23 16 views
2

Ich habe eine Thymelef-Vorlage in einem einfachen Spring-Boot-Anwendung. Die Vorlage enthält eine Liste in einer Tabelle wie folgt:Kann ich HTTP-POST-Anfrage von Thymeleaf Tabelle in Spring Boot-Anwendung

<p>There are <span th:text="${#lists.size(persons)}"></span> people:</p> 
    <table th:if="${not #lists.isEmpty(persons)}" border="1"> 
     <tr>     
      <th>ID</th> 
      <th>Name</th>   
      <th>Address</th> 
      <th>Telephone</th> 
      <th>Email</th>  
      <th>Actions</th> 
     </tr> 
     <tr th:each="person : ${persons}">     
      <td th:text="${person.personId}"></td> 
      <td th:text="${person.name}"></td> 
      <td th:text="${person.address}"></td> 
      <td th:text="${person.telephone}"></td> 
      <td th:text="${person.email}"></td> 
      <td><a href="#" data-th-href="@{/edit(personId=${person.personId})}">Edit</a> | 
       <a href="#" data-th-href="@{/delete(personId=${person.personId})}">Delete</a></td> 
     </tr> 
    </table>  

ich bearbeiten aktivieren möchten, und löschen Funktionalität gemäß der letzten Zelle in der Tabelle. Aber im Moment sind beide Anfragen für HTTP GET. Dies ist für die Bearbeitung geeignet, bei der die Details einer Person vom Server zur Bearbeitung abgerufen werden. Aufgrund der Datenänderungen auf dem Server sollte jedoch eine POST-Anforderung ausgelöst werden.

Weiß jemand, ob Thymeleaf eine POST-Anfrage pro Zeile einer Tabelle zulässt? Oder muss ich ein einfaches HTML-Formular pro Zeile schreiben?

Die GET Form ist zur Zeit:

<td><a href="#" data-th-href="@{/edit(personId=${person.personId})}">Edit</a> 
        <!--a href="#" data-th-href="@{/delete(personId=${person.personId})}">Delete</a></td--> 

        <form method="get" th:action="@{/edit(personId=${person.personId})}">       
         <button type="submit" name="submit" value="value">Edit</button> 
        </form> 
       </td> 

Wo ich einen Link und ein Formular zum Testen haben.

Die Controller-Methode aufgerufen werden soll:

// Gets a Person. 
    @RequestMapping(value="/edit", method=RequestMethod.GET) 
    public String getEditPerson(@RequestParam("personId") String personId, 
           Model model) {  
     logger.info(PersonController.class.getName() + ".getEditPerson() method called."); 

     Person person = personDAO.get(Integer.parseInt(personId)); 
     model.addAttribute("person", person); 

     // Set view.  
     return "/edit"; 

    }  

Der Fehler, wenn die Schaltfläche Version von GET genannt wird, ist:

Whitelabel Error Page 

This application has no explicit mapping for /error, so you are seeing this as a fallback. 

Sun Jul 24 00:26:16 BST 2016 
There was an unexpected error (type=Bad Request, status=400). 
Required String parameter 'personId' is not present` 

I GET bin mit der Bearbeitung auslösen, da keine Daten gesendet zum Server hier außer der personId. Es wird keine Datenbankaktion ausgeführt, daher sollte es ein GET sein.

Antwort

3

Sie verwenden Links und ich glaube nicht, dass das möglich ist, Sie müssten ein Formular verwenden, wo Sie die Methode POST angeben können, die verwendet werden soll.

Im Beispiel unten im einen <button> anstelle eines <a> Element verwendet wird, aber es wird funktionieren, das einzige, was Sie tun müssen, um Ihre Schaltfläche mit CSS stylen wie Sie Ihre Links

<form method="POST" th:action="@{/edit(personId=${person.personId})}"> 
     <button type="submit" name="submit" value="value" class="link-button">This is a link that sends a POST request</button> 
    </form> 

jetzt aussehen in Ihrem Code sollte

<tr th:each="person : ${persons}">     
      <td th:text="${person.personId}"></td> 
      <td th:text="${person.name}"></td> 
      <td th:text="${person.address}"></td> 
      <td th:text="${person.telephone}"></td> 
      <td th:text="${person.email}"></td> 
      <td> <form method="POST" th:action="@{/edit(personId=${person.personId})}"> 
     <button type="submit" name="submit" value="value" class="link-button">EDIT</button></form> | 
        <form method="POST" th:action="@{/delete(personId=${person.personId})}"> 
     <button type="submit" name="submit" value="value" class="link-button">DELETE</button></form> </td> 
     </tr> 

EDIT

wie diese aussehen, wie Sie Sie nur Java-Code gemeinsam genutzt, in der Steuerung Sie ar e erwartet die personId nicht als PathVariable, aber als RequestParam, in diesem Fall sollte Ihr Formular diesen Wert haben ...

Bearbeiten Sie Ihr Formular und fügen Sie die Personen-ID wie folgt hinzu.

<form method="POST" th:action="@{/edit}"> 
      <input type="hidden" name="personid" id="personId" th:value="${person.personId}" /> 
      <button type="submit" name="submit" value="value" class="link-button">This is a link that sends a POST request</button> 
     </form> 

Beachten Sie auch, änderte ich die Wirkung der Form gerade bearbeiten/sein, als sein, was Ihr Controller sieht aus wie

+0

Es ist merkwürdig, dass die POST für Delete Werke bilden aber die GET eine für Bearbeiten nicht . –

+0

können Sie bitte den Fehler teilen, den Sie bekommen? –

+0

auch, warum Sie nicht POST auf der Bearbeitung auch verwenden? –