WinFuture-Forum.de: Servletcontextlistener Problem - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Servletcontextlistener Problem Java


#1 _Lofwyr_

  • Gruppe: Gäste

geschrieben 05. Mai 2005 - 21:15

hoi,

also es geht um den ServletContextListener. Soweit wie ich das verstehe kann man damit unteranderem code ausführen bevor der erste request ausgeführt wird.
Entweder ich habe einen total falschen ansatz oder sehe den wald vor lauter bäumen nicht mehr.

das ist die web.xml
<web-app>

	<listener>
  <listener-class>
 	 app.Listener
  </listener-class>
	</listener>

</web-app>


die listener class
package app;
import javax.servlet.*;

public class Listener implements ServletContextListener{

 public void contextInitialized(ServletContextEvent arg0) {
  ServletContext scontext = arg0.getServletContext();
   Z test = new Z();
   test.start();
  }

 public void contextDestroyed(ServletContextEvent arg0) {
 }

}


und der thread der eigentlich gestartet werden soll
ackage app;
import java.util.Vector;

public class Z extends Thread{
	public void run(){
  
 // irgendwann kommt hier eine ausgabe an der konsole
 // z.B. System.out.print("Ausgabe");   
        }
}


leider kommt keine ausgabe und auch keine fehlermeldung - das ganze in eclipse 3.0(sysdeo 3.0 plugin) / j2sdk 1.4.2 / tomcat 3.0.27
wenn einer rat weiß... immer her damit :(

danke schonmal

gruss


//Edit mist - vergeßt es - man sollte auch die web.xml aus dem richtigen projekt editieren :(

Dieser Beitrag wurde von Lofwyr bearbeitet: 06. Mai 2005 - 16:34

0

Anzeige



#2 _Lofwyr_

  • Gruppe: Gäste

geschrieben 06. Mai 2005 - 18:35

ok - noch ein verständnisproblem

in der web.xml kann man mittels
  <context-param>
 	 <param-name>Name</param-name>
 	 <param-value>Value</param-value>
  </context-param>


Parameter ablegen auf die man innerhalb der application zugreifen kann.
der Zugriff mit dem ContextListener klappt auch.
Nur müßte man doch eigentlich auch aus anderen klassen heraus auf diese parameter zugreifen können!?
in meinem beispiel wäre dies der fall mit der klasse Z

ein zugriff mit getServletContext() klappt aber nicht.
methode ist ncht definiert - habe ich in der Sache einen Denkfehler?!

gruss

Dieser Beitrag wurde von Lofwyr bearbeitet: 06. Mai 2005 - 18:35

0

#3 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 06. Mai 2005 - 19:54

Zitat

ein zugriff mit getServletContext() klappt aber nicht.
methode ist ncht definiert - habe ich in der Sache einen Denkfehler?!


Oh ja, sehr sogar. Z enthält die Methode doch nicht, und kennt auch kein Objekt, welches die Methode hat. Lösung: Constructor von Z ein solches Objekt übergeben und lokal verwenden.

 public void contextInitialized(ServletContextEvent arg0) {
 // ServletContext scontext = arg0.getServletContext();
  Z test = new Z(arg0);
  test.start();
 }

[...]

public class Z {
  protected ServletContextEvent myContextEvent;

  public Z(ServletContextEvent s) {
     myContextEvent = s;
  }

  public void do_something() {
    ServletContext foobar=null;
    if (myContextEvent != null) {
      foobar =myContextEvent.getServletContext();
    }
    blah(foobar);
  }
  [...]
}


Zu deinem anderen Problem: k.A, macht es das überhaupt wirklich? Der Code ist ja soweit korrekt.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#4 _Lofwyr_

  • Gruppe: Gäste

geschrieben 06. Mai 2005 - 21:03

Danke schonmal für die Antwort.

hm - so ganz steig ich noch nicht hinter.
die Parameter in dem Deployment Descriptor sind doch Context Parameter und auf die sollte doch eigentlich ein Lesezugriff innerhalb der Application von überall möglich sein
also auch von meiner klasse Z aus?!


Sinn der ganze Sache.
Ich habe die Application die gestartet wird.
Mit dem Start der App wird auch ein Thread über den Listener gestartet der bis zu einem bestimmten Datum still steht.
Dieses Datum möchte im Descriptor festlegen um flexibel zu sein.
Jetzt muss ich natürlich irgendwie an dieses Datum kommen und meinem Verständnis nach müßte ich das eigentlich auch, da man innerhalb der App von überall auf die Context Parameter zugreifen kann.
Bei deiner Lösung baust du vorher einen Konstruktor der einen ServletContextEvent erwartet. Damit machst du im Prinzip aber eine 'manuelle' Übergabe oder nicht!?

ContextParameter im Descriptor=ApplicationScope=ServeltContext-Objekt der App?
//EDIT hier liegt glaub ich der denkfehler
//den applicationScope sollte/kann man mit dem ContexTListener initialisieren und
//aufn diesen hat man dann überall zugriff

Ich glaub ich habe da irgendwo immer noch ein ziemlich dicken denkfehler drin.


Das Problem im ersten Post ist quasi gelöst. Der Code war richtig, nur habe ich die ganze Zeit in dem Descriptor eines anderen Project rumgefummelt.
Der Code macht nun einfach, das beim Start der Application ein Thread gestartet wird, welche auf ein bestimmtes Ereignis wartet.

gruss

Dieser Beitrag wurde von Lofwyr bearbeitet: 06. Mai 2005 - 21:15

0

#5 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 06. Mai 2005 - 21:58

Zitat

Die Parameter in dem Deployment Descriptor sind doch Context Parameter und auf die sollte doch eigentlich ein Lesezugriff innerhalb der Application von überall möglich sein also auch von meiner klasse Z aus?!

Ist Z statisch von der anderen Klasse abgeleitet oder ist es eine Unterklasse? Wenn nein, dann hast du zwar Sichtbarkeit, aber schlicht und ergreifend kein Referenz.

Zitat

Bei deiner Lösung baust du vorher einen Konstruktor der einen ServletContextEvent erwartet. Damit machst du im Prinzip aber eine 'manuelle' Übergabe oder nicht!?

Richtig, Referenzen muss man mitteilen.

Zitat

ContextParameter im Descriptor=ApplicationScope=ServeltContext-Objekt der App?
//EDIT hier liegt glaub ich der denkfehler
//den applicationScope sollte/kann man mit dem ContexTListener initialisieren und
//aufn diesen hat man dann überall zugriff
Ich glaub ich habe da irgendwo immer noch ein ziemlich dicken denkfehler drin.


Ja. Es besteht ein Unterschied zwischen Sichtbarkeiten und Referenzen.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#6 _Lofwyr_

  • Gruppe: Gäste

geschrieben 06. Mai 2005 - 22:26

hmhmhm
ok - funzt wunderbar

hab noch 1-2 knackpunkte aber das hängt nicht direkt mit dem servletcontext zusammen.

thx rika.

Dieser Beitrag wurde von Lofwyr bearbeitet: 06. Mai 2005 - 22:34

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0