我对此很陌生,所以请客气。我的数据库中有一个“用户”表,每个用户都是团队的一部分。我试图做的是根据他们的团队名称在所有表中显示所有用户。 这是我的UserService中的代码:
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;
}
这是我的UserController中的代码:
@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>
因此,此代码可以正常工作并满足我的要求。它创建两个选项卡“ First Team”和“ Second Team”,当我单击每个选项卡时,它将显示按团队名称对用户进行排序的表。我的问题是,我想在整个过程中不对团队的名称进行硬编码,而要通过动态生成div来区分,因此,将来有多少团队或他们的名字是无关紧要的。关于如何实现这一目标的任何想法? 预先感谢您的时间和帮助!
答案 0 :(得分:0)
在控制器中创建一个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);