クラス : 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の世界では初めてなので...)