Можно ли использовать th-поле для получения значения списка в Thymeleaf? - PullRequest
0 голосов
/ 29 апреля 2019

Я создаю страницу в тимелисте, где я получаю список из моего контроллера для монтирования таблицы, в этой таблице есть поле выбора, где я получаю список значений, но я не могу отобразить значение, котороеуже извлекается из базы данных может мне помочь?Пожалуйста!

Я уже пытался использовать следующие команды, но не смог восстановить значение:

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

Я получаю следующую ошибку: Ни BindingResult, ни простой целевой объект для имени бина не доступны в качестве запросаатрибут.

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

Я ожидал, что в поле отобразится значение, которое в данный момент находится в базе данных, и параметры в списке значений.

Спасибо всем!

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Вы можете использовать th:field, только если вы используете th:object в родительском теге <form />.(Это не ясно из HTML-кода, который вы разместили, но, вероятно, нет, поскольку вы добавляете valoresAtributo непосредственно в качестве атрибута модели.)

Если вы хотите показать предварительно выбранный <option>, но безиспользуя th:object и th:field, вы должны вместо этого использовать атрибут th:selected, который должен оцениваться до true или false в зависимости от того, должна ли быть выбрана эта опция.Это должно выглядеть примерно так:

<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>
0 голосов
/ 29 апреля 2019

Мой способ получения списка с использованием тимилиста:

Например, список 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) назначен переменной user в строке <tr th: every = "user: $ {users}">

В следующем блоке кода мы также можем вызватьПоля «Пользователь» аналогичны java с использованием геттеров, но 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>

в этом случае необходимо определить th:value в title блок: th:value="${user.getId()}".Итак, в контроллер передается переменная userFromHtml со значением id выбранного пользователя.

PS Хотя Thymeleaf позволяет вам определять переменную напрямую, я предпочитаю использовать геттеры для получения данных.

...