2014-04-07 48 views
0

我目前正在學校項目中工作,我和我的小組應該構建一個MVC項目,在這個項目中我們有Building和Room類。關係是OnetoMany,Building-(OneToMany)-Room。 當我們想要搜索建築物名稱,然後顯示該建築物中的所有房間時,就會出現問題。我們可以在不使用jsp的情況下運行我們的servlet時提取相關數據,但是當我們通過運行searchBuilding.jsp啓動項目時,我們只能輸入建築物名稱,並且當預計看到連通房間時,我們會收到消息 「java.lang.ClassCastException:java.util.ArrayList不能轉換爲org.ics.ejb.Room」。 所有的代碼可能有點混亂,但我真的很感激,如果有人能幫我發現問題,因爲我應該明天向我的教授展示這件事。從JSP-Class(使用Servlet的MVC)檢索數據

這是我們的代碼: 建設:

@Entity 
    @Table(name = "Building") 
    public class Building { 
    private String bname; 
private List<Room> rooms; // Building can have many Rooms 

@Id 
@Column(name = "Bname") 
public String getBname() { 
    return bname; 
} 

public void setBname(String bname) { 
    this.bname = bname; 
} 

@OneToMany(mappedBy = "building", fetch = FetchType.EAGER) 
public List<Room> getRooms() { 
    return rooms; 
} 

public void setRooms(List<Room> rooms) { 
    this.rooms = rooms; 
} 

}

ROOM:

@NamedQueries({ 
@NamedQuery(name="Room.findByBname", 
query="SELECT r FROM Room r WHERE r.bname LIKE :bname"), 
}) 

@Entity 
@Table(name = "Room") 
public class Room implements Serializable { 
/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
private RoomId id; 
private String bname; 
private Building building; 

public String getBname() { 
    return bname; 
} 

public void setBname(String bname) { 
    this.bname = bname; 
} 

@Id 
public RoomId getId() { 
    return id; 
} 

public void setId(RoomId id) { 
    this.id = id; 
} 

@ManyToOne 
@JoinColumn(name = "Bname", insertable = false, updatable = false) 
public Building getBuilding() { 
    return this.building; 
} 

public void setBuilding(Building building) { 
    this.building = building; 
} 
} 

ROOMID:

@Embeddable 
public class RoomId implements Serializable { 

private String bname; 
private String rcode; 

public RoomId() { 
} 

public RoomId(String bname, String rcode) { 
    this.bname = bname; 
    this.rcode = rcode; 
} 

@Column(name = "Bname", nullable = false) 
public String getbname() { 
    return bname; 
} 

public void setbname(String bname) { 
    this.bname = bname; 
} 

@Column(name = "Rcode", nullable = false) 
public String getrcode() { 
    return rcode; 
} 

public void setrcode(String rcode) { 
    this.rcode = rcode; 
} 

public boolean equals(Object other) { 
    if ((this == other)) { 
     return true; 
    } 

    if ((other == null)) { 
     return false; 
    } 

    if (!(other instanceof RoomId)) { 
     return false; 
    } 

    RoomId castOther = (RoomId) other; 

    return ((this.getbname() == castOther.getbname()) || (this.getbname() != null 
      && castOther.getbname() != null && 

    this.getbname().equals(castOther.getbname()))) 

      && 

((this.getrcode() == castOther.getrcode()) ||          (this.getrcode() != null    && castOther.getrcode() != null && 

      this.getrcode().equals(castOther.getrcode()))); 
} 

public int hashCode() { 
    return super.hashCode(); 
} 

}

BUILDINGEAO:

@Stateless 
public class BuildingEAOImpl implements BuildingEAOImplLocal { 
@PersistenceContext(unitName = "LabEJBSql") 
private EntityManager em; 

public BuildingEAOImpl() { 
    // TODO Auto-generated constructor stub 
} 

public Building findByBname(String bname) { 
    return em.find(Building.class, bname); 
} 
} 

FACADE:

@Stateless 
public class Facade implements FacadeRemote, FacadeLocal { 
@EJB 
BuildingEAOImplLocal BuildingEAO; 
@EJB 
RoomEAOImplLocal RoomEAO; 

public Facade() { 
    // TODO Auto-generated constructor stub 
} 

public List<Room> findRoomsByBname(String bname) { 
    return RoomEAO.findByBname(bname); 
    } 
} 

SERVLET:

@WebServlet("/TestClientServlet") 
public class TestClientServlet extends HttpServlet { 
private static final long serialVersionUID = 1L; 
@EJB 
private FacadeLocal facade; 

/** 
* @see HttpServlet#HttpServlet() 
*/ 
public TestClientServlet() { 
    super(); 
    // TODO Auto-generated constructor stub 
} 

protected void service(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 
    PrintWriter out = response.getWriter(); 
    out.println("<!DOCTYPE html><html><head>"); 
    out.println("<title>Lab1</title>"); 
    out.println("<meta charset=\"ISO-8859-1\">"); 
    out.println("</head><body>"); 



    /*//THIS WORKS PERFECTLY FINE 
List<Room> rooms = facade.findRoomsByBname("EC2"); 
    for (Room r : rooms) { 
     out.println("<h4>Hittade: " + r.getId().getbname() + " " 
       + r.getId().getrcode() + "</h4>"); 
     out.println("</body></html>"); 
    } 
}*/ 

protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

    PrintWriter out = response.getWriter(); 
    out.println("TestClientServlet-doGet"); 
    out.close(); 

} 

protected void doPost(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

    String url = null; 
    // Get hidden field 
    String operation = request.getParameter("operation"); 

    if (operation.equals("showbuilding")) { 
     String bname = request.getParameter("txtBname"); 

     List<Room> r = facade.findRoomsByBname(bname); 
     request.setAttribute("rooms", r); 
     url = "/ShowBuilding.jsp"; 
    } else if (operation.equals("searchbuilding")) { 
     System.out.println("TestClientServlet-searchbuilding"); 
     url = "/SearchBuilding.jsp"; 
    } else { 
     url = "/SearchBuilding.jsp"; 
    } 
    System.out.println(url); 

    RequestDispatcher dispatcher = getServletContext() 
      .getRequestDispatcher(url); 
    dispatcher.forward(request, response); 
} 
*/ 
} 

SEARCHBUILDING.JSP:

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO- 
8859-1"> 
<title>Search Building</title> 
</head> 
<body> 
<form action="/BuildRoomClientProject/TestClientServlet" method="post"> 

<table cellspacing="0" cellpadding="0" border="0" align="left"> 
<tr> 
<td><h2>Search Building:</h2></td> 
</tr> 
<tr> 
<td> 

<input type= "text" name= "txtBname" size ="25" maxlength="25"> 
<input type="submit" name="submit" value="Search" /> 
</td> 
<td></td> 
</tr> 
</table> 

<input name="operation" value="showbuilding" type="hidden"> 

</form> 
</body> 
</html> 

SHOWBUILDING.JSP:

<%@ page contentType="text/html;charset=windows-1252"%> 
<%@ page import = "org.ics.ejb.Building" %> 
<%@ page import = "org.ics.ejb.Room" %> 
<%@ page import = "org.ics.ejb.RoomId" %> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title> 
Show Building 
</title> 
</head> 
<body> 
<% Room r = (Room)request.getAttribute("rooms"); %> 
<% Building b = (Building)request.getAttribute("building"); %> 
<% for (int i=0; i<100; i++){ 
System.out.println(r.getBname() + " " + r.getId().getrcode()); 
}%> 
<h2> 
Building: 
</h2> 
<p> 
<%= r.getId().getrcode()%> 
<%= b.getBname()%> 
</p> 
<form action="/BuildRoomClientProject/TestClientServlet" method="post"> 
<input type="submit" name="submit" value="Tillbaka"> 
<input name="operation" value="searchbuilding" type="hidden"> 
</form> 
</body> 
</html> 

回答

0

「房間」屬性被設置爲servlet中房間的ArrayList屬性。但是當你試圖在jsp中獲得它的時候,你期待的是一個單一的房間。 更改

<% Room r = (Room)request.getAttribute("rooms"); %> 

<% List<Room> rooms = (List<Room>)request.getAttribute("rooms"); %> 

,然後通過每個房間迭代。

+0

很好的嘗試................. – Lijo

+0

解決問題。謝謝!!!!! –