2011-05-18, 12:46
  #13
Medlem
Måste alltså ArrayListen finnas/deklareras och skickas med även i index.jsp, trots att den bara används i tidrapport.jsp?

Jag tror största problemet är att jag inte riktigt har greppat hur jsp funkar öht. Som du ser, så försöker jag se det som att varje jsp är en egen "sida", så att jag först när jag skriver in min url kommer jag till loginsidan(index.html), om jag sedan lyckas skriva in rätt user och pass så "skickar" index mig till tidrapport.jsp, som är en helt egen sida. Just som en vanlig länk. Att den lika gärna skulle kunna skicka mig till altavista.com...


...men det är inte riktigt så det funkar va?
Citera
2011-05-18, 12:55
  #14
Medlem
Protons avatar
Citat:
Ursprungligen postat av bongstyre
Måste alltså ArrayListen finnas/deklareras och skickas med även i index.jsp, trots att den bara används i tidrapport.jsp?

Jag tror största problemet är att jag inte riktigt har greppat hur jsp funkar öht. Som du ser, så försöker jag se det som att varje jsp är en egen "sida", så att jag först när jag skriver in min url kommer jag till loginsidan(index.html), om jag sedan lyckas skriva in rätt user och pass så "skickar" index mig till tidrapport.jsp, som är en helt egen sida. Just som en vanlig länk. Att den lika gärna skulle kunna skicka mig till altavista.com...


...men det är inte riktigt så det funkar va?
JSP och java i sådana sidor funkar som vanlig java. Innan du försöker använda ett objekt måste det initieras, annars får du NullPointers. Du kan ju komma runt problemet genom att först försöka läsa ut din ArrayList från anropet och sedan kontrollera om det är en giltig objektreferens(dvs nåt annat än null) och därefter bestämma dej för om du ska skriva ut den eller ej. Därmed inte sagt att du nödvändigtvis måste initiera den i index.jsp.

I övrigt har du ju rätt, länkar etc funkar precis som vanlig html rätt upp och ner. Eftersom HTTP är stateless så är varje sida och varje anrop till sidan unikt, vilket innebär att du själv måste hantera tillstånd, dvs inställningar, vem som är inloggad etc för varje anrop som sker. Sessioner är en del av den hanteringen som du själv upptäckt.
Citera
2011-05-18, 13:29
  #15
Medlem
Citat:
Ursprungligen postat av Proton
JSP och java i sådana sidor funkar som vanlig java. Innan du försöker använda ett objekt måste det initieras, annars får du NullPointers. Du kan ju komma runt problemet genom att först försöka läsa ut din ArrayList från anropet och sedan kontrollera om det är en giltig objektreferens(dvs nåt annat än null) och därefter bestämma dej för om du ska skriva ut den eller ej. Därmed inte sagt att du nödvändigtvis måste initiera den i index.jsp.

Det är detta jag verkligen inte förstår... (fan vad jag känner mig trööög)
Om det är som vanlig java, så behöver ju inte alla variabler och objekt initieras i varje klass. Eftersom index.jsp aldrig använder ArrayList "kunder", eller refererar till den någonstans, så borde den väl inte behöva initieras.

Jag menar, om vi istället säger att index.jsp bara var en enkel startsida som innehåller länkar till tre andra sidor:
-----------------------
Hej och välkommen till min länksida!
Tryck på en länk för att komma dit.

länk 1: Bilder på mina katter
länk 2: Ritningar på mitt hus
länk 3: Fulla tyskar på fest

-------------------

...då skulle väl inte index.jsp behöva initiera varenda variabel och objekt som dessa sidor i sin tur använder?


Jag känner att det bara snurrar i huvudet,har suttit i lite över trettio timmar bara för att försöka få det här lilla enkla skiten att funka, så ledsen om jag verkar korkad och inte fattar nåt av det du säger.

Jag vet inte ens var jag ska börja för att fixa detta.

Kan jag använda något annat än
Kod:
 <jsp:forward page="/tidrapport.jsp" />

för att få användaren att komma till den sidan, för att komma runt problemet?
__________________
Senast redigerad av bongstyre 2011-05-18 kl. 13:33.
Citera
2011-05-18, 14:20
  #16
Medlem
Protons avatar
Citat:
Ursprungligen postat av bongstyre
Det är detta jag verkligen inte förstår... (fan vad jag känner mig trööög)
Om det är som vanlig java, så behöver ju inte alla variabler och objekt initieras i varje klass. Eftersom index.jsp aldrig använder ArrayList "kunder", eller refererar till den någonstans, så borde den väl inte behöva initieras.

Jag menar, om vi istället säger att index.jsp bara var en enkel startsida som innehåller länkar till tre andra sidor:
-----------------------
Hej och välkommen till min länksida!
Tryck på en länk för att komma dit.

länk 1: Bilder på mina katter
länk 2: Ritningar på mitt hus
länk 3: Fulla tyskar på fest

-------------------

...då skulle väl inte index.jsp behöva initiera varenda variabel och objekt som dessa sidor i sin tur använder?


Jag känner att det bara snurrar i huvudet,har suttit i lite över trettio timmar bara för att försöka få det här lilla enkla skiten att funka, så ledsen om jag verkar korkad och inte fattar nåt av det du säger.

Jag vet inte ens var jag ska börja för att fixa detta.

Kan jag använda något annat än
Kod:
 <jsp:forward page="/tidrapport.jsp" />

för att få användaren att komma till den sidan, för att komma runt problemet?
Det var alltså INTE det jag sa.

Det jag sa var att det funkar som i vanlig java med objektreferenser. Använder du nån av dem innan initiering kommer du får en NullPointerException, detsamma gäller i JSP.

Den sidan där du försöker läsa av den däremot behöver veta om referensen är null eller inte. Du kan tänka på det som ett metodanrop där du antingen kan få in en giltig objektreferens i metoden eller null. Då måste du alltså i din metod kolla om referensen är null eller inte och göra olika saker beroende på utfallet.
Citera
2011-05-18, 15:32
  #17
Medlem
Ok, sorry att jag är så frustrerad.

Nu har jag lagt in följande i tidrapport:

Kod:
<table>
			<tr>
				<td>Användare: <%= session.getAttribute("namn") %></td>
				
			</tr>
			<tr>
				<td>Datum(ååååmmdd): </td>
				<td><input type="text" name="datum"></td>
			</tr>
			<tr>
			<% ArrayList<String> kunder = (ArrayList) request.getAttribute("kundLista");  
				          
             		%>     
             		
             		<% if(kunder!=null) { %>
             			
				<td>Kund:</td>
				<td>
					<select name="kund">
						<%for(int i = 0; i < kunder.size(); i++) { %>
						<option value=i><%= kunder.get(i) %> </option>
						<% } %>
					</select> 				
				</td>
				<% } %>
			</tr>
			<tr>

...så nu kommer jag jag in på sidan tidrapport.jsp från index.jsp,

men, dropboxen ritas inte ut.
Alltså måste det betyda att kunder=null. Precis som du trodde.

Men för mig som inte begriper, varför är den null?
När jag surfar direkt till "localhost:8080/projektmapp/srvgetkunder", så funkar det.
Alltså är det inte fel i koden i servleten, utan det måste vara att den inte utförs när jag går från index.jsp till tidrapport.jsp.

Kan det ha att göra med att i samtliga mina servlets sätter jag HttpServletRequest och Response till samma namn (request & response).
Kod:
public void doGet(HttpServletRequest request, HttpServletResponse response)
		  throws ServletException, IOException	{
}

Skulle det på något sätt kunna innebära att det är "fel" request som skickas?
Alltså, hur vet " request.getAttribute("kundLista"); " vilken servlet som genererar "kundLista", om jag har flera servlets i samma projekt? Sitter alla mina servlets och lyssnar efter en request, och så fort det kommer en, så utför dem sin kod?


begriper fortfarande inte nåt. Men nu vet jag iaf att kunder innehåller null.

Hjälp?
__________________
Senast redigerad av bongstyre 2011-05-18 kl. 15:41.
Citera
2011-05-18, 16:11
  #18
Medlem
Protons avatar
Citat:
Ursprungligen postat av bongstyre
Ok, sorry att jag är så frustrerad.

Nu har jag lagt in följande i tidrapport:

Kod:
<table>
			<tr>
				<td>Användare: <%= session.getAttribute("namn") %></td>
				
			</tr>
			<tr>
				<td>Datum(ååååmmdd): </td>
				<td><input type="text" name="datum"></td>
			</tr>
			<tr>
			<% ArrayList<String> kunder = (ArrayList) request.getAttribute("kundLista");  
				          
             		%>     
             		
             		<% if(kunder!=null) { %>
             			
				<td>Kund:</td>
				<td>
					<select name="kund">
						<%for(int i = 0; i < kunder.size(); i++) { %>
						<option value=i><%= kunder.get(i) %> </option>
						<% } %>
					</select> 				
				</td>
				<% } %>
			</tr>
			<tr>

...så nu kommer jag jag in på sidan tidrapport.jsp från index.jsp,

men, dropboxen ritas inte ut.
Alltså måste det betyda att kunder=null. Precis som du trodde.

Men för mig som inte begriper, varför är den null?
När jag surfar direkt till "localhost:8080/projektmapp/srvgetkunder", så funkar det.
Alltså är det inte fel i koden i servleten, utan det måste vara att den inte utförs när jag går från index.jsp till tidrapport.jsp.

Kan det ha att göra med att i samtliga mina servlets sätter jag HttpServletRequest och Response till samma namn (request & response).
Kod:
public void doGet(HttpServletRequest request, HttpServletResponse response)
		  throws ServletException, IOException	{
}

Skulle det på något sätt kunna innebära att det är "fel" request som skickas?
Alltså, hur vet " request.getAttribute("kundLista"); " vilken servlet som genererar "kundLista", om jag har flera servlets i samma projekt? Sitter alla mina servlets och lyssnar efter en request, och så fort det kommer en, så utför dem sin kod?


begriper fortfarande inte nåt. Men nu vet jag iaf att kunder innehåller null.

Hjälp?
Du är snubblande nära den korrekta förklaringen till varför kunder är null.

Till att börja med kan du kolla igenom din index.jsp efter någonstans däri där dina kunder möjligen skulle kunna initieras.

När du inte hittat det kan du kolla i din servlet efter det stället där de initieras.

När du hittat det stället så vet du varför du inte får in några kunder i tidrapporten. Problemet är alltså att din index.jsp inte populerar nån lista, det enda den gör är ju att läsa ut ett användarnamn och password från databasen, right? Vad du kallar dina referenser för är helt ovidkommande.

En sak är dock helt säker: för att kunna loopa igenom en lista med data måste man populera listan med data, det görs ju inte på något automagiskt sätt och datat hänger definitivt inte med vid en forward per automagi om man inte explicit anger att det ska göra det.
Citera
2011-05-18, 16:57
  #19
Medlem
Jag förstår fortfarande inte riktigt...

jag ska försöka bryta ner min tankebana, så kan du enklare visa mig var jag tänker fel
Här är hur det borde fungera i mitt huvud...

steg 1:
Användare surfar in på url'en där index.jsp ligger.
index.jsp läses rad för rad och ritar alltså ut 2 textrutor samt en login-knapp

steg 2:
När användaren trycker på login, så avläses de två textrutorna in i två st String-objekt.
String objekten jämförs med posterna username & password i databasen.

Om dessa stämmer övverrens, så skapas en sessions-variabel "namn", som innehåller användarnamnet
Kod:
String name = request.getParameter("t1");
session.setAttribute( "namn", name );

och användaren skickas vidare till tidrapport.jsp.
Kod:
<jsp:forward page="/tidrapport.jsp" />

Steg 3:
tidrapport.jsp, så läses den av rad för rad
efter några rader där titel på sidan etc skrivs ut, så kommer den till raden:
Kod:
<td>Användare: <%= session.getAttribute("namn") %></td>
där vi alltså skriver ut användarnamnet som vi fick från förra sidan.
ytterligare några rader läses in och vi kommer till:
Kod:
<% ArrayList<String> kunder = (ArrayList) request.getAttribute("kundLista"); %>
(det är här jag har problem att fatta...)Men i mitt huvud ser det ut så här:
tidrapport.jsp initierar ett nytt objekt med namnet kunder, blir en referens till det objekt som returneras av servleten SrvGetKunder, då denna får en httpRequest via antingen GET eller POST.
(jag märker ju att det är detta som jag inte riktigt fattar, alltså själva kommunikationen mellan jsp och servlet. Hur fan vet den att det är just SrvGetKunder som den ska ropa på, och inte nån annan av mina servlets?)
Hur som helst, för att fortsätta mitt drömscenario...
fältet kunder fylls med all den fina information som SrvGetKunder har letat upp i min databas.

Steg 4.
Eftersom kunder nu innehåller några fina kundnamn i form av String's, så kommer denna dropbox också att ritas ut.
Kod:
<% if(kunder!=null) { %>
             			
				<td>Kund:</td>
				<td>
					<select name="kund">
						<%for(int i = 0; i < kunder.size(); i++) { %>
						<option value=i><%= kunder.get(i) %> </option>
						<% } %>
					</select> 				
				</td>
				<% } %>



Som du ser, så finns i mitt huvud aldrig någon tanke på att index.jsp ens behöver veta om att ArrayList kunder ens existerar. Varför tänker jag så fel?
Citera
2011-05-18, 19:48
  #20
Medlem
Protons avatar
Citat:
Ursprungligen postat av bongstyre
Jag förstår fortfarande inte riktigt...

jag ska försöka bryta ner min tankebana, så kan du enklare visa mig var jag tänker fel
Här är hur det borde fungera i mitt huvud...

steg 1:
Användare surfar in på url'en där index.jsp ligger.
index.jsp läses rad för rad och ritar alltså ut 2 textrutor samt en login-knapp

steg 2:
När användaren trycker på login, så avläses de två textrutorna in i två st String-objekt.
String objekten jämförs med posterna username & password i databasen.

Om dessa stämmer övverrens, så skapas en sessions-variabel "namn", som innehåller användarnamnet
Kod:
String name = request.getParameter("t1");
session.setAttribute( "namn", name );

och användaren skickas vidare till tidrapport.jsp.
Kod:
<jsp:forward page="/tidrapport.jsp" />

Steg 3:
tidrapport.jsp, så läses den av rad för rad
efter några rader där titel på sidan etc skrivs ut, så kommer den till raden:
Kod:
<td>Användare: <%= session.getAttribute("namn") %></td>
där vi alltså skriver ut användarnamnet som vi fick från förra sidan.
ytterligare några rader läses in och vi kommer till:
Kod:
<% ArrayList<String> kunder = (ArrayList) request.getAttribute("kundLista"); %>
(det är här jag har problem att fatta...)Men i mitt huvud ser det ut så här:
tidrapport.jsp initierar ett nytt objekt med namnet kunder, blir en referens till det objekt som returneras av servleten SrvGetKunder, då denna får en httpRequest via antingen GET eller POST.
(jag märker ju att det är detta som jag inte riktigt fattar, alltså själva kommunikationen mellan jsp och servlet. Hur fan vet den att det är just SrvGetKunder som den ska ropa på, och inte nån annan av mina servlets?)
Hur som helst, för att fortsätta mitt drömscenario...
fältet kunder fylls med all den fina information som SrvGetKunder har letat upp i min databas.

Steg 4.
Eftersom kunder nu innehåller några fina kundnamn i form av String's, så kommer denna dropbox också att ritas ut.
Kod:
<% if(kunder!=null) { %>
             			
				<td>Kund:</td>
				<td>
					<select name="kund">
						<%for(int i = 0; i < kunder.size(); i++) { %>
						<option value=i><%= kunder.get(i) %> </option>
						<% } %>
					</select> 				
				</td>
				<% } %>



Som du ser, så finns i mitt huvud aldrig någon tanke på att index.jsp ens behöver veta om att ArrayList kunder ens existerar. Varför tänker jag så fel?
Det var inte så tokigt fram till det att du körde en forward.

Vad sessionen beträffar har jag inga synpunkter, men väl några rader längre ner när du ska hämta ut din lista från anropet.

Du har ju forwardat anropet till sidan tidrapport.jsp. Under inga omständigheter, inte ens om stjärnorna står rätt och du drar på dej din magiska mantel, kommer din servlet SrvGetKunder att komma till din räddning här. När skulle den helt automagiskt och out-of-the-blue ha refererats i din anropskedja? Det korta svaret är att det gör den inte. Den ligger fridfullt och väntar på anrop som aldrig kommer, i och med att du effektivt kortsluter ditt anrop och går direkt till din jsp av nån oklar anledning.

Om du istället tänker såhär: ALL serverside-logik ska du ha i dina servlets, till exempel att läsa saker från databaser, göra beräkningar, skrivningar till databaser etc medan dina JSP-sidor ska du sträva efter att hålla så fri från logik det nånsin går och låta dem göra det de är bäst på: rita ut html.

Så, för att få det här att funka då enligt detta mönster:

I din index.jsp ska du ha ett formulär för att logga in. Detta formulär skickas sedan till en SERVLET(och inte junket du hade nu i nån jsp-sida) där du sköter ALL validering och autenticering av användaren. Om användaren klarar kollen sätts en sessionsvariabel i denna servlet, din lista med kunder populeras och man skickas sedan till tidrapport.jsp.

Skulle autenticeringen fallera skickas man istället tillbaka till index.jsp och ett felmeddelande bör ju skrivas ut samtidigt.

Ser du skillnaden? Problemet är att du har tänkt galet och kortslutit din webapplikation, du verkar ha fått för dej att jsp-sidan klarar att automagiskt anropa din servlet. Så är det alltså inte.
__________________
Senast redigerad av Proton 2011-05-18 kl. 19:50.
Citera
2011-05-19, 20:10
  #21
Medlem
När jag låg och skulle somna igår, så tror att poletten slutligen trillade ner...
Tack för all hjälp Proton!

JAg har nog tänkt helt bakvänt och uppochner hela tiden, men nu har jag eventuellt fattat.

Kan jag bara få en verifikation på att detta är rätt innan jag börjar koda om allt, så vore jag ytterst tacksam.

Nytt flödesschema:

Steg1:
Användaren surfar in på index.jsp (inloggningssidan)
där finns raden:
Kod:
<form name="srvgetkunder" method="post">
vilket innebär att när användaren trycker på login-knappen("submit"), så utförs det jag har i min doPost i SrvGetKunder.
Där ska jag då ha en uppkoppling mot min db, som verifierar user & pass.
om det lyckas så initieras kundLista redan där (i servleten), och användaren skickas till tidrapport.jsp (denna gång från SrvGetKunder, och inte som sist, via en "forward:jsp". Alltså denna kod i servleten:
Kod:
request.setAttribute("kundLista", kunder);
request.getRequestDispatcher("/tidrapport.jsp").forward(request, response);

om användaren skriver fel användarnamn, så skickas man istället tillbaka till index.jsp:
Kod:
request.getRequestDispatcher("/index.jsp").forward(request, response);


på detta sätt så finns ju alltså kundLista initierad när sidan som behöver den (tidrapport.jsp), laddas.

Är jag lite närmre målet, eller har jag åkt vilse igen?
Citera
2011-05-19, 20:17
  #22
Medlem
Protons avatar
Citat:
Ursprungligen postat av bongstyre
När jag låg och skulle somna igår, så tror att poletten slutligen trillade ner...
Tack för all hjälp Proton!

JAg har nog tänkt helt bakvänt och uppochner hela tiden, men nu har jag eventuellt fattat.

Kan jag bara få en verifikation på att detta är rätt innan jag börjar koda om allt, så vore jag ytterst tacksam.

Nytt flödesschema:

Steg1:
Användaren surfar in på index.jsp (inloggningssidan)
där finns raden:
Kod:
<form name="srvgetkunder" method="post">
vilket innebär att när användaren trycker på login-knappen("submit"), så utförs det jag har i min doPost i SrvGetKunder.
Där ska jag då ha en uppkoppling mot min db, som verifierar user & pass.
om det lyckas så initieras kundLista redan där (i servleten), och användaren skickas till tidrapport.jsp (denna gång från SrvGetKunder, och inte som sist, via en "forward:jsp". Alltså denna kod i servleten:
Kod:
request.setAttribute("kundLista", kunder);
request.getRequestDispatcher("/tidrapport.jsp").forward(request, response);

om användaren skriver fel användarnamn, så skickas man istället tillbaka till index.jsp:
Kod:
request.getRequestDispatcher("/index.jsp").forward(request, response);


på detta sätt så finns ju alltså kundLista initierad när sidan som behöver den (tidrapport.jsp), laddas.

Är jag lite närmre målet, eller har jag åkt vilse igen?
Right on target skulle jag kalla det där, bortsett från att din form-tagg inte innehåller nåt action-attribut där du borde anropat din servlet. name-attributet är inte så intressant, det är action som är avgörande för vart anropet skickas i ditt fall.

[PHP]<form name="something" action="srvgetkunder" method="post">[/PHP]

Som du själv sa, NU trillade poletten ner

Glöm inte att i början av varje JSP-sida så bör du ju kolla om sessionen finns med(dvs om man är inloggad eller ej, om man inte är det bör man ju skickas till inloggningssidan), alternativt skriva ihop ett filter för dina servlets och jsp-sidor som tar hand om den biten åt dej.
Citera
2011-05-19, 20:28
  #23
Medlem
Citat:
Ursprungligen postat av Proton
Right on target skulle jag kalla det där, bortsett från att din form-tagg inte innehåller nåt action-attribut där du borde anropat din servlet. name-attributet är inte så intressant, det är action som är avgörande för vart anropet skickas i ditt fall.

[PHP]<form name="something" action="srvgetkunder" method="post">[/PHP]

Som du själv sa, NU trillade poletten ner

Glöm inte att i början av varje JSP-sida så bör du ju kolla om sessionen finns med(dvs om man är inloggad eller ej, om man inte är det bör man ju skickas till inloggningssidan), alternativt skriva ihop ett filter för dina servlets och jsp-sidor som tar hand om den biten åt dej.


Smart det där med inloggningskollen.
Återigen tack för hjälpen!

Nu dök det plötsligt upp en fråga till bara

Kan jag ha flera form-taggar, med olika metoder? Typ:

Kod:
<form name="something" action="srvgetkunder" method="post">
<form name="something2" action="srvtjolahopp" method="get">
Citera
2011-05-19, 22:03
  #24
Medlem
Protons avatar
Citat:
Ursprungligen postat av bongstyre
Smart det där med inloggningskollen.
Återigen tack för hjälpen!

Nu dök det plötsligt upp en fråga till bara

Kan jag ha flera form-taggar, med olika metoder? Typ:

Kod:
<form name="something" action="srvgetkunder" method="post">
<form name="something2" action="srvtjolahopp" method="get">
Det är inget som hindrar dej att ha fler formulär på en och samma sida och det är inget som hindrar dej från att använda get ist för post.

Du bör dock läsa på om get och post innan du sätter igång och koda hejvilt för att få en uppfattning om när man bör använda det ena framför det andra. Dessutom är det få gånger man har användning för mer än ett formulär per sida, men det är en annan sak.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in