Announcement

Collapse
No announcement yet.

I/O in Servlet

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • I/O in Servlet

    hi alle!

    habe folgendes problem: ich möchte Files (html) über ein servlet im .war archive der anwendung einlesen bzw. schreiben. allerdings wird das file wenn man keinen pfad angibt immer im bin ordner des servers (JBOSS) gespeichert und man kann in der webapp (JSF) nicht darauf zugreifen...

    weis jemand wie man files innerhalb eines .war archives einlesen bzw. schreiben kann?

    mfg manuel

  • #2
    Hallo Manuel,

    grundsätzlich beziehen sich alle realtiven Pfadangaben immer auf das Verzeichnis, aus dem heraus die virtuelle Maschine gestartet wurde. Deswegen findest Du die Dateien auch im bin-Verzeichnis des JBoss, in dem das Startskript für den Server liegt.

    Das Einlesen von beliebigen Dateien in einem WAR-File ist eigentlich kein Problem. Das kann man relativ einfach z.B. über den ClassLoader realisieren. Schau Dir dazu mal die JavaDocs für ClassLoader.getResource() an (hier).

    Schreiben in das WAR-File ist eine andere Geschichte... Warum sollte man das wollen? Normalerweise wird eine J2EE-Anwendung "offline" entwickelt und zusammengepackt und dann im Appserver deployed. Alle Resourcen, die die Benutzer der Anwendung erzeugen, gehören nicht in die Codebasis (hier im Sinne von Basisverzeichnis der Anwendung) sondern in eine Datenbank, ein Java Content Repository oder in ein externes Verzeichnis. Nur dann wird Deine Anwendung stabil und vor allem sicher sein. Außerdem: Irgendwie willst Du diese von Deinen Benutzern erzugten Dateien ja auch behalten, wenn Du mal eine neue Version der Anwendung einspielst. Wenn die Dateien irgendwo in den temporären Ordnern des Appservers oder gar im WAR-File liegen, machst Du Dir mehr Arbeit als notwendig oder verlierst die Dateien im Zweifel.

    Zu Deinem konkreten Problem der von den Benutzern erzeugten HTML-Dateien wäre die sicherlich einfachste und portabelste Lösung die folgende:

    1. Speichern der Dateien in einem externen Verzeichnis.
    2. Anzeigen der Dateien über ein Servlet, welches die Dateien aus diesem Verzeichnis anhand ihres Namens lädt.

    Damit 1. möglichst portabel ist, könntest Du z.B. zunächst über System.getProperty() den Pfad zum Home-Verzeichnis des Benutzers unter dem der Appserver läuft herausfinden (Key: "user.home"). Auf Windows XP landest Du dann in C:\Dokumente und Einstellungen\<Benutzername>, auf Unix-Systemen unter /home/<Benutzername>. Daran hängst Du noch einen anwendungsspezifischen String an:

    Code:
    String basePath = System.getProperty("user.home") + "/MyAppData";
    Vor jedem Schreibzugriff musst Du natürlich prüfen, ob das Verzeichnis existiert und es im Zweifel erzeugen. Dort kannst Du dann die Dateien speichern.

    Noch einfach wäre es natürlich, den Pfad fest im Code zu verdrahten. Wenn Deine Anwendung dann allerdings mal auf einem anderen Betriebssystem landet, musst Du den Pfad manuell anpassen.

    Zum Anzeigen der Dateien bietet sich ein Servlet an, welches unter /context-name/servlet-name eingebunden wird. Die Aufruf-Parameter kannst Du dann so aufarbeiten, dass Du z.B. mit der URL /context-name/servlet-name/datei-name.html die Datei <Benutzer-Heimatverzeichnis>/MyAppData/datei-name.html lädst und anzeigst. Damit ersparst Du Dir hässliche URLs wie /context-name/servlet-name?file=datei-name.html.

    Gruß
    Hendrik

    Comment


    • #3
      hi hendrik!

      danke für deine antwort, stimmt eigentlich das mit dem .war file! habs jez so mit dem externen dateien gemacht nur das einzige problem dabei ist das ich ja nicht das ursprungsverzeichnis (zb. bin bei JBoss) des jeweiligen webservers kenne?!

      mfg manuel

      Comment


      • #4
        Ich weiß zwar nicht, wozu Du diese Pfade jetzt noch brauchst, aber versuchs mal mit der System-Property "jboss.home.dir" (=Basispfad der JBoss-Installation).

        Gruß
        Hendrik

        Comment

        Working...
        X