Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据Javaservlet中的外键在一列中显示多个值?_Java_Html_Mysql_Jsp_Servlets - Fatal编程技术网

如何根据Javaservlet中的外键在一列中显示多个值?

如何根据Javaservlet中的外键在一列中显示多个值?,java,html,mysql,jsp,servlets,Java,Html,Mysql,Jsp,Servlets,嘿,伙计们,我有两个MySQL表: 主表: 和次表: 每个用户可以有多个电话号码-在第二个SQL表中,user_id是指向主表的users id的外键。我试图在JSP表中列出所有用户以及每个用户的电话号码,但我无法做到这一点 以下是我到目前为止的想法: 用户POJO: public class User { private int id; private String username; private String email; private String

嘿,伙计们,我有两个MySQL表:

主表:

和次表:

每个用户可以有多个电话号码-在第二个SQL表中,user_id是指向主表的users id的外键。我试图在JSP表中列出所有用户以及每个用户的电话号码,但我无法做到这一点

以下是我到目前为止的想法:

用户POJO:

public class User {
    private int id;
    private String username;
    private String email;
    private String password;   
    private List<String> userPhoneNumbers = new ArrayList<>();    
    
    public User() { }    
    
    public User(String username, String email, String password, List<String> userPhoneNumbers) {
        this.username = username;
        this.email = email;
        this.password = password;
        this.userPhoneNumbers = userPhoneNumbers;
    }
    
    // Getters and Setters
        
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", email='" + email + '\'' +
                ", password='" + password + '\'' +    
                "} \n";
    }
}
用户道:

public class UserDao {
   
    private static final String FIND_ALL_USERS_QUERY = 
            "SELECT *"
            + " FROM users"
            + " INNER JOIN users_phone_nums"
            + " ON users.id = users_phone_nums.user_id";    
    
    public List<User> findAll() {
        return getUsers(-1, FIND_ALL_USERS_QUERY);
    }  

    private List<User> getUsers(int id, String query) {
        try (Connection conn = DbUtil.getConnection()) {
            List<User> users = new ArrayList<>();
            
            PreparedStatement statement = conn.prepareStatement(query);

            if (id != -1) {
                statement.setInt(1, id);
            }

            try (ResultSet resultSet = statement.executeQuery()) {
                while (resultSet.next()) {
                    User user = new User();
                    user.setId(resultSet.getInt("id"));
                    user.setUsername(resultSet.getString("username"));
                    user.setEmail(resultSet.getString("email"));
                    user.setPassword(resultSet.getString("password"));                   

                    PhoneNumbers phoneNumbers = new PhoneNumbers();
                    phoneNumbers.setPhoneNumber(resultSet.getString("phone_number"));
                    phoneNumbers.setIdUser(resultSet.getInt("user_id"));
                    
                    System.out.println("############ " + phoneNumbers);
                    System.out.println("----->>>>> " + user);
                    
                    
                    users.add(user);
                }
                return users;
            }
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }
}
下面是JSP:

<table id="usersTableId">
    <thead>
        <tr>
            <th>ID</th>
            <th>Username</th>
            <th>Email</th>
            <th>Password</th>           
            <th>user phone</th>
            
        </tr>
    </thead>
    <tbody>
        <c:forEach items="${users}" var="user">
            <tr>
                <td>${user.id}</td>
                <td>${user.username}</td>
                <td>${user.email}</td>                
                <td>${user.password}</td>
                <td>How to list user's phone numbers?</td>
            </tr>
        </c:forEach>
    </tbody>
</table>

身份证件
用户名
电子邮件
密码
用户电话
${user.id}
${user.username}
${user.email}
${user.password}
如何列出用户的电话号码?

有人能向我解释一下如何做到这一点吗?

一种方法是将用户类中的UserPhoneNumber类型从list更改为string;并准备一个逗号分隔的电话号码字符串。 (还建议将
电话号码
pojo重命名为
电话号码

现在在JSP中,您可以打印这个逗号分隔的字符串值


另一种选择是继续将其设置为列表,并让另一个
c:foreach
在JSP中循环浏览它编辑:没有正确阅读问题apols

<td>${custom.userid}</td>
<td>${custom.username}</td>
<td>${custom.email}</td>                
<td>${custom.password}</td>
<td>
    <c:forEach items="${custom.numbers}" var="number">
        <div class="stylethisyo">
            ${number}
        </div>
    </c:forEach>
</td>
${custom.userid}
${custom.username}
${custom.email}
${custom.password}
${number}
这就行了,只需要循环子集,对吗

编辑2:我也可能会把我的模型分开。因此,将为用户和数字创建一个对象。然后在映射它们时,我不会多次使用相同的数据创建一个对象,它只会是一个包含用户详细信息的CustomObjects列表和一个数字列表


您可以通过查找用户,然后在while循环中使用PreparedStatement类查找该用户的数字并将其添加到CustomObject中来实现这一点。

是的,我想用第二种方法实现它,使用c:foreach循环,但当我尝试时,我只得到了一个空数组,第一种方法不起作用,我已经尝试过了,我发现了这一点,但在这种情况下,你可以循环整个子集,我的想法是循环一个用户的电话-例如用户1有3个电话号码-在每个用户的行上只显示他/她的电话,而不是整个子集。是的,Bajal的回答向你展示了一种方法,而我的则展示了另一种方法。您需要更多地考虑如何显示数据,如果您以当前的方式连接两个表,那么每行上的每个数字都会有冗余的用户数据,但是如果拆分查询,您可以轻松地将列表分配给用户对象。
<table id="usersTableId">
    <thead>
        <tr>
            <th>ID</th>
            <th>Username</th>
            <th>Email</th>
            <th>Password</th>           
            <th>user phone</th>
            
        </tr>
    </thead>
    <tbody>
        <c:forEach items="${users}" var="user">
            <tr>
                <td>${user.id}</td>
                <td>${user.username}</td>
                <td>${user.email}</td>                
                <td>${user.password}</td>
                <td>How to list user's phone numbers?</td>
            </tr>
        </c:forEach>
    </tbody>
</table>
StringBuilder phoneNums = new StringBuilder()
PhoneNumbers phoneNumbers = new PhoneNumbers();

for(PhoneNumbers phoneNumber : phoneNumbers) {
   phoneNums.append(resultSet.getString("phone_number")).append(", ");
}
user.setPhoneNumbers(phoneNums.toString());

<td>${custom.userid}</td>
<td>${custom.username}</td>
<td>${custom.email}</td>                
<td>${custom.password}</td>
<td>
    <c:forEach items="${custom.numbers}" var="number">
        <div class="stylethisyo">
            ${number}
        </div>
    </c:forEach>
</td>