我目前正在學校項目中工作,我和我的小組應該構建一個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>
很好的嘗試................. – Lijo
解決問題。謝謝!!!!! –