0

クラス : Student と Address を OneToMany の関係で使用する必要があるため、すべての学生が 1 つまたは複数のアドレスを持つことができます。

ここで、指定された学生の詳細 (学生 + アドレスの詳細) を JSP ページに表示しようとしましたが、アドレスではなく学生の情報のみが表示されます。

サーブレットのページは次のとおりです。

       @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>

学生クラス:

     @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);
    }
   }
  }  

そして Address クラス:

        @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: - それでは、サーブレットでアドレスを出力するにはどうすればよいですか

では、学生オブジェクトが jsp に渡される前に、アドレスが読み込まれているかどうかを最初に確認するにはどうすればよいでしょうか。友人から、サーブレットでアドレスを出力できるとのことですが、その方法がわかりません。

2: - JSP コードは学生の住所を表示するのに問題ありませんか?

(その間、私はJava EEの世界では初めてなので...)

JSP ページ

4

1 に答える 1

0

アドレスが入力されているかどうかを確認するには、サーブレットでこれを実行できます。

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>
于 2013-03-27T16:06:28.893 に答える