我正在尝试使用百里香叶形式(使用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)的解决方案,我试图避免在数据库中为服务创建表并使用一对多关系,因为服务是动态的,可以经常更改。