[J2EE] Data opslag in SessionBean

Pagina: 1
Acties:

  • Valor
  • Registratie: Mei 2005
  • Laatst online: 06-02 08:25

Valor

yummie spam

Topicstarter
beste mensen,

Ik ben een beetje met j2ee aan't werken, en doe dit nog niet zo lang. Ik loop hierbij tegen een probleem aan.

volgens mijn bronnen is het mogelijk om data (zowel simple objects als eigen classes) op te slaan zodat de data bewaard blijft.

wij hebben nu een jsp pagina die 2x gebruik moet maken van deze session bean

we maken een object van deze bean als volgt:
Java:
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
    <%@ page import="ejb.*" %>
    <%@ page import="java.util.Vector" %>
    <%@ page import="java.rmi.RemoteException" %>
    <%@ page import="javax.rmi.PortableRemoteObject" %>
    <%@ page import="javax.ejb.CreateException" %>
    <%@ page import="javax.naming.*" %>
    <%!
    private Enterprise1 remote;
    private Enterprise1Home eh;
    private Context context = null;
    private Object ref = null;    
    %><%
    try{
      context = new InitialContext();
      Object ref = context.lookup("Enterprise1");

      eh = (Enterprise1Home)PortableRemoteObject.narrow(ref, Enterprise1Home.class);
    } catch(Exception ex) {
      %>Home niet gevonden<br /><%
    }

    try {
      remote = eh.create();
    } catch(Exception ex) {
      %>Remote kan  niet worden gecreerd<br /><%
    }
    %>

de remote heet dus Enterprise1.

het probleem is nu dat wanneer wij de tweede keer de jsp aanroepen, dat de bean opnieuw gemaakt word (als 'new Enterprise1' oid)
zodoende is data die we dmv de eerste jsp aangemaakt hadden opeens weg :(
hoe moeten wij nu zorgen dat we wel die data vasthouden?
(het is immers een sessionbean)

[ Voor 8% gewijzigd door Valor op 21-12-2005 15:35 ]


  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 21-04 15:30

Salandur

Software Engineer

Dan heb je er waarschijnlijk een stateless sessionbean van gemaakt. een statefull sessionbean doet het beter.

wat bedoel je eigenlijk met dataopslag? als je wilt dat het langer dan een sessie bewaart wordt moet je andere maatregelen nemen, door de data fytsiek op te slaan in een database of een bestandje iod.

Assumptions are the mother of all fuck ups | iRacing Profiel


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 16:24
je zult je data ergens in een of andere datastorage moeten bewaren als je het terug wil ophalen...

offtopic:
waarom haal je dit allemaal op in een jsp pagina ? ik vind dit nogal slordig overkomen

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Valor
  • Registratie: Mei 2005
  • Laatst online: 06-02 08:25

Valor

yummie spam

Topicstarter
sorry dat ik niet duidelijk was, maar de bean is stateful, en de sessie moet zijn data (tijdens de sesie) onthouden, dit doet hij niet.

ik weet dat voor echte data opslag de data in een database oid moet, maar dit is voor nu niet de bedoeling. hij moet nu gewoon data opslaan in de sessionbean

  • sparidem
  • Registratie: Januari 2004
  • Laatst online: 10-08-2025
Waarom stop je al die java code in een jsp pagina ? Welke applicatie server gebruik je en heeft die ondersteuning voor ejb's ?

Ik heb zelf geen ervaring meet ejb's, maar ik vraag me af of je niet middels configuratie of annotations aan moet geven dat het hier een ejb betreft.

Correctie: als je alles in een jsp stopt, wordt er onder water een servlet gemaakt. Die bevind zich in de web container, niet in de bean container. Ik kan me zo voorstellen dat hij dan ook niet wordt afgehandeld als een ejb.

[ Voor 31% gewijzigd door sparidem op 21-12-2005 16:15 ]


  • Casteloni
  • Registratie: November 2001
  • Laatst online: 20-04 20:02
Je moet de handle naar de remote of local interface van je sessionbean bijvoorbeeld in de Http Session scope plaatsen.

  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 18-03 09:04

jAnO!

lalalavanillevla

For persistence over de sessie hoef je niet perse gebruik te maken van session beans hoor, gewoon een simple bean op je sessie voldoet vaak prima.

Op zich zijn ejb's vaak overkill en kan je het prima zonder af.

edit:

O ja, haal eens rap al die code uit je jsp! arrghh arme designers
Tip: super boek:
Head First Servlets & JSP
(plug deze serie te pas en te onpas maar ze zijn gewoon goed)

[ Voor 33% gewijzigd door jAnO! op 21-12-2005 16:26 ]

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


Verwijderd

Ik heb zelf eigenlijk geen ervaring met J2EE, maar misschien heb je hier wat aan:
http://java.sun.com/j2ee/...let/http/HttpSession.html
In je JSP pagina bestaat een HttpSession genaamd "session".

  • Valor
  • Registratie: Mei 2005
  • Laatst online: 06-02 08:25

Valor

yummie spam

Topicstarter
sparidem schreef op woensdag 21 december 2005 @ 16:14:
Waarom stop je al die java code in een jsp pagina ? Welke applicatie server gebruik je en heeft die ondersteuning voor ejb's ?

Ik heb zelf geen ervaring meet ejb's, maar ik vraag me af of je niet middels configuratie of annotations aan moet geven dat het hier een ejb betreft.

Correctie: als je alles in een jsp stopt, wordt er onder water een servlet gemaakt. Die bevind zich in de web container, niet in de bean container. Ik kan me zo voorstellen dat hij dan ook niet wordt afgehandeld als een ejb.
ik snap je niet helemaal, maar wat ik zeker weet:
ik gebruik jboss 4.x en die ondersteunt sowieso EJB's
en al die java code staat in de jsp, omdat de jsp de bean moet opzoeken (dmv die naming)
vervolgens maak ik daar een instantie van aan, waar ik denk dat het op fout gaat is echter dit:
wanneer ik de 2de jsp pagina (of de eerste voor de tweede keer) aanroep, dan word er een nieuw object 'remote' gemaakt, en worden alle waardes dus weer de standaard waarde opgegeven in de klasse.

Maar de bedoeling is dus dat ik dezelfde data terug krijg.
ik heb 2 test jsp's gemaakt, die allebij dezelfde sessionbean gebruiken met daarin remote getters en setters voor een private string
in jsp 1 set ik dan die string, en in jsp 2 vraag ik hem op.
als ik de server dan bij zo'n getter/setter de waarde laat printen (system.out) dan zie ik in de server console bij de setter gewoon de correcte waarde staan, maar als ik dan in die andere pagina de getter aanroep zie ik 'null' staan.
jAnO! schreef op woensdag 21 december 2005 @ 16:18:
edit:
O ja, haal eens rap al die code uit je jsp! arrghh arme designers
en hoe moet het anders dan? je wilt toch zoeken in je JNDI? als je dit niet in je jsp doet, waar moet je het dan doen?

[ Voor 11% gewijzigd door Valor op 21-12-2005 16:37 ]


  • Casteloni
  • Registratie: November 2001
  • Laatst online: 20-04 20:02
Het is eigenlijk niet netjes om java code in de JSP pagina te plaatsen. Dit doe je eigenlijk in een Controller en vervolgens plaats je je objecten in de request scope en forward je naar de pagina.
Maar dat doet voor dit probleem niet echt ter zake, ik denk dit meer even een soort van test is.

Wat je nu doet is bij elke aanroep van de jsp pagina een nieuwe EJB Sessionbean aanmaken door middel van de create methode op de localhome interface. Dit moet je eigenlijk alleen de eerste keer doen:

Controleer of er een Local interface naar je Session Bean in de HttpSession scope is. Zo ja, haal deze interface op en ga verder. Zo nee, maak deze interface aan en ga verder. Plaats de zojuist aangemaakte interface in de session scope.
Ophalen van je local interface naar je Session Bean:
Java:
1
SessionLocal sessionLocal = (SessionLocal) session.getAttribute("session");

[ Voor 5% gewijzigd door Casteloni op 21-12-2005 16:42 . Reden: Session interface moet ook nog in HttpSession ]


  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 18-03 09:04

jAnO!

lalalavanillevla

en hoe moet het anders dan? je wilt toch zoeken in je JNDI? als je dit niet in je jsp doet, waar moet je het dan doen?
I've got two words for you!

M - V - C

Maw in je controller (servlet dus) van waaruit je forward naar je view (wich is jsp icm EL bijvoorbeeld)
Zie struts of Spring mvc.

edit:
net te laat

[ Voor 6% gewijzigd door jAnO! op 21-12-2005 16:45 ]

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


  • Valor
  • Registratie: Mei 2005
  • Laatst online: 06-02 08:25

Valor

yummie spam

Topicstarter
VampireSlayer schreef op woensdag 21 december 2005 @ 16:41:
Controleer of er een Local interface naar je Session Bean in de HttpSession scope is. Zo ja, haal deze interface op en ga verder. Zo nee, maak deze interface aan en ga verder. Plaats de zojuist aangemaakte interface in de session scope.
Ophalen van je local interface naar je Session Bean:
Java:
1
SessionLocal sessionLocal = (SessionLocal) session.getAttribute("session");
We kunnen wel controleren of er een Session bestaat
Java:
1
2
3
4
5
6
7
8
9
10
 if(session.isNew())
      {
       //Hier bestaat de session niet maak een remote aan
        remote = eh.create();
      }
      else
      {
      //Session bestaat hier haal bestaande remote op.
        remote = .........
      }


De vraag is nu alleen waar haal ik de instantie op van de remote die ik de vorige keer heb aangemaakt

  • Valor
  • Registratie: Mei 2005
  • Laatst online: 06-02 08:25

Valor

yummie spam

Topicstarter
Na wat aan te kloten krijg ik mijn instantie terug van het gewenste object.

Allemaal bedankt voor de hulp

Java:
1
2
3
4
5
6
7
8
9
10
 if(session.isNew())
      {
        remote = eh.create();
        session.setAttribute("remote",remote);
        %>Session bestaat niet<%
      }
      else
      {
        remote = (Enterprise1)session.getAttribute("remote");
      }

  • ikke_
  • Registratie: Juni 1999
  • Laatst online: 20-04 07:55
let er wel op dat stateful session beans een bepaald life time hebben (config ejb container). Deze moet langer zijn dan je web sessie time-out. Zorg er voor dat als de websessie verwijdert wordt de stateful session bean .remove() aangeroepen wordt.

Verwijderd

OMG! EJB's op een JSP pagina aanmaken! 8)7

Als ik zo heel snel je code scan dan heb je absoluut geen EJBs nodig, maar slechts 'gewone' beans.

Ten tweede kan dat wat je met die Java code op de JSP pagina doet echt niet meer hoor! Java code hoort in classes. Op een JSP pagina gebruik je HTML, taglibs (bv JSTL) en EL. Op deze manier lijkt het wel een PHP pagina. :X

Zoals hierboven al gezegd wordt, lees je eens in in "Model View Controller" concepten. Je zult zien dat die aanpak het allemaal een stuk beter beheersbaar maakt.

  • Valor
  • Registratie: Mei 2005
  • Laatst online: 06-02 08:25

Valor

yummie spam

Topicstarter
Het leuke was dat we EJB moesten gebruiken. Echter is de leraar zo lief geen uitleg te geven dus went ik mij maar tot de tweakers. Die mij met een paar zetjes in de goede richting prima hebben geholpen :)

[ Voor 1% gewijzigd door Valor op 22-12-2005 00:12 . Reden: typo ]


  • sparidem
  • Registratie: Januari 2004
  • Laatst online: 10-08-2025
En de leraar heeft geen uitleg gegeven over tree-tier architectuur en het MVC pattern ? Shame on him !

Elk fatsoenlijk Java/J2EE boek behandelt dit onderwerp. Het is de basis van J2EE, waar je hier dus mee bezig bent.

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
sparidem schreef op donderdag 22 december 2005 @ 07:52:
En de leraar heeft geen uitleg gegeven over tree-tier architectuur en het MVC pattern ? Shame on him !

Elk fatsoenlijk Java/J2EE boek behandelt dit onderwerp. Het is de basis van J2EE, waar je hier dus mee bezig bent.
allebij de termen zijn mij geheel onbekend (en ik zit ook in die les) echt jammer dat het zo'n slechte les is.
laatst een opdracht met entitybeans, erg leuk, zeker als je op een gegeven moment je EB aanpast en niet weet waarom je allemaal insert fouten krijgt..

goh je db past zich niet mee aan, moesten van een klasgenoot horen dat je de .sql file in de server dir moest gaan aanpassen om het te fixen :S

This message was sent on 100% recyclable electrons.


  • sparidem
  • Registratie: Januari 2004
  • Laatst online: 10-08-2025
Lees onderstaand linkje even door, er staan code voorbeelden bij. Basis patterns in J2EE applicatiebouw zijn Model View Controller en Data Access Objects.

Sun uitleg over een aantal patterns
Pagina: 1