Struktura folderów aplikacji WWW Java

18

Jako początkujący do J2EE, ostatnio zacząłem rozwijać swój własny projekt od podstaw przy użyciu rdzenia J2EE: Servlets & Jsps.

Nie mogłem ocenić, czy struktura mojego projektu jest poprawna, czy nie. Oto struktura folderów mojego projektu. wprowadź opis zdjęcia tutaj

Przed zadaniem pytania przyznaję, że nie mogłem odpowiedzieć ani nie uzasadnić, czy ktoś mnie pyta, dlaczego ten rodzaj struktury folderów. Pytanie: Czy to dobry znak, aby umieścić moje pliki jsp poza web-inf. Jeśli nie, dlaczego tak jest? Jeśli tak, dlaczego?

Czy istnieje jakaś standardowa konwencja dotycząca struktury folderów dla aplikacji sieciowej J2EE, wiem, że maven wprowadził pewne standardy, ale nadal możemy dostosować według wymagań, które uważam.

Zrobiłem trochę googlingu i znalazłem dwie referencje 1 2

gdzie w odpowiedziach nie ma na tej samej stronie, z której nie mogłem wyciągnąć żadnych wniosków.

Jakie kwestie należy wziąć pod uwagę przy tworzeniu struktury folderów aplikacji sieciowej J2EE, a co ważne, gdzie powinny znajdować się pliki Jsp i statyczne oraz dlaczego?

srk
źródło
Gorąco polecam zbadanie teorii MVC - artykuł w Wikipedii zawiera wiele doskonałych zasobów. Jeśli chcesz eksperymentować z MVC w aplikacji Java, Stripes to doskonała lekka platforma, która może dać ci przegląd architektury.
Michael K
1
Oto bardziej szczegółowe podejście do działania MVC w aplikacjach internetowych.
Michael K

Odpowiedzi:

7

Standardowa struktura pliku WAR to:

/META-INF
   Standard jar stuff like manifest.xml
/WEB-INF
  web.xml
  /classes
    /com...etc.
  /lib

Maven generuje to dla ciebie za pomocą src / main / java, zasobów, aplikacji internetowej i twoich zależności (umieszczając je w / lib) we wtyczce maven-webapp , ale to implementacja. Ważne jest, aby zdać sobie sprawę, że wszystko, co umieścisz w WEB-INF, nie jest dostępne z zewnątrz , podczas gdy wszystko w katalogu głównym WAR jest publiczne.

Zasadniczo nie chcesz dużo umieszczać w katalogu głównym, ponieważ chcesz, aby aplikacja obsługiwała cały dostęp za pomocą serwletów i filtrów zdefiniowanych w pliku web.xml. Często spotyka się index.html (lub .jsp) w katalogu głównym, który przekierowuje do serwletu, na przykład akcji Struts .

Typowe implementacje MVC, takie jak Stripes lub Struts, zalecają, aby użytkownik nie uzyskiwał bezpośredniego dostępu do stron JSP, preferując, aby strony JSP były dostępne tylko do wyświetlania. Zalecają tworzenie kontrolerów, które przesyłają dalej do stron JSP po przetworzeniu żądania, a strony JSP jedynie renderują wynik. Na przykład przesłanie formularza /loginspowoduje uruchomienie akcji, która przetwarza żądanie logowania, utworzy sesję użytkownika i przekieruje użytkownika do zalogowanego widoku strony głównej JSP.

Michael K.
źródło
5

Zwykła odpowiedź na „jaka jest właściwa droga?” lub „czy to właściwa droga?” jest ... to zależy .

Wszystko, co mogę zrobić, to przedstawić zalety i wady konkretnych pomysłów. Poniżej 100% mojej opinii. Nie znam żadnych konkretnych wymagań ani zasad. Jestem pewien, że ktoś się ze mną nie zgodzi.

JSP

Zastanówmy się, czy umieścić JSP w WEB-INF, czy nie.

Zalety umieszczania stron JSP w WEB-INF:

  • Kontrolujesz sposób wykonywania stron JSP. Jeśli chcesz sparametryzować JSP i nadawać się do ponownego użycia (co i tak jest naprawdę trudne z JSP), możesz umieścić je w WEB-INF i użyć serwletu lub kontrolera akcji Struts lub innego kontrolera frontowego do wstępnego przetwarzania a następnie przekazać kontrolę do strony JSP, przekazując w odpowiednim kontekście środowiska (np. atrybuty żądania, wszelkie kontrole bezpieczeństwa, parametry sanitarne itp.)
  • Możesz programowo lub nawet na poziomie zapory ogniowej lub poziomu IDS blokować żądania HTTP do * .jsp, aby zmniejszyć prawdopodobieństwo, że ktoś załaduje plik JSP do katalogu głównego, a następnie będzie mógł wykonać kod jako serwer WWW. Musieliby nadpisać istniejący plik JSP. Nie jest to duży zysk bezpieczeństwa, ale kompromis jest nieco trudniejszy.
  • Wymusza dobre nawyki, takie jak MVC, kontroler przedni, filtry serwletów, wstrzykiwanie zależności itp. W przeciwieństwie do dużego, potwornego JSP, który wykonuje całą pracę sam i jest trudny do odczytania / utrzymania.

Wady umieszczania stron JSP w WEB-INF:

  • Nie możesz uzyskać dostępu do strony bezpośrednio, nawet jeśli jest to prosta samodzielna strona, która nie wymaga wstępnego przetwarzania. Wynika to z faktu, że pliki w katalogu / WEB-INF nie są obsługiwane przez kontener serwletu.

Pliki statyczne

Jeśli chodzi o czysto statyczne pliki, takie jak HTML, obraz, arkusz stylów, javascript itp., Umieść je w katalogu głównym (my_app w twoim przypadku), ale NIE / WEB-INF (ponieważ nie jest dostępny).

Ogólny układ

Jeśli chodzi o ogólny układ katalogu, zależy to nieco od procesu kompilacji. Lubię przechowywać wszystko pod „src” lub „source”, ponieważ wyjaśnia, jakie pliki są generowane przez kompilację, a które są czystymi plikami źródłowymi. mainpozwala oddzielić kod testowy, taki jak klasy junit, od głównego kodu źródłowego, co również jest dobre. Ale jeśli nie masz żadnych testów jednostkowych (o nie!), To bez znaczenia jest rozróżnienie.

Z drugiej strony, jeśli nie manipulujesz katalogiem głównym podczas kompilacji (np. Jeśli są to tylko pliki JSP i pliki statyczne), być może utrzymujesz go na najwyższym poziomie, np. /webrootLub /deploykopiujesz pliki w razie potrzeby, takie jak Pliki .class lub .jar. Jest nawykiem ludzi (szczególnie deweloperów) do nadmiernej organizacji. Dobrym znakiem nadmiernej organizacji jest posiadanie dużej liczby folderów z tylko jednym podfolderem.

Co pokazałeś

Wskazałeś, że przestrzegasz konwencji ustalonej przez maven, więc jeśli już korzystasz z maven, po prostu trzymaj się tego układu. Nie ma absolutnie nic złego w opisanym układzie.

Brandon
źródło
1

Twoja aplikacja src / main / web z pewnością przypomina mi projekt maven. Który jest dobry.

W przypadku my_app / jsps nie jestem jednak pewien. Programiści zwykle zostawiają swój plik jsp w folderze aplikacji sieci Web lub, jeśli chcesz wykonać trochę mapowania adresów URL, w katalogu aplikacji / jsp.

!Ostrzeżenie! : Nigdy nie należy umieszczać pliku jsp na inf-web. Twój WEB-INF powinien zawierać tylko pliki XML do konfiguracji twojej strony. Pamiętaj, że twój jsp jest stroną internetową lub jej częścią.

Możesz używać nazw folderów takich jak szablon, częściowy ... cokolwiek Ci odpowiada. Nieznajomy powinien być łatwy do znalezienia. Po prostu oddziel różne typy treści, takie jak pełne strony, szablony, częściowe widoki ...

Brice Ruppen
źródło
src / main / webapp zawiera standardowy plik układu WAR i jest odczytywany przez wtyczkę maven-war-plugin podczas kompilacji aplikacji Java.
Michael K
1
Nie ma powodu, dla którego nie należy umieszczać stron JSP w WEB-INF, o ile skonfigurowano serwlety w pliku web.xml, które w końcu do nich prześlą. Jest to standardowy sposób implementacji aplikacji Struts - wszystkie żądania przechodzą przez serwlet Struts, który mapuje je na akcję, a następnie na stronę JSP.
Michael K
Zgadzam się z faktem, że dostęp do pliku jsp nie powinien być możliwy bezpośrednio, a zapobieganie temu należy uznać za dobrą praktykę. Ale są na to inne sposoby.
Brice Ruppen
1

I zgadzam się z Brice . Jestem również początkującym w J2EE, ale myślę, że lepiej jest pracować na początku łatwo i wyraźnie.

Folder główny to WEBAPP i powinieneś sprawić, aby struktura sieciowa myślała, że ​​większość stron się tam znajdzie. Jeśli nie, gdy strony komunikują się między nimi, prawdopodobnie nie można zarządzać relacjami plików bez błędów.

musef
źródło
1

W rzeczywistości aplikacja WAR może zostać zbudowana bez WEB-INF/web.xml. Możliwe jest utworzenie aplikacji WAR zawierającej tylko klasy Java.

Źródło: Elementy deskryptora wdrażania web.xml

W przypadku adnotacji Java EE standardowy deskryptor wdrażania pliku web.xml jest opcjonalny. Zgodnie ze specyfikacją serwletu 3.0 pod adresem http://jcp.org/en/jsr/detail?id=315 adnotacje można definiować w niektórych komponentach sieci Web, takich jak serwlety, filtry, detektory i programy obsługi znaczników.

W dzisiejszych czasach można zbudować WAR, niż wygląda JAR z .warrozszerzeniami :)

Odpowiadając na twoje pytanie, struktura WAR zależy od twoich wymagań.

http://en.wikipedia.org/wiki/WAR_(Sun_file_format)

MᴀʀɪᴜsᴢS
źródło