Toon posts:

[JSP] bean en meerdere sessie

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik zit met een probleem.

Ik ben bezig met een kleine jsp-webapplicatie. Ik heb even mijn code niet bij de hand, maar zal proberen het zo goed mogelijk uit te leggen.

zodra de pagina index.jsp wordt aangeroepen, wordt een een bean aangeroepen die kijkt naar de waarde "klantGestart". Is deze false dan moet de zijn nummer en wachtwoord invullen.

Kloppen zijn gebruikersnaam en wachtwoord, dan wordt de klant gestart in de applicatie, die houdt in dat er een connectie wordt gelegd naar ZIJN mysql database aan de hand van zijn klantnummer. Vervolgens wordt er een vector gevuld die zijn notities bevat. de boolean "klantGestart" krijgt de waarde "tue" en hij word doorverwezen naar de volgende pagina.

Komt hij nu weer bij index.jsp dan is de waarde "klantGestart" true (uit de bean gehaald) en word hij automatisch weer doorverwezen. Tot zover werkt alles perfect.

Nu komt echter het probleem:

Zodra diezelfde klant inlogt via een andere pc of browser, dan wordt een nieuwe sessie gestart. de waarde van "klantGestart" is dus "false". Hij zal zich in moeten loggen, waardoor het hele proces weer wordt opgezet (klant starten (database) en doorverwijzen) Echter treedt er nu een nullpointerexecption op bij het vullen van de Vector notities. Voor zover ik zie in MySQL is de databaseverbinding wel gestart :?


Pas zodra ik de webbap in tomcat 5.0.28 reload, dan wil hij weer inloggen.

Iemand enig idee wat er fout kan gaan?

jsp:usebean heet een scope="session"

[ Voor 5% gewijzigd door Verwijderd op 24-09-2004 09:39 ]


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Zoals je waarschijnlijk zelf al doorhad, krijg je deze exception omdat je een vector wil vullen die hoogstwaarschijnlijk niet bestaat.

Ik denk dat een brokje code hier niet zou mistaan, want hier kunnen we enkel op de logica beoordelen en die is wel ongeveer goed denk ik

  • djengizz
  • Registratie: Februari 2004
  • Niet online
Zoals FoX zegt kan je Vector null zijn of doe je tijdens het vullen iets als:
Java:
1
2
Vector notitieVector = new Vector();
notitieVector.add(klant.getNotitieVerzameling().getNotitie());

Als bv
Java:
1
klant.getNotitieVerzameling()
null oplevert dan zal
Java:
1
klant.getNotitieVerzameling().getNotitie()
een nullpointer opleveren.

Verwijderd

Topicstarter
Allereerst is het dan natuurlijk raar, dat het wel goed gaat bij de eerste keer inloggen.

als de bean wordt aangeroepen, wordt er standaar een vector aangemaakt.
bij het starten van de klant worden de notities uit de database gehaald, ieder record wordt in een object "Notitie" gestopt en die worden aan de notities vector toegevoegd.

Verwijderd

Topicstarter
Zoals ik al zei, ik heb even geen code bij de hand (morgen weer).

Maar zijn er misschien gewoon stomme die ik doe, moet een bean aan een bepaalde voorwaarde voldoen. Of blijft een bean met scope="session" contstant draaien, zodra de browser wordt gesloten :?

Verwijderd

Ja, die bean blijft in het geheugen van de application server staan, en ook als deze een lange actie aan het ondernemen was zal deze niet automatisch gestopt worden bij het afsluiten van de browser. Een browser-close event of iets dergelijks bestaat da n ook niet. Als enigste heb je nog een beetje een HTML connection pipe broken. Als je net aan het schrijven was naar je client vanuit je servlet of jsp en de client stopt de browser krijg je deze exception.

Normaal gesproken zet je een timeout op je sessie. Bv, een half uur.

Verwijderd

Topicstarter
Maar, als het waar is dat de bean blijft draaien in de applicationserver, waarom geeft hij bij een tweede maal dan niet de waarde "true" bij "getKlantGestart();"

Ik blijf het een vreemde kwestie vinden...

  • MrBarBarian
  • Registratie: Oktober 2003
  • Laatst online: 07-03-2023
Verwijderd schreef op 24 september 2004 @ 15:01:
Ja, die bean blijft in het geheugen van de application server staan, en ook als deze een lange actie aan het ondernemen was zal deze niet automatisch gestopt worden bij het afsluiten van de browser. Een browser-close event of iets dergelijks bestaat da n ook niet. Als enigste heb je nog een beetje een HTML connection pipe broken. Als je net aan het schrijven was naar je client vanuit je servlet of jsp en de client stopt de browser krijg je deze exception.

Normaal gesproken zet je een timeout op je sessie. Bv, een half uur.
Hmm, over watvoor sessionbean hebben we het eigelijk? Stateful of stateless? Is dit nl niet het probleem? (tis alwer een tijdje geleden dat ik ermee heb geknutselt)

iRacing Profiel


Verwijderd

Topicstarter
MrBarBarian schreef op 24 september 2004 @ 15:40:
[...]


Hmm, over watvoor sessionbean hebben we het eigelijk? Stateful of stateless? Is dit nl niet het probleem? (tis alwer een tijdje geleden dat ik ermee heb geknutselt)
Geen idee ik gebruik:
code:
1
2
<jsp:useBean id="hoofdbean" scope="session"
class="hoofdbean.Main"/>

[ Voor 9% gewijzigd door Verwijderd op 24-09-2004 15:49 ]


  • djengizz
  • Registratie: Februari 2004
  • Niet online
Verwijderd schreef op 24 september 2004 @ 12:08:
Maar zijn er misschien gewoon stomme die ik doe, moet een bean aan een bepaalde voorwaarde voldoen. Of blijft een bean met scope="session" contstant draaien, zodra de browser wordt gesloten :?
Nee hoor. Als jij niet iets raars met je Bean hebt gedaan (static class variabelen, Singletons, etc) krijgt iedere user een eigen session en dus een eigen bean. Het sluiten van je browser zorgt er voor dat je een nieuwe sessie krijgt als je weer aanlogt. Wel kan een verzoek wat 'al is afgevuurd' nog door draaien ondanks het stoppen van de browser.
MrBarBarian schreef op 24 september 2004 @ 15:40:
Hmm, over watvoor sessionbean hebben we het eigelijk? Stateful of stateless? Is dit nl niet het probleem? (tis alwer een tijdje geleden dat ik ermee heb geknutselt)
Het is geen session bean, het is zelfs geen Enterprise Bean. Dit is gewoon een Java Bean (net zoals bv. een button).

@TS: Het wordt toch tijd voor een stukje code denk ik.

Verwijderd

Al eens url rewriting geprobeerd als je naar naar een nieuwe pagina surft. Als de gebruiker cookies af heeft staan (of restricties op gezet heeft) kan dat problemen geven.

Als je met sessies werkt moet je altijd url rewriting doen om dergelijke problemen te voorkomen.

Verwijderd

Topicstarter
djengizz schreef op 25 september 2004 @ 10:44:
[...]

Nee hoor. Als jij niet iets raars met je Bean hebt gedaan (static class variabelen, Singletons, etc) krijgt iedere user een eigen session en dus een eigen bean. Het sluiten van je browser zorgt er voor dat je een nieuwe sessie krijgt als je weer aanlogt. Wel kan een verzoek wat 'al is afgevuurd' nog door draaien ondanks het stoppen van de browser.

[...]

Het is geen session bean, het is zelfs geen Enterprise Bean. Dit is gewoon een Java Bean (net zoals bv. een button).

@TS: Het wordt toch tijd voor een stukje code denk ik.
Geen statis class en singleton. Singleton heb ik weinig verstand van... Ik zal zo snel mogelijk de code plaatsen.

Verwijderd

Topicstarter
Eindelijk kan ik wat meer info geven.
Nogmaals een keer inloggen gaat perfect, niks aan de hand. Log je vervolgens in via een andere pc, of nadat je de browser hebt gesloten dan ontstaat de volgende fout:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

org.apache.jasper.JasperException
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:372)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


root cause 

java.lang.NullPointerException
    hoofdbean.DBAdapterKlant.getNotities(DBAdapterKlant.java:62)
    hoofdbean.Main.startKlant(Main.java:47)
    org.apache.jsp.index_jsp._jspService(index_jsp.java:65)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


Hieronder is een link naar een .rar bestand waarin mijn classe staan en de index.jsp

overbodige info heb ik niet toegevoegd.

Als iemand mij zou willen helpen graag!!!

webapp.rar

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 11:49

Janoz

Moderator Devschuur®

!litemod

Aan class files hebben we erg weinig natuurlijk. Die zijn een beetje lastig te lezen. Ik ben namelijk erg benieuwd naar de implementatie van Main.getKlantGestart();. Ik heb namelijk het vermoeden dat je niet doorhebt dat een gestarte sessie door een gebruiker niet dezelfde sessie is als een andere sessie (ander moment of andere computer) gestart door dezelfde gebruiker.

De exception die wordt gegooid is idd duidelijk eeen niet bestaande vector.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Janoz schreef op 26 september 2004 @ 12:17:
Aan class files hebben we erg weinig natuurlijk. Die zijn een beetje lastig te lezen. Ik ben namelijk erg benieuwd naar de implementatie van Main.getKlantGestart();. Ik heb namelijk het vermoeden dat je niet doorhebt dat een gestarte sessie door een gebruiker niet dezelfde sessie is als een andere sessie (ander moment of andere computer) gestart door dezelfde gebruiker.

De exception die wordt gegooid is idd duidelijk eeen niet bestaande vector.
Sorry dat was een foutje, dacht er van te voren nog wel aan :)

source.rar

Verwijderd

Topicstarter
Verwijderd schreef op 26 september 2004 @ 12:25:
[...]

Sorry dat was een foutje, dacht er van te voren nog wel aan :)

source.rar
En nog deed ik het fout :?

Mijn excuses, bij deze een gedeelte van de webapp (index.jsp)
webapp.rar

en de java sources (gemaakt ik JBuilderX)
source.rar

Verwijderd

Topicstarter
Omdat ie de eerste keer wel goed gaat en ik ook wordt doorverwezen als ik al ben ingelogd, heb ik het idee dat er aan de classes niet zoveel mis is.

Het is eerder het feit, dat ik met dezelfde gebruiker niet kan inloggen als deze al een keer is ingelogd...

Ik heb dus het idee dat er iets mis is met de usebean ofzo :?

  • djengizz
  • Registratie: Februari 2004
  • Niet online
Je moet als je klaar bent altijd de connectie sluiten. Kan zijn dat er een max. aantal connecties (1?) op de database is toegestaan. Alleen zou ik dan geen nullpointer verwachten. Misschien moet je het catchen van de SQL exceptie in getNotities eens implementeren...

Verwijderd

Topicstarter
djengizz schreef op 27 september 2004 @ 15:01:
Je moet als je klaar bent altijd de connectie sluiten. Kan zijn dat er een max. aantal connecties (1?) op de database is toegestaan. Alleen zou ik dan geen nullpointer verwachten. Misschien moet je het catchen van de SQL exceptie in getNotities eens implementeren...
MySQL gaf aan twee verbindingen te hebben op de desbetreffende database, dat kan naar mijn idee de fout niet zijn.

  • djengizz
  • Registratie: Februari 2004
  • Niet online
Dan zou ik toch, aangezien je JBuilder gebruikt, even een breakpoint zetten in getNotities en de boel debuggen.

Verwijderd

Topicstarter
Eindelijk weet ik waar het fout gaat. Ik zal het dan ook gelijk even uitleggen, zodat andere er later misschien iets aan hebben (search)

in de class Main creeer ik twee objecten voor de databaseverbindingen.
code:
1
2
private static DBAdapeterTwee dbAdapter twee = ..
private static DBAdapterKlant dbAdapterKlant;


En de eigenschap static zorgt voor problemen.

Iedere klant gebruikt dus dezelfde objecten, voor de databaseverbinding.
Dat zou niet direct een nullpointer op hoeven te leveren, maar bij het starten van de dbAdapterKlant wordt de volgende code uitgevoerd:

code:
1
databasenaam = databasenaam + klantnummer


bij het opstarten is databasenaam "jdbc:odbc:"

maar als hij al een keer is gestart krijg je dus in werkelijkheid:
code:
1
databasenaam = databasenaam + klantnummer +klantnummer


Er is dus geen verbinding, en dus levert getNotities een nullpointerexception op.

Allen bedankt voor jullie hulp
Pagina: 1