Как работать с вложенными списками в тимиле для множественного выбора - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь создать HTML с формой с помощью тимиана (используя Spring-Boot).

В этой форме (в list.html) у пользователя будет список «серверов» (класс Server), а рядом с каждым сервером будет установлен флажок.

После того, как пользователь выбрал несколько серверов и отправил форму, результаты возвращаются в Контроллер (метод post с ajax), а затем контроллер вызывает веб-сервис для получения «сервисов» из другого источника, это означает, что « услуги "будут храниться в памяти Java, а не в базе данных. В этой части я понял все правильно, я создал класс-оболочку для класса Server и предоставил его в качестве ModelAttribute, поэтому после выбора пользователя и публикации формы контроллер получает упакованный объект с выбором серверов, а затем генерирует объекты «service» используя веб-сервис. После отправки страницы и выбора серверов будет отображаться новая страница (status.html, еще не сгенерированная), на этот раз со списком «услуг» (класс обслуживания) для каждого «сервера», который был выбран в предыдущая страница.

Теперь для каждой службы я хочу установить флажок рядом с каждой службой, а затем, когда страница будет отправлена, выбор вернется к контроллеру для дальнейших действий.

Поскольку сервисы не хранятся в базе данных, следовательно, у них нет идентификатора, я не могу обернуть сервисы для отправки обратно в контроллер.

Прямо сейчас в моей БД есть только таблица «серверов», поскольку мне не нужно хранить сервисы в базе данных.

Код для Server.java:

public class Server {

    private int id;
    private String name;
    private String domain;


    private List<Service> services;

    public Server(String name, String domain, List<Service> services) {
        this.name = name;
        this.domain = domain;
        this.services = services;
    }
}

Код для Service.java:

public class Service {

    private String name;
    private String status;
    private String startup;

    public Service(String name, String status, String startup) {
        this.name = name;
        this.status = status;
        this.startup = startup;
    }
}

Код для ClientSelection.java (оболочка для Сервера):

public class ClientSelection {

    private int id;
    private List<Server> servers;

public void generateServices(){
     // some code to generate services for each server selected
    }
}

Код для ServerController.java:

public class ServerController {

    // == fields ==
private ServerService service;

    // == constructors ==
    @Autowired
    public ServerController(ServerService service) {
        this.service = service;
    }

    @PostMapping("servers")
    @ResponseBody
    public ModelAndView processMessage(@ModelAttribute("clientSelection") ClientSelection clientSelection) throws Exception {

        cs = clientSelection;
        cs.generateServices(); // Assign Services to each Server

        String redirect = "redirect:/" + "status";
        return new ModelAndView(redirect,"clientSelection",cs);
    }

    @GetMapping("listServers")
    public String listServers(Model model){

        ClientSelection clientSelection = new ClientSelection();

        List<Server> servers = service.getAllServers();

        model.addAttribute("clientSelection", clientSelection);
        model.addAttribute("listServers", servers);

        return "list";
    }

    @GetMapping("status")
    public String statusServers(Model model){

    // Totally clueless on what to pass to this view in order to achieve my goals
    }

    @PostMapping("services")
    @ResponseBody
    public ModelAndView processServices() 

    // Totally clueless on what to do in order to get a list of selected services
    }

}

Код для основного div файла list.html:

<div class="container">
    <div align="center">
        <form id="main-form" th:action="@{/servers}" method="post" th:object="${clientSelection}">
            <table class="table table-hover">
                <tr>
                    <th>Server Name</th>
                    <th>Domain</th>

                </tr>
                <th:block th:each="server : ${listServers}">
                    <tr>
                        <td th:text="${server.name}">...</td>
                        <td th:text="${server.domain}">...</td>
                        <td><input type="checkbox" th:field="*{servers}" th:value="${server.id}"/></td>
                    </tr>
                </th:block>
            </table>
            <button id="submit-form" class="ui button" type="button">Submit</button>

    </div>

<script>
    $(function() {
    $('#submit-form').click(saveForm);
});


function saveForm(){
    $.ajax({
        method: "POST",
        url: "servers",
        data: $('#main-form').serialize(),
        success: function(status){
                $('#please').html(status)
        }
    });
}

</script>

Я ищу решение с помощью thymeleaf и Spring-Boot (MVC), я стараюсь избегать создания таблицы в базе данных для сервисов и использовать отношение один ко многим, потому что сервисы динамические и может меняться часто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...