2013-03-26 50 views
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世界,讓我新...)

the JSP page

回答

0

要查看是否正在填充的地址,你可以在servlet做到這一點:

Student student = studentActions(studentId); 
if(student.getAddresses() != null) { 
    for(Address address : student.getAddresses()) { 
     System.out.println(address); 
    } 
} 

jsp代碼在打印學生信息的部分中有一個額外的<c:forEach>標記,應該將其刪除。外部<c:forEach>沒有指定collectionvar屬性,如果這是您的實際代碼不打印任何內容。

<c:forEach> 
    <tr> 
     <c:forEach> <!-- REMOVE THIS --> 
      <td>${student.studentId}</td> 
      <td>${student.firstname}</td> 
      <td>${student.lastname}</td> 
      <td>${student.yearLevel}</td> 
    </tr> 
</c:forEach> 
+0

好的,謝謝,我刪除了額外的foreach,集合和var屬性,但它仍然不顯示JSP頁面中的地址部分。但是,我現在可以看到地址正在輸出中, – 2013-03-27 17:33:05

+0

試着在頁面上加上'

$ {student.addresses}

'來查看地址是否被填充。 – clav 2013-03-27 17:39:41

+0

好了,現在它顯示地址,但格式如下:{[DavidStreet,DavidCity,DavidCountry]} – 2013-03-27 17:53:38