如何使用数据库中的数据动态生成表?

时间:2018-11-12 14:46:59

标签: sql-server database jsp spring-boot spring-data

我对此很陌生,所以请客气。我的数据库中有一个“用户”表,每个用户都是团队的一部分。我试图做的是根据他们的团队名称在所有表中显示所有用户。 这是我的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来区分,因此,将来有多少团队或他们的名字是无关紧要的。关于如何实现这一目标的任何想法? 预先感谢您的时间和帮助!

1 个答案:

答案 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);
相关问题