0
我不得不類:學生和地址,具有一對多的關係,使每個學生都可以有一個或多個地址,JPA:如何在JSP頁面中顯示OneToMany數據?
現在我嘗試顯示在JSP特定學生的詳細信息(其學生+的詳細地址)頁面,但只顯示學生信息,而不顯示其地址。
這裏是sevlet頁:
@WebServlet(name = "TestServlet", urlPatterns = {"/TestServlet"})
public class TestServlet extends HttpServlet {
@EJB
private StudentDaoLocal studentDao;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String studentIdStr = request.getParameter("studentId");
if (studentIdStr != null && !studentIdStr.equals("")) {
int studentId = Integer.parseInt(studentIdStr);
Student student = studentActions(studentId);
request.setAttribute("student", student);
request.getRequestDispatcher("info.jsp").forward(request, response);
}
}
private Student studentActions(int studentId)
throws ServletException, IOException {
Student student;
student = studentDao.getStudent(studentId);
return student;
}
JSP頁面:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1> Student Details</h1>
Student Details
<br>
<table border="1">
<tr>
<th>ID</th>
<th>First Name</th>
<th>Last Name</th>
<th>Year Level</th>
</tr>
<c:forEach>
<tr>
<td>${student.studentId}</td>
<td>${student.firstname}</td>
<td>${student.lastname}</td>
<td>${student.yearLevel}</td>
</tr>
</c:forEach>
</table>
</br>
Student'Adresse
<table border="1">
<tr>
<th>Street</th>
<th>City</th>
<th>Country</th>
</tr>
<h1>${student.addresses}</h1>
<c:forEach items="${student.addresses}" var="address">
<tr>
<td>${address.street}</td>
<td>${address.city}</td>
<td>${address.country}</td>
</tr> </c:forEach>
</table>
<br>
</body>
</html>
Student類:
@Entity
@Table
@NamedQueries({@NamedQuery(name="Student.getAll",query="SELECT e FROM Student e") })
public class Student implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column
private int studentId;
@Column
private String firstname;
@Column
private String lastname;
@Column
private int yearLevel;
@OneToMany(mappedBy="student", cascade=CascadeType.ALL)
private List<Address> addresses;
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public int getYearLevel() {
return yearLevel;
}
public void setYearLevel(int yearLevel) {
this.yearLevel = yearLevel;
}
public List<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
public Student(int studentId, String firstname, String lastname, int yearLevel) {
this.studentId = studentId;
this.firstname = firstname;
this.lastname = lastname;
this.yearLevel = yearLevel;
}
public Student(int studentId, String firstname, String lastname, int yearLevel, List<Address> addresses) {
this.studentId = studentId;
this.firstname = firstname;
this.lastname = lastname;
this.yearLevel = yearLevel;
this.addresses = addresses;
}
public Student(){}
public void addAddress(Address address){
this.addresses.add(address);
if(address.getStudent() != this){
address.setStudent(this);
}
}
}
和地址類:
@Entity
@Table
public class Address implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column
private int addressId;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="studentId")
private Student student;
@Column
private String street;
@Column
private String city;
@Column
private String country;
public Address(){}
public Address(int addressId, String street, String city, String country) {
this.addressId = addressId;
this.street = street;
this.city = city;
this.country = country;
}
public Address(int addressId, Student student, String street, String city, String country) {
this.addressId = addressId;
this.student = student;
this.street = street;
this.city = city;
this.country = country;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public int getAddressId() {
return addressId;
}
public void setAddressId(int addressId) {
this.addressId = addressId;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Override
public String toString() {
return street + ", " + city + ", " + country;
}
public boolean isEmptyAddress(){
return this.getStreet().isEmpty() && this.getCity().isEmpty() && this.getCountry().isEmpty();
}
public void updateAddress(Address address){
this.street = address.street;
this.city = address.city;
this.country = address.country;
}
這裏是問題;地址部分未加載。
1: - 所以現在我怎樣才能在servlet
所以現在我怎麼能先檢查是否正在加載地址之前,學生對象傳遞到JSP打印地址? 一位朋友告訴我,我可以在servlet中打印地址,但我不知道該怎麼做。
2: - JSP代碼是否可以顯示學生的地址?
(之間,在Java EE世界,讓我新...)
好的,謝謝,我刪除了額外的foreach,集合和var屬性,但它仍然不顯示JSP頁面中的地址部分。但是,我現在可以看到地址正在輸出中, – 2013-03-27 17:33:05
試着在頁面上加上'
$ {student.addresses}
'來查看地址是否被填充。 – clav 2013-03-27 17:39:41好了,現在它顯示地址,但格式如下:{[DavidStreet,DavidCity,DavidCountry]} – 2013-03-27 17:53:38