JSP File Browser

moonie3

Mitglied
Hallo Java Gemeinde,
hab schon viel gesucht, aber komischerweise nicht wirklich etwas hilfreiches zu meinem Problem gefunden. Hoffe ihr könnt mir weiter helfen.

Ich habe ein Verzeichnis auf meinem Server (z.B d:\Dokumente).
Dieses Verzeichnis (mit sämtlichen Unterverzeichnisse und Dateien) möchte ich gerne
in einem TreeView (wie Windows Explorer) auf meiner JSP Seite darstellen.

Ich weiss, dass es von JQuerry ein TreeView plugin gibt. Dieses habe ich in einem anderen Context schonmal verwendet. Aber hier muss das TreeView plugin ja irgendwie mit den Verzeichnisdaten arbeiten.

Ich habe mir eine Java Klasse geschrieben, die mir den HTML Code (als String) für den Baum liefert.
Hier ein kleiner Ausschnitt.

Java:
package com.siemens.birt.utilities;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;

public class FileTree 
{
	private String _HTML_Tree = "";
	private File _directory = null;
	private FilenameFilter _filter = null;
		
	public FileTree(String dir)
	{
		this._directory = new File(dir);
	}
	
	public String getHTMLTree()
	{
		return generateHTMlTree(this._directory);
	}
	
	private String generateHTMlTree(File dir)
	{
		//FilenameFilter flt = new Filter(_filter);
		File[] files = dir.listFiles(this._filter);
		this._HTML_Tree = this._HTML_Tree +  "<ul>";
		for (int i = 0;  i < files.length; i++)
		{
			if (files[i].isFile())
			{
				// Es handelt sich um eine Datei
				this._HTML_Tree = this._HTML_Tree + "<li>" + files[i].getName() + "</li>";
			}
			else if (files[i].isDirectory())
			{	
				this._HTML_Tree = this._HTML_Tree + "<ul>";
				// Es handelt sich um ein Verzeichnis, 
				// dann ruft sich Funktion selber auf (rekursion)
				this._HTML_Tree = this._HTML_Tree + "<li>" + files[i].getName() +"</li>";
				this.generateHTMlTree(files[i]);
				this._HTML_Tree = this._HTML_Tree + "</ul>";
			}
		}
		
		this._HTML_Tree = this._HTML_Tree + "</ul>";
		
		return this._HTML_Tree;
	}
	
	private void setFileFilter(String flt)
	{
		this._filter = new Filter(flt);
	}
	
	}

Das Manko ist, dass ich Die Verzeichnisse nicht richtig sortiert bekomme. Die Methode listFiles liest wohl Ordner immer zum Schluss ein :(
Bin da völlig ahnunglos, wie ich meinen lokalen Verzeichnisbaum vernünftig abbilden kann.

Irgendwo habe ich auch gelesen, dass es besser wäre Dateien und Ordner separat zu behandeln.
Aber das verstehe ich nicht wirklich. Woher wissen dann die Dateien zu welchen Ordner sie gehören?

Kann mir bitte jemanden ein paar Hinweise bzw. Tips geben? Codeschnipsel wären auch nicht schlecht ;)

Evtl. gibt es noch eine ganz andere Lösung (evtl. gibt es ja schon ein Javascript plugin welches ein Verzeichnis darstellt.)

Vielen Dank schonmal im voraus!

Viele Grüße,
Moonie
 

freez

Top Contributor
Grundsätzlich möchte ich dir empfehlen von JSP weg zu kommen, sowie es dir möglich wäre. Nimm JSF 2 und vielleicht noch eine Erweiterung wie Primefaces / RichFaces oä. Die Beispiele dort sollten hilfreich genug sein, um deinen Baum zu erstellen.
 

JimPanse

Bekanntes Mitglied
mmm wie wäre es Rekursiv zu machen, dann sollte auch die Reihen folge stimmen (nicht getestet aber sollte funzen):

Java:
	public void list(File aFile) {
		for (File file : aFile.listFiles()) {
			if (file.isDirectory()) {
				list(file);
			} else {
				// hinzufügen
			}
		}
	}
public void generateHTMLTree() {
	File file = new File(System.getProperty("user.dir")); 
	list(file);
}
 

Templarthelast

Bekanntes Mitglied
Ich halte ein direktes Abbilden der Dateisystemstruktur für den falschen Ansatz. Stattdessen würde ich einen Systemeigenen Dienst ausführen, welcher die Dateistruktur in xml bzw. in einer Datenbankabbildet, ohne direkt mit deinem Applicationserver auf das Dateisystem zugreifen zu müssen.
 

moonie3

Mitglied
Hallo Zusammen,
erstmal danke für euere schnellen Antworten und Ansätze.

@freez: Ich kenne leider nur jsp. Habe noch nie was mit JSF gemacht :(. Aber mal schauen.

@JimPanse: Meine Methode ist doch rekursive (generateHtmlTree ruft sich selber mit einem neuen File Objekt auf).
Das Problem ist aber, dass die ListFiles() Methode vom File Objekt wohl zuerst alle Dateien auflistet und dann erst Verzeichnisse.

@Templarhelast: Habe mir das auch schon überlegt die Verzeichnisstruktur über die DB (bei mir Oracle) abzubilden. Aber dafür muss ich ja das Verzeichnis auch in die richtige Reihenfolgeg in die DB schreiben. Was meinst du eigentlich mit einem 'systemeigenen Dienst'? Meinst du dass der Dienst (z.B Dienst in Java bzw. C# programmiert) im Hintergrund läuft und wenn sich am Verzeichnis was ändert die DB aktualisiert wird ?

Thx!

Viele Grüße,
Moonie
 

JimPanse

Bekanntes Mitglied
@JimPanse: Meine Methode ist doch rekursive (generateHtmlTree ruft sich selber mit einem neuen File Objekt auf).

sehe ich jetzt erst:oops:


Das Problem ist aber, dass die ListFiles() Methode vom File Objekt wohl zuerst alle Dateien auflistet und dann erst Verzeichnisse.
e

Davon steht nichts in der doc listFiles()

so sollte es gehen:

Java:
StringBuilder hmtlTree; 
  private void generateHTMlTree(File dir)
    {
	    this.hmtlTree.append( "<ul>" );
	    for(File file : dir.listFiles()) {
	    	if(file.isDirectory()){
	    		generateHTMlTree(file);
	    	} else {
	    		hmtlTree.append("<li>").append(file).append("</li>");
	    	}
	    }
	    this.hmtlTree.append( "</ul>" );
    }

public String getHTMLTree()
    {
hmtlTree = new StringBuilder();
generateHTMlTree(this._directory);
        return hmtlTree toString();
    }
 

moonie3

Mitglied
Jetzt habe ich es mal mit dem vorgeschlagenen Quellcode von JimPanse probiert, aber das ist ja das gleiche.
Ist nicht viel Unterschied zu meinem ersten Versuch.

Habe folgende Verzeichnisstruktur:

Code:
01
  01 
    01
    02
    text01.txt
    text02.txt
  02
02
  01.txt
  Kopie von 01.txt
01.txt
02.txt


Und machen tut er leider folgendes daraus:

D:\reports\01\text01.txt
D:\reports\01\text02.txt
D:\reports\01.txt
D:\reports\02\01.txt
D:\reports\02\Kopie von 01.txt
D:\reports\02.txt

Also er liest wohl zuerst das Verzeichnis 01 mit den Dateien. Dann liest er eine Datei im Rootverzeichnis dann kommt Verzeichnis 02 inclusive Inhalt und dann die letzte Datei im Rootverzeichnis.
Also sortiert wohl doch irgendwie alphabetisch durch die Verzeichnisse. Kann man die Sortierung irgendwie ändern oder was muss ich tun um mein Verzeichnis richtig abzubilden? Es müssen halt zuerst alle Verzeichnisse durchlaufen werden.
Thx!
 

JimPanse

Bekanntes Mitglied
Die Verzeichnisse wurden noch nicht mit ausgegeben...

Java:
public class Testdriver {

	final String directory;
	StringBuilder hmtlTree;

	/**
	 * Create a new Testdriver instance.
	 * 
	 * @param directory
	 *          to display.
	 */
	public Testdriver(String directory) {
		super();
		this.directory = directory;
		hmtlTree = new StringBuilder();

		generateHTMlTree(new File(directory));
	}

	private void generateHTMlTree(File dir) {
		hmtlTree.append("<ul>");
		for (File file : dir.listFiles()) {
			
			hmtlTree.append("<li>").append(file).append("</li>\n");
			if (file.isDirectory()) {
				
				generateHTMlTree(file);
			} 
		}
		hmtlTree.append("</ul>");
	}

	public String getHTMLTree() {
		return hmtlTree.toString();
	}

	public static void main(String... args) {
		System.out.println(new Testdriver(System.getProperty("user.dir")).getHTMLTree());
	}
}
 
Zuletzt bearbeitet:

moonie3

Mitglied
Ja. Das ist richtig. Ich lasse mir jetzt auch das Verzeichnis ausgeben.
Aber die Reihenfolge stimmt ja trotzdem nicht.

Wenn ich jetzt natürlich nur in letzten Verzeichnisse der Hirachie Dateien rein lege, dann passt es ja.
Die Methode listFiles() listet halt Verzeichnisse und Dateien alphabetisch auf und nicht, dass zuerst Verzeichnisse und dann Dateien aufgelistet werden (wie es normalerweise üblich ist).
Wie kann ich das ändern? Über einen Comparator? Und wenn ja gibt es da schon Beispiele ?

Thx!

Viele Grüße,
Moonie
 

JimPanse

Bekanntes Mitglied
Ja. Das ist richtig. Ich lasse mir jetzt auch das Verzeichnis ausgeben.
Aber die Reihenfolge stimmt ja trotzdem nicht.

???:L Bei mir stimmt die Reihenfolge ???:L

listFiles
There is no guarantee that the name strings in the resulting array will appear in any specific order; they are not, in particular, guaranteed to appear in alphabetical order.

eventuell:
filevisitor-unter-java-7-mit-nio-2/


oder
verzeichnisse-durchsuchen-bearbeiten-auslesen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H File Output Servlet Web Tier 6
H Applet wirft AccessControlException bei File von Servlet Web Tier 3
A Servlet File Upload funktioniert nur lokal auf Entwicklungsrechner, nicht in Tomcat Web Tier 5
N File empfangen Web Tier 3
M File aus Projektverzeichnis laden Web Tier 16
R Download JSP-File/Script Web Tier 3
L File Upload - Dateiformat einschränken Web Tier 4
N is out of sync with file system Web Tier 2
S Servlet File Upload (API oder JSPSmart download) Web Tier 4
reibi Konfiguration ausserhalb vom WAR-File Web Tier 7
W Java code aus JSP-File durch JSTL code ersetzen Web Tier 8
R File Einlesen mit jsp/servlets Web Tier 11
hdi File Upload erst nach Prüfung Web Tier 4
E Jsp file upload Web Tier 3
D welcome-file in web.xml Web Tier 3
O eine .do-File als welcome-file im web.xml Web Tier 4
E File upload mit jsp (frage zum speicherort) Web Tier 12
X Properties-File und relative Pfadangaben Web Tier 5
S JSP File Download (SVNKit) Web Tier 11
I Country von Browser bekommen Web Tier 7
J mehrere browser-tabs gleichzeitig Web Tier 11
H JSF JSF 2.0 (Primefaces) commandLinks mit action="mypage.xhtml" ohne die URL im Browser zu ändern Web Tier 8
I Servlet vor Browser URL-Direktzugriff schützen Web Tier 3
E JSP Browser Tab Session Web Tier 7
H JSF - falsche HTTP-Adresse im Browser Web Tier 8
J Browser-Client von Server aus ansprechen Web Tier 7
R JSF und Browser Refresh Web Tier 7
J location response-header? Browser-Back-Button "deaktivieren" Web Tier 9
M Generierte Datei an Browser senden Web Tier 8

Ähnliche Java Themen

Neue Themen


Oben