JavaBean neu laden?

Z

Zak256

Hallo!

Ich arbeite mich gerade durch die vielen JSP-Möglichkeiten und habe leider häufig Probleme, an denen ich lange suchen und probieren muss. Jetzt habe ich diese Seite gefunden und hoffe hier öfter mal Hilfe zu bekommen.


Kurzfassung meiner Frage: Wie kann ich meinem Webserver sagen, dass er ein JavaBean neu instantiieren soll?

Langfassung meiner Frage:
Ich erstelle derzeit eine Webseite, in der Inhalte aus einer XML-Datei angezeigt werden sollen. Zum Auslesen der XML-Datei verwende ich dom4j und erstelle dann in meiner jspx-Seite ein JavaBean, das auf die Inhalte zugreift. Soweit funktioniert das auch...ABER:

Jetzt habe ich festgestellt, dass die XML-Datei offensichtlich einmal bei Erstellung des Servlets eingelesen wird. Wenn jetzt im Anschluss daran Änderungen in der XML-Datei vorgenommen werden, schaffe ich es nicht, diese (z.B. durch Reload im Browser oder einen kompletten Neuaufruf der Seite) auch sichtbar zu machen.

Wie kann ich die XML-Datei neuladen?


Danke im Voraus,
Zak256
 
Mal ne Frage:
ist das Servlet, welches die XML-Datei liest, eines dessen Code Du selbst geschrieben und unter Kontrolle hast, oder ist es das was aus dem JSP-Procedere generiert wurde?
 
Mal ne Frage:
ist das Servlet, welches die XML-Datei liest, eines dessen Code Du selbst geschrieben und unter Kontrolle hast, oder ist es das was aus dem JSP-Procedere generiert wurde?

In meiner jspx-Seite wird ein Bean erstellt, dem dann eine Datei zugewiesen wird:
Code:
<jsp:useBean id="xmlreader" class="MeinXMLReader" scope="session" />
<jsp:setProperty name="xmlreader" property="file" value="http://${pageContext.request.remoteHost}:${pageContext.request.localPort}${pageContext.servletContext.contextPath}/${param.file}" />


Die Klasse MeinXMLReader habe ich selbst geschrieben und sie liest den Code mit getFile wie folgt ein (die XML-Funktionen kommen wie gesagt von dom4j):
Code:
public void setFile(String filename) throws Exception {
        reader = new SAXReader();
        this.filename = filename;
        try {
            doc = reader.read(filename);
        } catch (DocumentException e) {
            System.err.println(e);
        }
        root = doc.getRootElement();
}

Vielleicht gibt es auch einen eleganteren Weg soetwas zu lösen, auch da bin ich für Tipps dankbar.
 
Hi,

Du musst nicht die XML neu laden, sondern kannst Deinem Controller sagen,
dass er die Bean ersetzen bzw. Attribute ändern soll.

Das kannst Du für Command Classes (z.B. Form Backing Beans) genau so tun, wie für 'normale' Spring-Beans.

Desweiteren kannst Du Deine Klassen mit selbst hierfür definierten Funktionen anweisen, etwas z.B. neu zu laden.

Achtung: InputStreams werden gecacht.
Ein einfaches "read()" reicht dann nicht.
Du musst noch ein "openStream()" anhängen (bei InputStreams).

Gruß Tim
 
Ich habe mir schon gedacht, dass ich irgendwie das Bean anweisen muss, sich neu zu laden. Ich weiss jedoch nicht wie.

Ich hatte gestern schon eine Methode geschrieben, die ich mit getProperty aufgerufen hatte und die mein Dokument löscht und mit einem neuen SAXReader neu einliest, ohne Erfolg.
(Wobei getProperty hier ja auch eigentlich unschön ist, da ich keine Property haben will sondern nur eine Aktion ausführen will...was wäre denn hier zu benutzen?)


Gerade habe ich nun nochmal folgende Methode in MeinXMLReader geschrieben:
Code:
public void Reload() {
        doc.clearContent();
        SAXReader reader = new SAXReader();
        try {
            doc = reader.read(filename);
        } catch (DocumentException e) {
            System.err.println(e);
        }
        root = doc.getRootElement();
}

Diese Methode lasse ich dann mit einem Skriptlet ausführen. Änderungen in der XML-Datei werden aber weiterhin nicht übernommen. Was mache ich denn falsch?
 
...vermutlich hast Du schon in Deinem Controller eine Variable, sowie eine Setter Methode für die Bean manuell hinzugefügt.

Dann könnte man im Controller z.B. sagen:

myBean.setAttributeXML( MyReader.readXML() );

D.h. Deine Bean würde ein Attribut enthalten welches Du mit
Code:
setAttributeXMLReader( foo )
setzen könntest.

Deinem Reader (nenne ich mal so) gibst Du einfach den Befehl
Code:
readXML()

Natürlich musst Du in der entsprechenden Methode definieren, was er wo einlesen soll...

Gruß Tim
 
Hi Tim,

ja genau so ähnlich habe ich es ja gemacht. Es gibt die Methode "setFile" (siehe oben) bei der die XML-Datei eingelesen wird, und das funktioniert auch.

Wenn ich dann aber eine Änderung in der XML-Datei vornehme, den Browser schließe, dessen Cache lösche, ihn neustarte und die Seite neu aufrufe, wird immer noch die alte XML-Datei angezeigt.

Erst wenn ich in meinem NetBeans das Projekt neu starte ist auch die Änderung sichtbar.
 
Hi,

wenn Du einen InputStream aufmachst, wird der gecacht.
Liegt es evtl. daran?

Dann müsstest Du nochmal ein openStream() anhängen.
Code:
        connection = url.openConnection();
	connection.connect();	
	
	DataInputStream theStream = new DataInputStream(url.openStream());

openConnection() reicht da nicht aus...
 
Zuletzt bearbeitet:
Das mache ich ja gar nicht direkt sondern nur über die dom4j-Funktion
Code:
SAXReader reader = new SAXReader();
Document doc = reader.read(filename);
Danach kann ich dann die XML-Daten aus doc auslesen.

Vielleicht kann/muss ich dort irgendwo noch einen Parameter eingeben, so dass die Daten nicht aus dem Cache gelesen werden?

Edit: Ich frage mich allerdings, warum da etwas gecached wird, da der komplette Reader doch neu instantiiert wird bei einem Aufruf der Methode...ich vermute da wird irgendwie die ganze Seite gecached und die Methode zum einlesen der Datei gar nicht neu aufgerufen.
 
Zuletzt bearbeitet von einem Moderator:
Hi,

was ich jetzt sage ist eine Vermutung: Neu instantiziieren ist kein Garant dafür, dass kein Caching erfolgt. Wie das en detail aussieht, weiss ich aus dem Stand bei dom4j nicht. Müsstest Du dir mal ansehen (habe leider nicht genug Zeit heute).
Streams werden aber gerne mal gecacht. Bei dom4j hatte ich persönlich aber noch kein vergleichbares Problem...

Wenn Du was herausfindest, poste es dochmal.

Gruß Tim
 
Zurück