在Servlet中合并Agency与Reservation查询结果并传递到JSP的实现咨询
核心方案说明
你可以根据业务复用场景选择是否新建第三个JavaBean,两种方案均无需依赖Hibernate、也不需要在JSP中编写SQL,完全符合你的需求:
方案1:新建专用DTO类(推荐,耦合度更低)
业内通常将这类用于前端展示的混合数据类称为DTO(数据传输对象),专门用来承载多表关联后的展示数据,不会污染原有和数据库表一一对应的实体类,适合这种临时的展示类需求。
实现步骤:
- 新建
ReservationAgencyDTO.java类,把所有你需要在JSP展示的字段都定义在类中,包含Reservation表的展示字段和Agency表的agency_name字段,生成无参构造、全参构造以及所有字段的getter、setter方法即可。
示例代码:
public class ReservationAgencyDTO { // 以下为Reservation表需要展示的字段,可根据你的实际需求增减 private Integer reservationId; private java.util.Date reserveTime; private String contactName; // 以下为Agency表需要展示的字段 private String agencyName; // 无参构造 public ReservationAgencyDTO() {} // 全参构造 public ReservationAgencyDTO(Integer reservationId, java.util.Date reserveTime, String contactName, String agencyName) { this.reservationId = reservationId; this.reserveTime = reserveTime; this.contactName = contactName; this.agencyName = agencyName; } // 所有字段的getter和setter方法 public Integer getReservationId() { return reservationId; } public void setReservationId(Integer reservationId) { this.reservationId = reservationId; } // 其他字段的getter、setter以此类推 }
- 在DAO层编写关联查询SQL,一次查询出所有需要的数据:
SELECT r.reservation_id, r.reserve_time, r.contact_name, a.agency_name FROM Reservation r LEFT JOIN Agency a ON r.agency_id = a.agency_id
- 遍历查询结果集,将数据封装为
ReservationAgencyDTO的集合,将集合存入request域后传给JSP,JSP直接遍历集合取对应属性展示即可,无需做任何额外处理。
方案2:改造现有Reservation类(适合长期需要关联查询Agency的场景)
如果后续业务中经常需要在查询预订信息的时候同时获取关联的旅行社信息,不需要新建类,直接在原有Reservation.java中新增Agency类型的属性即可。
实现步骤:
- 修改
Reservation.java,新增Agency属性以及对应的getter、setter:
public class Reservation { // 原有Reservation类的属性保持不变 private Integer reservationId; private Integer agencyId; // 新增关联的Agency属性 private Agency agency; // 原有构造方法、其他getter、setter不变 public Agency getAgency() { return agency; } public void setAgency(Agency agency) { this.agency = agency; } }
- DAO层执行和方案1完全相同的关联查询SQL,遍历结果集时先把Agency相关字段封装成Agency对象,再set到Reservation对象的agency属性中即可。
- JSP页面直接通过
${reservation.agency.agency_name}就能获取到旅行社名称。
内容的提问来源于stack exchange,提问作者Aleksandra Asanin
相关产品推荐
相关产品推荐

