# JSP & Co. in WEB-INF oder daneben?



## TSH (9. Jul 2008)

Momentan ist der Sourcecode meines Servlets so aufgebaut (*fett* = Ordner):

-- *war*
-- -- *css*
-- -- *images*
-- -- *javascripts*
-- -- *META-INF*
-- -- *WEB-INF*
-- -- -- *classes* (für log4j.properties)
-- -- -- *jsp*
-- -- -- *szenarios* (XML-Dateien)
-- -- -- my-servlet.xml (Spring-Konfigurationsdatei)
-- -- -- *springbeans* (weitere Spring-Konfigurationsdateien)
-- -- -- tiles.xml (Config-Datei für das Zusammenspiel der JSP-Bausteine)
-- -- -- web.xml

Ich frage mich gerade, ob dieser Aufbau "sauber" ist oder ob einige der WEB-INF Unterverzeichnisse nicht eine Ebene höher besser aufgehoben wären. Was meint Ihr?


----------



## maki (9. Jul 2008)

Wenn du die JSPs unter WEB-INF ablegst, darf der Client nicht direkt darauf zugreifen, sondern nur ein Servlet, eine schöne MVC Architektur + Sicherheit sind das Ergebnis.

Ist aber nicht immer ganz trivial, zB. darf dann die index.jsp nicht unter WEB-INF liegen.


----------



## TSH (9. Jul 2008)

Vielen Dank! Und wie sieht's mit diesen Szenario-Config-Dateien aus? Ich hab symbolisch nur einen Ordner hier angezeigt, aber es sind schon mehrere, auf die das Servlet lesend und schreibend zugreifen muss. Einige Dateien sollen auch an ein Applet beim Client gesendet werden.


----------



## maki (9. Jul 2008)

Laut Spek. darf kein Client auf WEB-INF zugreifen, sondern nur die WebApp selbst (Servlets etc.).

Classpath resourcen (zB. log4j.properties, commons-logging.properties, etc. pp.) gehören nach WEB-INF/classes.

Kenne die szenaria-config nicht, k.A. wer die auswertet bzw. wo diese liegen muss.

Normalerweise werden JSPs nicht unter WEB-INF abgelegt, ist einfacher.


----------



## TSH (9. Jul 2008)

Ich möchte das halt halbwegs standardkonform halten: Also denk ich mir, es sollte alles raus aus WEB-INF, was da nichts drin zu suchen hat.

Stell Dir ein Szenario beispielsweise so vor:

```
<country>
  <name>Germany</name>
  <capital>Berlin</capital>
<country>
<country>
  <name>Italy</name>
  <capital>Rome</capital>
<country>
...
```
Also echt nichts wildes. Das muss dann eine Java-Klasse beim Servlet-Start auslesen und ggf. später wieder zurückspeichern.


----------



## maki (9. Jul 2008)

Der Standard gibt beide Möglcihkeiten, wobei JSPs unter WEB-INF möglich sind, normalerweise ist das aber nicht nötig.
Wie gesagt, es wird Umständlicher.

Wenn eine Java Klasse es lesen soll, sollte es unter WEB-INF/classes liegen, wenn es ein Servlet liest, kann es überall liegen, allerdings ist schreiben unter WEB-INF/classes nicht so dolle.


----------



## BjörnBu (17. Jul 2008)

Da mir das Ganze sehr nach Spring MVC aussieht, sind die jsp's perfekt unter WEB-INF aufgehoben. Der ViewResolver sucht und findet genau da. ich denke an deinem AUfbau gibt es nichts weiter auszusetzen. Eins hätte ich selbst anders gemacht:

Ich würde target bzw outout von den sources trennen. Ich persönlich hab mir das maven layout angewöhnt

src/main/java (echter source code)
src/main/resources (alle arten von config files. Default mäßig kopiert maven beim war-target dann alles mit den selben unterordnern/packages nach WEB-INF/classes)
src/main/webapp (hier liegt der WEB-INF ordner und WEB-INF jsp's)
src/main/xxx (t.B. src/main/aspect für Aspekte usw) 

beim bauen erstellt maven dann einen target ordner und baut alles als war und war-expanded (aka exploded) wunderbar da rein. Hat den großen vorteil, dass ich den target ordner löschen, kopieren usw kann. Vor allem wenn config Datein in packages ablegen will / muss kann es sinst extrem störend werden.

Wer kein Maven nutzt kann sich natürlich gerne eine eigene Struktur überlegen und hinterher mit ant in die richtigen Ordner kopieren.

PS: Zu deinem jetzigen Layout nochmal. Es ist also völlig ok. Die index.jsp kommt dann (als einzige jsp) außerhalb von WEB-INF und redirected zur URL des Controllers deiner wahl. Die eigentlichen JSPs liegen dann unter WEB-INF und werden ja von Spring gefunden


----------



## navino (1. Nov 2008)

Hallo,

ich hab auch ein problem mit dem WEB-INF.
Und zwar möchte ich dort Dateien für einen Download ablegen.
Aber wie komme ich daran? Über einen Link bekommt man zu recht einen 404 Fehler
Ich habe eine Java-Server-faces Anwendung, und habe keine Ahnung wie ich das machen kann.

Gruß
navino


----------



## maki (1. Nov 2008)

> ch hab auch ein problem mit dem WEB-INF.
> Und zwar möchte ich dort Dateien für einen Download ablegen.


Sehr schlechte Idee, bei manchen Server darf man da gar nicht schreiben.



> Aber wie komme ich daran? Über einen Link bekommt man zu recht einen 404 Fehler


Auf WEB-INF darf kein Client (Browser) zugreifen.

Speichere Dateien lieber in einem Pfad auf der HD.


----------



## navino (1. Nov 2008)

Hallo und danke für die schnelle Antwort,

der Client soll nur Zugriff auf Dateien erhalten, wenn er auch die Berechtigung hat.
Da alles außer im WEB-INF zugänglich ist, kann jeder der den Pfad kennt, auf die Resourcen zugreifen.

Ich muss irgendwie über den Server an die resourcen kommen, - oder ?

/WEB-INF/downloads/test.txt geht nicht, klar 404 !!
/downloads/test.txt geht, kann ich aber nicht über Berechtigung steuern !!

Ok, ich muss nicht unbedingt in das WEB-INF die Dateien ablegen, aber dann komme ich nur mit dem Server dran,
der muss dieses dann zum Client schicken , - oder ? Aber wie ?



Gruß

navino


----------



## maki (1. Nov 2008)

Kannst doch die Dateien irgendwo am Server ablegen, am besten niemals in der Webapp selbst, d.h. weder WEB-inf noch sonst ein PFad in der Webapp.

Suche mal nach stream servlet.

Wenn der Client dann eine Datei downloaden will, kannst du im Servlet (besser vorher) prüffen ob er das überhaupt darf.


----------

