是否可以使用 th-field 来检索 Thymeleaf 中列表的值?

Is it possible to use th-field to retrieve the value of a list in Thymeleaf?

我在 thymeleaf 中创建一个页面,我从我的控制器中检索一个列表以挂载一个 table,在这个 table 中有一个选择字段,我在其中检索一个值列表但是我无法显示已经从数据库中检索到的值可以帮助我吗?请!

我已经尝试使用以下命令但无法恢复值:

th:field="*{valoresAtributo[__${stat.index}__].valorUsuario}"

我收到以下错误:BindingResult 和 bean 名称的普通目标对象都不能用作请求属性。

<table class="table table-sm table-striped table-bordered"  id="dataTable">
    <thead>             
        <tr><th colspan="4">Valores dos Atributos</th></tr>             
    </thead>
    <tbody> 
        <tr class="text-black">
            <td rowspan="2"> Atributo</td>
            <td rowspan="2"> Local</td>
            <td>Aplicação</td>              
            <td>Usuário</td>
        </tr>
        <tr>
            <td id="vlAppl"></td>               
            <td id="vlUser"></td>
        </tr>
        <tr th:each="valorAtributo, stat : ${valoresAtributo}">
            <td th:text="${valoresAtributo[__${stat.index}__].nomeAtributo}"></td>
            <td th:text="${valoresAtributo[__${stat.index}__].valorLocal}"></td>
            <td th:text="${valoresAtributo[__${stat.index}__].valorAplicaco}"></td>
            <td>
             <select class="form-control col-md-10" th:field="*{valoresAtributo[__${stat.index}__].valorUsuario}">
                    <option th:each="option : ${T(com.jequiti.JequitiIntegrador.controller.AtributoController).test(valorAtributo.sqlValidacao)}"
                                                th:value="${{option.valorAtributo}}"
                                                th:text="${option.significadoAtributo}">
                                        </option>
                </select>
             </td>
            </tr>
        </tbody>
    </table>
@RequestMapping(value="/seguranca/atributo/valores", params = {"atributo","siteOpt","applOpt","userOpt","aplicacao","usuario"}, method = RequestMethod.GET)
    public String initAttributeValuesFormFilter(@RequestParam("atributo") Long idAtributo, @RequestParam("siteOpt") Integer idNivel1, @RequestParam("applOpt") Integer idNivel2, @RequestParam("userOpt") Integer idNivel3, @RequestParam("aplicacao") String aplicacao, @RequestParam("usuario") String usuario, Model model)
    {
        Integer userId = 0;

        if(!Strings.isNullOrEmpty(usuario))
            userId = userServiceImpl.findIdUsuarioByFantasia(usuario).intValue();

        List<ValoresAtributoView> valoresAtributo = buscaValoresAtributos(idAtributo, idNivel1, idNivel2, idNivel3, 0, userId);

        model.addAttribute("opUsuarios", userServiceImpl.findAllActiveUsers());
        model.addAttribute("opAtributos", atributoService.findAll());
        model.addAttribute("valoresAtributo",valoresAtributo);

        return "/valoresAtributo";
    }

我希望该字段显示当前在数据库中的值和值列表中的选项。

谢谢大家!

我使用 thymeleaf 检索列表的方法:

例如 users 列表 User 实体列表进入 html 页面:

@GetMapping("/parsing/explorer")
public ModelAndView parsing(){
    ModelAndView modelAndView = new ModelAndView("show");
    modelAndView.addObject("users", generateUsersList());
    return modelAndView;
}

show.html 示例:

<table class="w3-table-all w3-card-4">
        <tr>
            <th>Id</th>
            <th>Name</th>
            <th>Last name</th>
        </tr>
        <tr th:each="user : ${users}"> 
            <td th:text="${user.getId()}"></td>
            <td th:text="${user.getName()}"></td>
            <td th:text="${user.getLastName()}"></td>
        </tr>
    </table>

因此 User (users) 的列表被分配给字符串 <tr th: every = "user: $ {users}">

中的变量 user

在下一个代码块中,我们还可以使用 getter 以与 java 相同的方式调用 "User" 字段,但 Thymeleaf 还允许您引用字段:user.id/ user.name..


确定select块中的变量:

    <select name="userFromHtml" id=userId required>
        <option th:each="user: ${users}">
            <title th:text="${user.getLastName()} + ' ' + ${user.getName()} + ' ' + ${user.getIdIO}" th:value="${user.getId()}"/>
        </option>
    </select>

在这种情况下,有必要在 title 块中确定 th:valueth:value="${user.getId()}"。因此,在控制器中传递变量 userFromHtml,所选用户的值为 id

PS 虽然 Thymeleaf 允许你直接定义变量,但我更喜欢使用 getters 来获取数据。

如果您在父 <form /> 标签中使用 th:object,则只能使用 th:field。 (从您发布的 HTML 中不清楚——但您可能不清楚,因为您将 valoresAtributo 直接添加为模型属性。)

如果您希望显示预选的 <option> 但不使用 th:objectth:field,您应该使用 th:selected 属性,该属性的计算结果应为 truefalse 取决于是否应选择该选项。它应该看起来像这样:

<select class="form-control col-md-10">
    <option
        th:each="option : ${T(com.jequiti.JequitiIntegrador.controller.AtributoController).test(valorAtributo.sqlValidacao)}"
        th:value="${{option.valorAtributo}}"
        th:text="${option.significadoAtributo}"
        th:selected="${valorAtributo.valorUsuario == option.valorAtributo}" />
</select>