如何使用 Hibernate 和 JPA 处理填充下拉列表?

How to handle populating dropdown with Hibernate and JPA?

大家好,我正在通过一个简单的项目学习 Hibernate 和 JPA,该项目允许用户从 MySQL 数据库中编辑 学生信息字段。有两个 table - 一个给 学生 ,一个给 his/hers 最喜欢的电影学生只能从下拉列表中选择一部电影,但是我想不出如何用数据填充下拉列表(电影名称) 来自最喜欢的电影 table

Student.java

@Entity
@Table(name = "student")
@NamedQueries({
    @NamedQuery(name = "Student.findAll", query = "SELECT s FROM Student s")})
public class Student implements Serializable {    
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_student")
    private Integer idStudent;

    @Column(name = "name")
    private String name;
    
    @JoinColumn(name = "id_movie", referencedColumnName = "id_movie")
    @ManyToOne(cascade = CascadeType.ALL)
    private FavoriteMovie favoriteMovie;
    
    /* Getters/Setters */
    
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idStudent != null ? idStudent.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Student)) {
            return false;
        }
        Student other = (Student) object;
        if ((this.idStudent == null && other.idStudent != null) || (this.idStudent != null && !this.idStudent.equals(other.idStudent))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Student{" + "idStudent=" + idStudent + 
                ", name=" + name + 
                ", favoriteMovie=" + favoriteMovie + '}';
    }
}   

FavoriteMovie.java

@Entity
@Table(name = "favorite_movie")
@NamedQueries({
    @NamedQuery(name = "FavoriteMovie.findAll", query = "SELECT m FROM FavoriteMovie m")})
public class FavoriteMovie implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_movie")
    private Integer idFavoriteMovie;

    @Column(name = "movie_name")
    private String favoriteMovieName;

    @Column(name = "movie_year")
    private int favoriteMovieYear;

    @OneToMany(mappedBy = "favoriteMovie")
    private List<Student> studentList;
    
    public FavoriteMovie() {
    }    
    
    public FavoriteMovie(Integer idFavoriteMovie) {
        this.idFavoriteMovie = idFavoriteMovie;
    }

    public FavoriteMovie(Integer idFavoriteMovie, String favoriteMovieName) {
        this.idFavoriteMovie = idFavoriteMovie;
        this.favoriteMovieName = favoriteMovieName;
    }   
    /* Getters/Setters */
}

EditServlet.java

@WebServlet("/EditServlet")
public class EditServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {

        String idStudent = request.getParameter("idStudent");

        StudentService studentService = new StudentService();

        Student student = studentService.findStudent(Integer.parseInt(idStudent));
        
        HttpSession session = request.getSession();
        session.setAttribute("student", student);
        
        request.getRequestDispatcher("/WEB-INF/editStudent.jsp").forward(request, response);
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

        
        String action = request.getParameter("modify");
        if ("modify".equals(action)) {
        
            String name = request.getParameter("name");
            
            HttpSession session = request.getSession();
            Student student = (Student) session.getAttribute("student");            
            
            student.setName(name);
            
            String favoriteMovieName = request.getParameter("favoriteMovieName");

            student.getFavoriteMovie().setFavoriteMovieName(favoriteMovieName);     
            
            
            StudentService studentService = new StudentService();
            studentService.saveStudent(student);
            
            session.removeAttribute("student");

        }
        request.getRequestDispatcher("/index.jsp").forward(request, response);
    }
}

editStudent.jsp

<body>
        Modify Student
        <br/>
        <form name ="form1" action="${pageContext.request.contextPath}/EditServlet" method="post">
            Id Student: <input type="text" name="idStudent" value="${student.idStudent}" readonly="readonly"><br/>
            Name: <input type="text" name="name" value="${student.name}"><br/>

            Favorite Movie: <select name="selectedFavoriteMovie" id="selectedFavoriteMovie"> 
                <c:forEach var="favoriteMovie" items="" >
                    <option value="">
                        
                    </option>
                </c:forEach>
            </select><br/><br/>
            
            <input type="submit" name="edit" value="edit">
            
        </form>
    </body>

必须使用 FavoriteMovies table.

中的所有 电影名称 填充下拉列表

我认为它可以非常适合您当前的解决方案而无需进行太多修改:) 我想 - 因为你有一个 StudentService - 你也有一个 FavoriteMovieService 可以做:

List<FavoriteMovie> movies = new FavoriteMovieService().getAll();

如果是这样 - 您可以在 GET 请求上为 servlet 添加一个附加属性,如下所示:

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {

    String idStudent = request.getParameter("idStudent");

    StudentService studentService = new StudentService();

    Student student = studentService.findStudent(Integer.parseInt(idStudent));

    List<FavoriteMovie> movies = new FavoriteMovieService().getAll();
    
    HttpSession session = request.getSession();
    session.setAttribute("student", student);
    session.setAttribute("movies", movies);
    
    request.getRequestDispatcher("/WEB-INF/editStudent.jsp").forward(request, response);
}

之后,您将能够在 JSP:

中遍历该列表
<c:forEach items="${movies}" var="movie">
  <option value="${movie.getFavoriteMovieName()}">${movie.getFavoriteMovieName()}</option>
</c:forEach>

这应该适合你:)

UPD:

  1. 如何在下拉列表中显示所选电影:
    <c:forEach items="${movies}" var="movie">
      <option value="${movie}" selected="${movie.getFavoriteMovieName() == student.getFavouriteMovie().getFavouriteMovieName()}">${movie.getFavoriteMovieName()}</option>
    </c:forEach>
  1. 如何更新电影:
 @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

        
        String action = request.getParameter("modify");
        if ("modify".equals(action)) {
        
            String name = request.getParameter("name");
            
            HttpSession session = request.getSession();
            Student student = (Student) session.getAttribute("student");            
            
            student.setName(name);
            
            FavoriteMovie favoriteMovie = request.getParameter("favoriteMovieName");

            student.setFavoriteMovie(favoriteMovie);     
            
            StudentService studentService = new StudentService();
            studentService.saveStudent(student);
            
            session.removeAttribute("student");

        }
        request.getRequestDispatcher("/index.jsp").forward(request, response);
    }

你有

<select name="selectedFavoriteMovie" id="selectedFavoriteMovie">

所以你也应该可以做到:

request.getParameter("selectedFavoriteMovie");

也代替了

<option value="${movie.getFavoriteMovieName()}">${movie.getFavoriteMovieName()}</option>

你可以这样做:

<option value="${movie}">${movie.getFavoriteMovieName()}</option>

在这种情况下,变量 selectedFavoriteMovie 的类型将是 FavoriteMovie 而不是 String,您将能够执行 student.setFavoriteMovie(selectedFavoriteMovie);

到 select 实际 selectedFavoriteMovie 你需要添加 selectedoption 。可以通过几种方式完成,例如

<option value="${movie}" ${movie.getId() == student.getFavoriteMovie().getId() ? "selected" : ""}>${movie.getFavoriteMovieName()}</option>