sql-server - 如何使用数据库中的数据动态生成表?
问题描述
我对此很陌生,所以请善待。我的数据库中有一个“用户”表,每个用户都是团队的一部分。我试图做的是根据他们的团队名称在不同的表格中显示所有用户。这是我的用户服务中的代码:
public List<User> getUsersFromFirstTeam() {
List<User> usersFromFirstTeam = userRepository.findByTeam(FIRST_TEAM);
return usersFromFirstTeam;
}
public List<User> getUsersFromSecondTeam() {
List<User> usersFromSecondTeam = userRepository.findByTeam(SECOND_TEAM);
return usersFromSecondTeam;
}
这是我的用户控制器中的代码:
@Autowired
private UserService userService;
@GetMapping(value = "/admin/usermanagement")
public ModelAndView userManagement(Model firstTeamModel, Model secondTeamModel) {
ModelAndView modelAndView = new ModelAndView();
firstTeamModel.addAttribute("firstTeamUsers", userService.getUsersFromFirstTeam());
secondTeamModel.addAttribute("secondTeamUsers", userService.getUsersFromSecondTeam());
modelAndView.setViewName("userManagement");
return modelAndView;
}
最后这是我显示的 .jsp 页面:
<body>
<div class = "tab" style="width: 250px">
<button class ="tablinks" onclick = "openTable(event, 'FirstTeam')">First
Team</button>
<button class ="tablinks" onclick = "openTable(event, 'SecondTeam')">Second
Team</button>
</div>
<div id="FirstTeam" class="tabcontent">
<h3>First team members</h3>
<table class="table">
<thead>
<tr>
<th>Username</th>
<th>Firstname</th>
<th>Lastname</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<c:forEach items="${firstTeamUsers}" var ="user">
<tr>
<td>${user.username}</td>
<td>${user.firstName}</td>
<td>${user.lastName}</td>
<td>${user.email}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
<div id="SecondTeam" class="tabcontent">
<h3>Secondteam members</h3>
<table class="table">
<thead>
<tr>
<th>Username</th>
<th>Firstname</th>
<th>Lastname</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<c:forEach items="${secondTeamUsers}" var ="user">
<tr>
<td>${user.username}</td>
<td>${user.firstName}</td>
<td>${user.lastName}</td>
<td>${user.email}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</body>
所以,这段代码可以正常工作,并且完全符合我的要求。它创建两个选项卡“第一队”和“第二队”,当我单击每个选项卡时,它会显示按团队名称排序的用户表。我的问题是,我想在不硬编码团队名称的情况下完成整个事情,并且动态地生成 div,这样将来会有多少团队或他们的名字是什么都无关紧要。关于如何实现这一目标的任何想法?提前感谢您的时间和帮助!
解决方案
在您的控制器中创建一个 Map 并将其添加到模型中:
@GetMapping(value = "/admin/usermanagement")
public ModelAndView userManagement() {
ModelAndView modelAndView = new ModelAndView();
Map<String, List<User>> usersMap = new LinkedHashMap<>();
usersMap.put("First Team", userService.getUsersForTeam(FIRST_TEAM));
usersMap.put("Second Team", userService.getUsersForTeam(SECOND_TEAM));
modelAndView.add("usersMap", usersMap)
modelAndView.setViewName("userManagement");
return modelAndView;
}
在 JSP 中,您可以迭代 Map 条目,例如:
<c:forEach items="${usersMap}" var="entry">
<div id="${entry.key}" class="tabcontent">
<h3>${entry.key} Members</h3>
<table class="table">
<thead>
<tr>
<th>Username</th>
<th>Firstname</th>
<th>Lastname</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<c:forEach items="${entry.value}" var ="user">
<tr>
<td>${user.username}</td>
<td>${user.firstName}</td>
<td>${user.lastName}</td>
<td>${user.email}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</c:forEach>
您仍然需要更改每种新类型的控制器代码,以便您可以通过动态获取团队列表来清理它,使其看起来如下所示。然后,数据库中的任何新团队都应自动反映在视图中,无需进一步更改代码。
ModelAndView modelAndView = new ModelAndView();
Map<String, List<User>> usersMap = new LinkedHashMap<>();
List<String> teamNames = //db lookup on distinct team names
for(String name : teamNames){
usersMap.put(name, userService.getUsersForTeam(name));
}
modelAndView.add("usersMap", usersMap);
推荐阅读
- bash - 从字符串变量中使用时包含空格的参数未正确解析
- node.js - 后端和前端在不同的端口上运行,CORS 错误
- c# - 我的查找控件在 gridview 项目模板中找不到标签,有什么想法可以解决这个问题吗?
- c# - DataSource 为空,但之前已填充
- python - 获取所有分类列并排除一个特定列
- python - Python 在列表理解中引发错误(或更好的选择)
- c# - Activator.CreateInstance 在运行时强制转换为类型
- c# - 控制器方法不会从重定向中捕获对象路由
- angular - 其他使用服务的方式
- python - 如何取小写字母和大写字母值的总和,并且只用大写字母或小写字母输入一个