Hej,
Jag har ett litet problem med en arraylista i JSP.
Denna kod visar en klass som jag har i en JSP-fil:
<%!
public class prodInBasket {
private int prodId; //Id-numret på produkten.
private int prodNr; //Antalet produkter.
public prodInBasket(int prodId, int prodNr) {
this.prodId = prodId;
this.prodNr = prodNr;
}
// + några get- och setmetoder.
}
%>
Jag har tänkt att jag ska spara objekt av typen prodInBasket i en arrayList som ska sparas i en sessionvariabel.
Jag sparar informationen på detta sätt:
<%
int prodId = Integer.parseInt(request.getParameter("prodId"));
int prodNr = Integer.parseInt(request.getParameter("prodNr"));
ArrayList prodList = new ArrayList();
prodInBasket tempProd = new prodInBasket(prodId, prodNr);
if(session.getAttribute("basketList") == null) {
// Det fanns inget i varukorgen. Skapa ny lista.
prodList.add(tempProd);
session.setAttribute("basketList", prodList);
}
else {
// Det finns något i varukorgen. Lägg på objekt på listan.
ArrayList localList = (ArrayList)session.getAttribute("basketList");
localList.add(tempProd);
session.setAttribute("basketList", localList);
}
%>
Det går att spara information i sessionvariabeln. Jag har testat att jämföra med null och något finns det där i alla fall. Problemet kommer när jag ska skriva ut arraylistan på en annan JSP-sida. Jag har tänkt att jag kunde använda följande kod, men då får jag felmeddelandet "java.lang.ClassCastException" på raden prodInBasket p = (prodInBasket)i.next();. Det verkar som jag inte kan typomvandla av någon anledning. Vad kan felet vara? Kan jag inte definiera en klass i en JSP-fil?
<%
if(session.getAttribute("basketList") == null) {
out.println("Varukorgen är tom");
}
else {
ArrayList localList = (ArrayList)session.getAttribute("basketList");
Iterator i = localList.iterator();
while(i.hasNext()) {
prodInBasket p = (prodInBasket)i.next();
out.println(p.getProdId());
}
}
%>
Klassen prodInBasket definerar du på den första JSP-sidan, den kommer då att bli en inre klass i den servletklass som produceras utifrån JSP-sidan.
Om du sedan försöker referera till prodInBasket från en annan JSP-sida så kommer denna andra sida inte att hitta klassen. Jag gissar att du då definerat upp den även i denna JSP-sida. Problemet som då uppstår är antagligen att det ur JVM:ens synvinkel inte är samma klass, det är två olika prodInBasket-klasser, som är inre klasser till två olika servlets. De två klasserna har inte samma signatur och går inte att typkonvertera mellan.
Det du bör göra är att lägga prodInBasket-klassen i en egen java-fil i ett paket som du sedan kan importera på dina JSP-sidor. Du bör även namnge den med stor bokstav: ProdInBasket för att följa gängse kodstandard.
Det är alltid en god idé att sträva efter att ha så lite logik som möjligt i JSP-sidorna, där skall enbart presentationslogiken finnas. All annan logik bör läggas i separata klasser/servlets.
Klassen prodInBasket är endast tillgänglig på den sidan som du definierat klassen. Gör om prodInBasket till en böna, eller en bakomliggande klass som du sedan importerar högst upp på dina JSP-sidor.
Finns klassen definierad även på den sida där du försöker skriva ut produkterna? Om inte så är det där som problemet ligger, jag tror nämligen att om du gör en klass i en JSP så blir den en privat klass, dvs bara åtkomlig för den JSP sidan.
Det är bättre om du skapar klassen som en vanlig java klass, eller använder dig av java bönor.
En annan sak som inte har med detta problem att göra, enligt Javas kod konventioner så ska klasser alltid börja med stor bokstav och funktioner med liten :)