2017-12-06 2 views
0

Ich habe eine Seite, wo ich eine Liste von Einträgen bekomme. Jetzt möchte ich in der Lage sein, von dieser Liste zu suchen.Verwenden Suchfunktion in Thymoleaf mit Anfrage Parameter

Meine aktuelle URL zum Abrufen der Liste ist dies/show/products. Ich möchte auf dieser Seite ein Suchformular hinzufügen, damit ich mit dem Anfrageparameter suchen kann. Ja, ich kann Ajax verwenden, aber ich muss es mit Anforderungsparametern tun. ?

so, wenn ich für einen Produktnamen zu suchen, dann -/show/products name = somename

<form ui-jp="parsley" th:action="@{/show/products(name=${pName})}" th:object="${pName}" method="get"> 
           <div class="row m-b"> 
            <div class="col-sm-6"> 
             Search by Name: <input id="filter" type="text" th:field="*{pName}" class="form-control input-sm w-auto inline m-r"/> 
             <button class="md-btn md-fab m-b-sm indigo"><i class="material-icons md-24">&#xe8b6;</i></button> 
            </div> 
           </div> 
          </form> 

Und das ist, was ich in der Steuerung versucht:

@GetMapping("/show/products") 
    public String getProduct(Model model, 
           @RequestParam(required = false) String name, 
           @ModelAttribute String pName) { 
     List<Product> products = this.productService.getAllProducts(name) 
     model.addAttribute("products", products); 
     return "show_product"; 
    } 

Ich erhalte diese Fehler:

Neither BindingResult nor plain target object for bean name 'pName' available as request attribute 
    at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:153) 
    at org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:897) 

Antwort

1

Sie versuchen, Variable PName (Model-Attribut) als ein Formularobjekt zu verwenden.

In Ihrer Ansicht übergeben Sie ein Modellattribut, um dieses Formular th:object="${pName}" zu bilden, aber stattdessen müssen Sie ein Formularobjekt übergeben.

Ein Formularobjekt ist keine Klasse, sondern ein einfaches Java-Objekt (POJO). Sie können sich das Formularobjekt als Formular vorstellen, aber auf der Serverseite.

Bevor Sie das Formularobjekt in Ihrer Ansicht verwenden können, müssen Sie es erstellen und zum Modell hinzufügen.

werden Sie es wie definieren dieses

public class MyFormObject{ 
    private String pName; 
    public String getPName(){ 
     return pName; 
    } 
    public void setPName(String pName){ 
     this.pName = pName; 
    } 
} 

jetzt Ihre Controller-Methode

@GetMapping("/show/products") 
public String getProduct(Model model, 
    @ModelAttribute("myFormObject") MyFormObject myFormObject, 
    BindingResult result) { 
    List<Product> products = this.productService.getAllProducts(myFormObject.getPName()); 
    model.addAttribute("products", products); 
    return "show_product"; 
} 

geworden Dann können Sie das Formular-Objekt in das Formular übergeben, wie dieser

     <form ui-jp="parsley" th:action="@{/show/products}" th:object="${myFormObject}" method="get"> 
          <div class="row m-b"> 
           <div class="col-sm-6"> 
            Search by Name: <input id="filter" type="text" th:field="*{pName}" class="form-control input-sm w-auto inline m-r"/> 
            <button class="md-btn md-fab m-b-sm indigo"><i class="material-icons md-24">&#xe8b6;</i></button> 
           </div> 
          </div> 
         </form> 

Sie müssen die Dokumentation lesen, all diese werden dort im Detail erklärt.

+0

Dann muss ich 'name' nicht in Anforderungsparametern übergeben? – nirvair

+0

@nirvair Browser wird es für Sie hinzufügen, da es eine GET-Methode ist, aber auch mit der POST-Methode arbeiten wird. – Zeronex