Do czego służy WEB-INF w aplikacji internetowej Java EE?

Pracuję nad aplikacją internetową Java EE o następującej strukturze kodu źródłowego:

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

Katalog, który mnie interesuje WEB-INF: zawiera web.xml, pliki XML do konfigurowania serwletów, konteksty okablowania Spring bean oraz znaczniki i widoki JSP. Staram się zrozumieć, co ogranicza / definiuje tę strukturę. Np. czy pliki JSP zawsze muszą znajdować się w WEB-INF czy mogą być gdzieś indziej? Czy jest coś jeszcze, co może wejść WEB-INF? Wikipedia wojna files wpis wymienia classes dla klas Java i lib dla plików JAR - nie jestem pewien, czy w pełni zrozumiałem, kiedy będą one potrzebne oprócz innych lokalizacji plików źródłowych.

Author: Steve Chambers, 2013-11-05

5 answers

Specyfikacja Servlet 2.4 mówi tak o WEB-INF (strona 70):

Specjalny katalog istnieje w hierarchii aplikacji o nazwie WEB-INF. Ten katalog zawiera wszystkie rzeczy związane z aplikacji, które nie znajdują się w katalogu głównym aplikacji. The WEB-INF node nie jest częścią drzewa dokumentów publicznych zastosowanie . Żaden plik zawarty w katalogu WEB-INF nie może być obsługiwany bezpośrednio do klienta przez kontener. Jednak spis treści WEB-INF katalog jest widoczny dla kodu servleta za pomocą getResource i getResourceAsStream wywołania metody ServletContext, a może być narażone za pomocą wywołań RequestDispatcher.

Oznacza to, że WEB-INF zasoby są dostępne dla resource loadera Twojej aplikacji internetowej i nie są bezpośrednio widoczne dla publiczności.

Dlatego wiele projektów umieszcza swoje zasoby, takie jak pliki JSP, jars/biblioteki i własne pliki klas lub pliki właściwości lub inne poufne informacje w WEB-INF folder. W przeciwnym razie byłyby one dostępne za pomocą prostego statycznego adresu URL(przydatnego do ładowania CSS lub Javascript na przykład).

Twoje pliki JSP mogą być wszędzie, choć z technicznego punktu widzenia. Na przykład wiosną można skonfigurować je tak, aby były w WEB-INF jawnie:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    p:prefix="/WEB-INF/jsp/" 
    p:suffix=".jsp" >
</bean>
W przeciwieństwie do innych serwletów, serwlety mogą być dodawane do serwletów, a serwlety mogą być dodawane do serwletów.

Ważne jest aby dokonać różnicy między strukturą projektu a strukturą wynikowego pliku wojennego.

Struktura projektu w niektórych przypadkach częściowo odzwierciedla strukturę pliku WAR (dla zasobów statycznych, takich jak pliki JSP lub pliki HTML i JavaScript, ale nie zawsze tak jest.

przejście ze struktury projektu do wynikowego pliku wojny odbywa się w procesie budowania.

Podczas gdy Zwykle jesteś wolny aby zaprojektować swój własny proces budowy, w dzisiejszych czasach większość ludzi będzie używać ustandaryzowanego podejścia, takiego jak Apache Maven. Między innymi Maven definiuje domyślne wartości, dla których zasobów w strukturze projektu mapuje się, jakie zasoby w wynikowym artefakcie (wynikowym artefaktem jest w tym przypadku plik WAR). W niektórych przypadkach mapowanie składa się z procesu zwykłego kopiowania w innych przypadkach proces mapowania obejmuje transformację, taką jak filtrowanie lub kompilowanie i i inni

przykład: folder WEB-INF/classes będzie później zawierał wszystkie skompilowane klasy i zasoby Javy (src/main/java i src/main/resources), które muszą zostać załadowane przez Classloader, aby uruchomić aplikację.

inny przykład: folder WEB-INF/lib będzie później zawierał wszystkie pliki JAR potrzebne przez aplikację. W projekcie maven zależności są zarządzane za Ciebie, a Maven automatycznie kopiuje potrzebne pliki jar do folderu WEB-INF/lib dla Ciebie. To wyjaśnia, dlaczego nie mieć folder lib w projekcie maven.

 223
Author: mwhs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-15 05:34:13

Kiedy wdrażasz aplikację internetową Java EE (używając frameworków lub nie), jej struktura musi spełniać pewne wymagania / specyfikacje. Specyfikacje te pochodzą z:

  • Pojemnik servlet (np. Tomcat)
  • Java Servlet API
  • Twoja domena aplikacji
  1. Wymagania kontenera Servlet
    Jeśli używasz Apache Tomcat, katalog główny aplikacji musi być umieszczony w folderze webapp. Może być inaczej, jeśli używasz innego kontenera serwleta lub serwera aplikacji.

  2. Wymagania Java Servlet API
    Java Servlet API stwierdza, że główny katalog aplikacji musi mieć następującą strukturę:

    ApplicationName
    |
    |--META-INF
    |--WEB-INF
          |_web.xml       <-- Here is the configuration file of your web app(where you define servlets, filters, listeners...)
          |_classes       <--Here goes all the classes of your webapp, following the package structure you defined. Only 
          |_lib           <--Here goes all the libraries (jars) your application need
    

Wymagania te są zdefiniowane przez Java Servlet API.

3. Twoja domena aplikacji
Po spełnieniu wymagań kontenera serwletów (lub serwera aplikacji) oraz wymagań Java Servlet API, możesz zorganizować inne części aplikacji webapp w oparciu o to, czego potrzebujesz.
- możesz umieścić swoje zasoby (pliki JSP, pliki tekstowe, pliki skryptów) w katalogu głównym aplikacji. Ale wtedy ludzie mogą uzyskać do nich dostęp bezpośrednio z przeglądarki, zamiast ich żądania są przetwarzane przez jakąś logikę dostarczoną przez aplikację. Aby zapobiec bezpośredniemu dostępowi do Twoich zasobów, możesz umieścić je w katalogu WEB-INF, którego zawartość jest dostępna tylko przez serwer.
- Jeśli używasz niektórych frameworków, często używają plików konfiguracyjnych. Większość tych frameworków (struts, spring, hibernate) wymaga umieszczenia ich plików konfiguracyjnych w classpath (katalogu "classes").

 62
Author: Patrick B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-07 22:50:32

Powinieneś umieścić w WEB-INF wszystkie strony, lub fragmenty stron, które nie chcą być publiczne. Zwykle JSP lub facelets znajdują się poza WEB-INF, ale w tym przypadku są łatwo dostępne dla każdego użytkownika. Jeśli masz jakieś ograniczenia autoryzacji, WEB-INF może być używany do tego celu.

WEB-INF / lib może zawierać biblioteki innych firm, których nie chcesz pakować na poziomie systemu (Jary mogą być dostępne dla wszystkich aplikacji uruchomionych na twoim serwerze), ale tylko dla tego szczególne zastosowanie.

Ogólnie rzecz biorąc, wiele plików konfiguracyjnych również trafia do WEB-INF.

Co do WEB-INF / classes-istnieje w każdej aplikacji webowej, ponieważ jest to folder, w którym znajdują się wszystkie skompilowane źródła (nie JARS, ale skompilowane .pliki java, które sam napisałeś).

 12
Author: Artem Moskalev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-05 10:11:04

Niniejsza Konwencja jest przestrzegana ze względów bezpieczeństwa. Na przykład, jeśli nieautoryzowana osoba może uzyskać dostęp do pliku JSP root bezpośrednio z adresu URL, a następnie mogą poruszać się po całej aplikacji bez uwierzytelniania i mogą uzyskać dostęp do wszystkich zabezpieczonych danych.

 4
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-16 22:49:30

Istnieje Konwencja (nie jest to konieczne) umieszczania stron jsp w katalogu WEB-INF, aby nie mogły być głęboko połączone lub Zakładki do. W ten sposób wszystkie żądania na stronę jsp muszą być kierowane przez naszą aplikację, aby zagwarantować użytkownikowi doświadczenie.

 3
Author: Akshay Vijay Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-15 08:11:06