如何使用百里香中的嵌套列表进行多重选择

时间:2019-04-03 14:15:12

标签: spring-boot spring-mvc thymeleaf

我正在尝试使用百里香叶形式(使用Spring-Boot)构建html。

以这种形式(在list.html中),用户将有一个“服务器”列表(服务器类),并且每个服务器旁边都有一个复选框。

用户选择了几台服务器并提交了表单后,结果返回到Controller(带有ajax的post方法),然后控制器正在调用Web服务以从其他来源获取“服务”,这意味着“服务”将存储在Java内存中,而不是数据库中。 这部分我做对了,我为Server类创建了一个包装器类,并将其作为ModelAttribute提供,因此在用户选择并提交表单后,Controller会接收带有服务器选择的包装对象,然后生成“服务”对象使用网络服务。 在提交页面并选择服务器之后,将显示一个新页面(status.html,尚未生成),这一次是在其中选择的每个“服务器”的“服务”列表(服务类)前一页。

现在,对于每项服务,我要在每项服务旁边选择一个复选框,然后在提交页面时,所选内容将返回到Controller进行进一步的操作。

由于这些服务没有存储在数据库中,因此它们没有ID,因此我无法包装这些服务以发送回Controller。

现在,在我的数据库中,只有一个“服务器”表,因为我不需要将服务保留在数据库中。

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
    }

}

list.html主要div的代码:

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

我正在寻找使用百里香叶和Spring-Boot(MVC)的解决方案,我试图避免在数据库中为服务创建表并使用一对多关系,因为服务是动态的,可以经常更改。

0 个答案:

没有答案