Ich arbeite an einer Java EE-Webanwendung mit der folgenden Quellcodestruktur:
src/main/java <-- multiple packages containing java classes
src/test/java <-- multiple packages containing JUnit tests
src/main/resources <-- includes properties files for textual messages
src/main/webapp/resources <-- includes CSS, images and all Javascript files
src/main/webapp/WEB-INF
src/main/webapp/WEB-INF/tags
src/main/webapp/WEB-INF/views
Das, woran ich interessiert bin, ist WEB-INF
- es enthält web.xml
XML-Dateien zum Einrichten von Servlets, Spring Bean-Verkabelungskontexte sowie JSP-Tags und -Ansichten.
Ich versuche zu verstehen, was diese Struktur einschränkt / definiert. Müssten sich JSP-Dateien beispielsweise immer innerhalb befinden WEB-INF
oder könnten sie sich woanders befinden? Und gibt es noch etwas, das reingehen könnte WEB-INF
? Der WAR - Dateieintrag von Wikipedia erwähnt classes
Java-Klassen und lib
JAR-Dateien - ich bin mir nicht sicher, ob ich genau verstanden habe, wann diese zusätzlich zu den anderen Speicherorten der Quelldateien benötigt werden.
servlets
jakarta-ee
war
web-inf
Steve Chambers
quelle
quelle
WEB-INF
und an anderen Orten geladen werden , lesen Sie die Frage Steuern des Klassenpfads in einem Servlet , insbesondere diese Antwort .Antworten:
Die Servlet 2.4-Spezifikation sagt dies über WEB-INF aus (Seite 70):
Dies bedeutet, dass
WEB-INF
Ressourcen für den Ressourcenlader Ihrer Webanwendung zugänglich und für die Öffentlichkeit nicht direkt sichtbar sind.Aus diesem Grund legen viele Projekte ihre Ressourcen wie JSP-Dateien, JARs / Bibliotheken und ihre eigenen Klassendateien oder Eigenschaftendateien oder andere vertrauliche Informationen in den
WEB-INF
Ordner. Andernfalls wäre der Zugriff über eine einfache statische URL (nützlich zum Laden von CSS oder Javascript).Ihre JSP-Dateien können jedoch aus technischer Sicht überall sein. Zum Beispiel können Sie sie im Frühjahr so konfigurieren, dass sie
WEB-INF
explizit vorhanden sind:Die im Wikipedia- Artikel WAR-Dateien genannten Ordner
WEB-INF/classes
und sind Beispiele für Ordner, die zur Laufzeit von der Servlet-Spezifikation benötigt werden.WEB-INF/lib
Es ist wichtig, den Unterschied zwischen der Struktur eines Projekts und der Struktur der resultierenden WAR-Datei zu machen.
Die Struktur des Projekts spiegelt in einigen Fällen teilweise die Struktur der WAR-Datei wider (für statische Ressourcen wie JSP-Dateien oder HTML- und JavaScript-Dateien, dies ist jedoch nicht immer der Fall.
Der Übergang von der Projektstruktur in die resultierende WAR-Datei erfolgt durch einen Erstellungsprozess.
Während Sie normalerweise frei sind, Ihren eigenen Erstellungsprozess zu entwerfen, verwenden heutzutage die meisten Leute einen standardisierten Ansatz wie Apache Maven . Unter anderem definiert Maven Standardeinstellungen, für welche Ressourcen in der Projektstruktur welche Ressourcen im resultierenden Artefakt zugeordnet sind (das resultierende Artefakt ist in diesem Fall die WAR-Datei). In einigen Fällen besteht die Zuordnung aus einem einfachen Kopierprozess, in anderen Fällen umfasst der Zuordnungsprozess eine Transformation, z. B. Filtern oder Kompilieren und andere.
Ein Beispiel : Der
WEB-INF/classes
Ordner enthält später alle kompilierten Java-Klassen und -Ressourcen (src/main/java
undsrc/main/resources
), die vom Classloader geladen werden müssen, um die Anwendung zu starten.Ein weiteres Beispiel : Der
WEB-INF/lib
Ordner enthält später alle JAR-Dateien, die von der Anwendung benötigt werden. In einem Maven-Projekt werden die Abhängigkeiten für Sie verwaltet und Maven kopiert die erforderlichen JAR-Dateien automatisch in denWEB-INF/lib
Ordner für Sie. Das erklärt, warum Sie keinenlib
Ordner in einem Maven-Projekt haben.quelle
WAR
>WEB-INF
>lib
>JAR
Datei>resources
WAR
Datei>WEB-INF
>lib
>JAR
Datei>META-INF
>resources
> yourStaticFilesGoHere .Wenn Sie eine Java EE-Webanwendung bereitstellen (mit oder ohne Frameworks), muss ihre Struktur einigen Anforderungen / Spezifikationen entsprechen. Diese Spezifikationen stammen von:
Wenn Sie Apache Tomcat verwenden, muss das Stammverzeichnis Ihrer Anwendung im Ordner webapp abgelegt werden. Dies kann anders sein, wenn Sie einen anderen Servlet-Container oder Anwendungsserver verwenden.
Anforderungen an die
Java-Servlet-API Die Java-Servlet-API gibt an, dass Ihr Stammanwendungsverzeichnis die folgende Struktur haben muss:
Diese Anforderungen werden von der Java Servlet API definiert.
3. Ihre Anwendungsdomäne Nachdem
Sie die Anforderungen des Servlet-Containers (oder Anwendungsservers) und die Anforderungen der Java-Servlet-API erfüllt haben, können Sie die anderen Teile Ihrer Webanwendung nach Bedarf organisieren.
- Sie können Ihre Ressourcen (JSP-Dateien, Nur-Text-Dateien, Skriptdateien) in Ihrem Anwendungsstammverzeichnis ablegen. Dann können Benutzer jedoch direkt über ihren Browser auf sie zugreifen, anstatt dass ihre Anforderungen von einer von Ihrer Anwendung bereitgestellten Logik verarbeitet werden. Um zu verhindern, dass auf Ihre Ressourcen direkt zugegriffen wird, können Sie sie in das WEB-INF-Verzeichnis stellen, auf dessen Inhalt nur der Server zugreifen kann.
-Wenn Sie einige Frameworks verwenden, verwenden diese häufig Konfigurationsdateien. Bei den meisten dieser Frameworks (Struts, Spring, Hibernate) müssen Sie ihre Konfigurationsdateien im Klassenpfad (dem Verzeichnis "classes") ablegen.
quelle
Sie sollten in WEB-INF alle Seiten oder Seitenstücke einfügen, die Sie nicht öffentlich machen möchten. Normalerweise befinden sich JSP oder Facelets außerhalb von WEB-INF. In diesem Fall sind sie jedoch für jeden Benutzer leicht zugänglich. Falls Sie einige Berechtigungsbeschränkungen haben, kann WEB-INF dafür verwendet werden.
WEB-INF / lib kann Bibliotheken von Drittanbietern enthalten, die Sie nicht auf Systemebene packen möchten (JARs können für alle auf Ihrem Server ausgeführten Anwendungen verfügbar sein), sondern nur für diese bestimmte Anwendung.
Im Allgemeinen gehen viele Konfigurationsdateien auch in WEB-INF.
WEB-INF / classes ist in jeder Web-App vorhanden, da in diesem Ordner alle kompilierten Quellen abgelegt sind (nicht JARS, sondern kompilierte Java-Dateien, die Sie selbst geschrieben haben).
quelle
Diese Konvention wird aus Sicherheitsgründen befolgt. Wenn beispielsweise nicht autorisierte Personen direkt über die URL auf die Root-JSP-Datei zugreifen dürfen, können sie ohne Authentifizierung durch die gesamte Anwendung navigieren und auf alle gesicherten Daten zugreifen.
quelle
Es gibt eine Konvention (nicht erforderlich), JSP-Seiten im WEB-INF-Verzeichnis abzulegen, damit sie nicht tief verknüpft oder mit Lesezeichen versehen werden können. Auf diese Weise müssen alle Anfragen an die JSP-Seite über unsere Anwendung geleitet werden, damit die Benutzererfahrung garantiert ist.
quelle