【问题标题】:using search functionality in thymeleaf with request parameters在 thymeleaf 中使用带有请求参数的搜索功能
【发布时间】:2023-03-15 19:45:02
【问题描述】:

我有一个页面,可以在其中获取条目列表。现在,我希望能够从这些列表中进行搜索。

我当前用于检索列表的 url 是 /show/products。我想在此页面中添加一个搜索表单,以便我可以使用请求参数进行搜索。 是的,我可以使用 ajax,但我必须使用请求参数。

所以如果我搜索产品名称,那么 - /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>

这就是我在控制器中尝试过的:

@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";
}

我收到此错误:

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)

【问题讨论】:

    标签: java spring spring-mvc thymeleaf


    【解决方案1】:

    您正在尝试使用变量 pName(模型属性)作为表单对象。

    在您看来,您正在将模型属性传递给像 th:object="${pName}" 这样的表单,但您需要传递一个表单对象。

    表单对象不是一个类,而是一个简单的 java 对象 (POJO)。您可以将表单对象视为您的表单,但在服务器端。

    在您可以在视图中使用表单对象之前,您需要创建它并将其添加到模型中。

    你会这样定义它

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

    现在你的控制器方法将变成

    @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";
    }
    

    然后你可以像这样将表单对象传递给你的表单

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

    你需要阅读文档,所有这些都有详细的解释。

    【讨论】:

    • 那我不需要在请求参数中传递name?
    • @nirvair 浏览器会为您添加它,因为它是一种 GET 方法,但也适用于 POST 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多