如何使用 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:
- 如何在下拉列表中显示所选电影:
<c:forEach items="${movies}" var="movie">
<option value="${movie}" selected="${movie.getFavoriteMovieName() == student.getFavouriteMovie().getFavouriteMovieName()}">${movie.getFavoriteMovieName()}</option>
</c:forEach>
- 如何更新电影:
@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 你需要添加 selected
到 option
。可以通过几种方式完成,例如
<option value="${movie}" ${movie.getId() == student.getFavoriteMovie().getId() ? "selected" : ""}>${movie.getFavoriteMovieName()}</option>
大家好,我正在通过一个简单的项目学习 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:
- 如何在下拉列表中显示所选电影:
<c:forEach items="${movies}" var="movie">
<option value="${movie}" selected="${movie.getFavoriteMovieName() == student.getFavouriteMovie().getFavouriteMovieName()}">${movie.getFavoriteMovieName()}</option>
</c:forEach>
- 如何更新电影:
@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 你需要添加 selected
到 option
。可以通过几种方式完成,例如
<option value="${movie}" ${movie.getId() == student.getFavoriteMovie().getId() ? "selected" : ""}>${movie.getFavoriteMovieName()}</option>