Avatar billede stringbuffer Nybegynder
19. marts 2003 - 11:33 Der er 12 kommentarer og
1 løsning

Hvordan virker en servlet?

Bliver der oprettet en ny instans af servlet-klassen ved hver ny request? Eller er det samme instans, der håndterer alle requests? Hvornår kaldes init()? Hvordan skal man behandle medlemsvariablene i servletklassen, skal de betragtes som data, der deles mellem tråde eller data, der er privat for en tråd?
Avatar billede medions Nybegynder
19. marts 2003 - 11:40 #1
Avatar billede arne_v Ekspert
19. marts 2003 - 11:45 #2
Jeg tror du vil finde følgende artikel interessant:

http://www.jguru.com/faq/view.jsp?EID=150
Avatar billede arne_v Ekspert
19. marts 2003 - 11:49 #3
Men altså kort sagt, så er der kun en instans, og init er kun kaldt en gang
ved startup og service metoderne kaldes af multiple tråde i parallel.

Hvis du har klasse medlems variable, så skal du synkronisere adgang.

Men iøvrigt bruger man relativt sjældent klasse medlems variable
i servlets.

Variable inden i metoder er selvfølgelig helt uproblematiske, da de
er lokale per tråd.
Avatar billede stringbuffer Nybegynder
19. marts 2003 - 12:25 #4
Her er idéen:

Når init kaldes, laver jeg en instans af den HTML-skabelon, der skal bruges til response.
I min doGet/doPost laver jeg en kopi af den tidligere oprettede instans, derved slipper jeg for at læse filen igen og scanne den.

I en metode, der kører periodisk (?) tjekker jeg om skabelonfilen er blevet ændret, hvis ja, skal den genindlæses i "master" kopien. (kan man evt. bruge destroy() til det)?

Jeg går ud fra at jeg kan lave mit skabelonobjekt synchronized?
Avatar billede arne_v Ekspert
19. marts 2003 - 13:10 #5
Lyder som en god ide at cache skabelonen fra kald til kald.

Læsning i init og clone i metoder burde virke.

Og jeg vil endda tro, at der ikke vil blive kaldt nogen
metode før init er færdig => det burde ikke engang være nødvendigt at
synchronize.

[check det !]

Det er ikke hverken nemt elller pænt at lave en tråd der står
og checker om filen har ændret sig.

destroy bliver kaldt når applikationen lukke rned og er næppe
relevant.

Jeg ville nok lave det som:
  en singleton der læse fil i constructor
  en user servlet der finder singleton og henter skabelon fra den
  en admin servlet der finder singleton og beder den opdatere far disk

Så når man retter i filen, så kalder man lige admin servletten
for at opdatere.

Ikke så elegant som fuld automatik, men nemt at implementere sikkert.
Avatar billede stringbuffer Nybegynder
19. marts 2003 - 13:36 #6
LOL, hvad er en singleton?
Undskyld minuvidenhed....
Avatar billede stringbuffer Nybegynder
19. marts 2003 - 13:38 #7
Ellers er det måske ikke det værd at cache... det tager alligevel under 1 ms at læse filen og scanne indholdet samt konstruere data...
Avatar billede arne_v Ekspert
19. marts 2003 - 13:43 #8
Hvis det er high load kan det godt være værd at cache.
Avatar billede arne_v Ekspert
19. marts 2003 - 13:47 #9
En singleton er et GoF Pattern som i Java kan se ud som:

public class X {
  private static X instance = new X();
  private X() {
  }
  public static getInstance() {
      return instance;
  }
  // methods
}

eller:

public class X {
  private static X instance = null;
  private X() {
  }
  public static getInstance() {
      if(instance == null) instance = new X();
      return instance;
  }
  // methods
}

eller:

public class X {
  private static X instance = null;
  private X() {
  }
  public synchronized static getInstance() {
      if(instance == null) instance = new X();
      return instance;
  }
  // methods
}
Avatar billede arne_v Ekspert
19. marts 2003 - 13:50 #10
Og man laver så:
  X myx = X.getInstance();
og bruger myx og uanset hvormange der kalder, så vil de alle
sammen referere til samme objekt.
Avatar billede arne_v Ekspert
19. marts 2003 - 13:51 #11
Og fordi constructor er private så får man fejl på:
  X myx = new X();
Avatar billede stringbuffer Nybegynder
19. marts 2003 - 14:33 #12
Det ligner lidt noget, jeg har set, som hedder factory....
Avatar billede arne_v Ekspert
19. marts 2003 - 14:37 #13
Lidt ja.

Men det der gør singleton speciel er at den altid returnerer
det samme objekt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester