java—访问thymeleaf模板中的变量,并将它们原封不动地发送回控制器

vshtjzan  于 2021-07-23  发布在  Java
关注(0)|答案(3)|浏览(268)

我有一个springmvcweb应用,在前端使用thymeleaf。我可以将数据从控制器(作为属性添加到模型)发送到thymeleaf并在这里显示它们。现在我想把这些数据保存到数据库里。但我的问题是:如何将同一个对象从thymeleaf发送回控制器?
在这里,我将属性添加到控制器中的模型中:

@GetMapping("/find")
    public String company(@RequestParam("companyId") String companyID, Model model) {

        Company company = dataService.find(companyID);      

        model.addAttribute("company", company);

        return "company-find";
    }

在thymeleaf中,我可以毫无问题地访问公司名称(th:text=“${company.name}”)等公司信息。但我能多容易地把同一家公司交给管制员呢?尝试这个,但不起作用:

<form action="#" th:action="@{/companyadd}"  method="POST" th:object="${company}">
        <button type="submit" class="btn btn-info btn-sm ">Add company to database</button>
    </form>

编辑
在我的控制器中,我有一个来自thymeleaf公司的Map。但在这个方法中,公司是空的:(

@PostMapping("/companyadd")
    public String companyAdd(@ModelAttribute("company") Company company) {

        dataService.add(company);

        return "company-add";
    }

编辑2
我需要用属性填充模型。我可以这样做,但如果属性不是字符串,我就有麻烦了。这个集合的两个属性是list,但我不知道如何将它们插入model:/。下面的代码可以工作(atributes是字符串),但我也需要在那里插入一个集合。

<form action="#" th:action="@{/addcompany}"  method="POST" th:object="${company}">
        <input type="hidden" th:field="*{name}">
        <input type="hidden" th:field="*{address}">
        <input type="hidden" th:field="*{capital}">
        <button type="submit" class="btn btn-info btn-sm ">Add company to database</button>
    </form>
tktrz96b

tktrz96b1#

在表单中,必须添加与目标公司对应的属性。 th:object="${company}" 只声明用于收集表单数据的模型对象。
您可以在这里找到示例:https://spring.io/guides/gs/handling-form-submission/

7hiiyaii

7hiiyaii2#

对于只想复制到新对象的字段,可以使用隐藏字段。例如:

<form action="#" th:action="@{/companyadd}"  method="POST" th:object="${company}">
    <input type="hidden" th:field="*{id}" />
    <button type="submit" class="btn btn-info btn-sm ">Add company to database</button>
</form>

然后“company.id”将从get处理程序中发送的company对象复制到post处理程序中接收的company对象。这些信息应该足够保存更改或查找其余字段。
但要注意:任何用户都可以通过编辑html轻松地更改隐藏字段中的内容。因此,不要仅仅因为信息来自一个隐藏的字段就认为它是正确的或可信的。在本例中,您应该仔细检查以确保用户在保存之前确实可以访问该id。

nnsrf1az

nnsrf1az3#

您可以向控制器添加post端点,如下所示:

@PostMapping("/companyadd")
    public ResponseEntity<?> addCompany(@RequestBody Company company) {
        dataService.save(company);
        return ResponseEntity.ok().build();
    }

相关问题