webForumDet fria alternativet

ArrayList i JSP

9 svar · 544 visningar · startad av janfang

janfangMedlem sedan okt. 200058 inlägg
#1

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());
		}
	}
%>
sgtpepperMedlem sedan apr. 20007 588 inlägg
#2

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.

SPiNMedlem sedan mars 20007 896 inlägg
#3

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.

SPiNMedlem sedan mars 20007 896 inlägg
#4

Här var man en minut sen... ;)

Bra förklaring schassen! :)

sgtpepperMedlem sedan apr. 20007 588 inlägg
#5

SPiN skrev:

Här var man en minut sen... ;)

Bra förklaring schassen! :)

Hehe, det gäller att vara snabb ;)

janfangMedlem sedan okt. 200058 inlägg
#6

Aha, det är så det ligger till. Då tar jag och gör om den till en klass som jag importerar på min sida. Tack för hjälpen! :-)

ViktorMedlem sedan aug. 20021 752 inlägg
#7

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 :)

EDIT: Inte bara 1 minut sen utan 7!

/Viktor

SPiNMedlem sedan mars 20007 896 inlägg
#8

Jag var inte sist att svara rätt ivf. :e ;)

ViktorMedlem sedan aug. 20021 752 inlägg
#9

Det är inte mycket aktivitet i denna forum men när det väl är det så är alla som gamar och hoppar över problemet och försöker hitta en lösning :)

/Viktor

janfangMedlem sedan okt. 200058 inlägg
#10

Hehe, det går ganska lätt att få hjälp med sina problem här i alla fall. :-)

132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
127 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)