Struttura delle cartelle dell'applicazione Web Java


18

Come principiante di J2EE, ho recentemente iniziato a sviluppare il mio progetto da zero utilizzando il Core di J2EE: Servlets & Jsps.

Non sono riuscito a valutare se la struttura delle cartelle del mio progetto è corretta o meno. Ecco la struttura delle cartelle del mio progetto. inserisci qui la descrizione dell'immagine

Prima di porre una domanda, ammetto di non poter rispondere o giustificare se qualcuno mi chiede, perché questo tipo di struttura di cartelle. La domanda: è un buon segno mettere i miei jsps fuori dal web-inf. In caso contrario, perché è così? Se si perchè?

Esiste una convenzione sulla struttura di cartelle standard per un'applicazione Web J2EE, so che Maven ha fatto emergere alcuni standard, ma possiamo ancora personalizzare secondo il requisito che credo.

Ho fatto un po 'di ricerche su Google e ho trovato i due riferimenti 1 2

dove nelle risposte non si trovano la stessa pagina, da cui non ho potuto trarre alcuna conclusione.

Quali sono i punti da considerare durante la struttura della cartella per un'applicazione Web J2EE, soprattutto dove dovrebbero essere inseriti i contenuti statici, jsps e perché?



Consiglio vivamente di ricercare la teoria MVC - l'articolo di Wikipedia ha alcune eccellenti risorse su di esso. Se vuoi sperimentare MVC in una webapp Java, Stripes è un eccellente framework leggero che può darti una panoramica dell'architettura.
Michael K,

1
Ecco un trattamento più specifico di come MVC funziona nelle webapp.
Michael K,

Risposte:


7

La struttura standard per un file WAR è:

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

Maven genera questo per te usando src / main / java, risorse, webapp e le tue dipendenze (inserendoli in / lib) nel plugin maven-webapp , ma questa è l'implementazione. La cosa importante da capire è che tutto ciò che si inserisce in WEB-INF non è accessibile dall'esterno , mentre tutto nella directory principale di WAR è pubblico.

Generalmente non vuoi mettere molto nel root, poiché vuoi che la tua applicazione gestisca tutti gli accessi usando i servlet e i filtri che hai definito in web.xml. È comune vedere un indice.html (o .jsp) nella radice che reindirizza a un servlet, ad esempio un'azione Struts .

Le implementazioni tipiche di MVC come Stripes o Struts sconsigliano di accedere direttamente ai JSP dell'utente, preferendo che i JSP siano di sola visualizzazione. Raccomandano di creare controller che inoltrino ai JSP dopo l'elaborazione della richiesta e che i JSP visualizzino semplicemente il risultato. Ad esempio, l'invio di un modulo per /logineseguire un'azione che elabora la richiesta di accesso, crea la sessione dell'utente e inoltra l'utente alla vista di accesso del JSP della home page.


5

La solita risposta a "qual è la strada giusta?" o "è questo il modo giusto?" è ..... dipende .

Tutto quello che posso fare è dirti i pro e i contro di idee specifiche. Ciò che segue è al 100% la mia opinione. Non conosco requisiti o regole specifici. Sono sicuro che qualcuno non sarà d'accordo con me.

JSP di

Lavoriamo sull'opportunità o meno di inserire JSP in WEB-INF.

Pro di mettere JSP in WEB-INF:

  • Tu controlli come vengono eseguiti i JSP. Se vuoi che un JSP sia parametrizzato e riutilizzabile (il che è comunque davvero difficile con un JSP), puoi inserirli in WEB-INF e utilizzare un servlet o un controller di azione Struts o qualche altro front controller per eseguire la pre-elaborazione e quindi passare il controllo al JSP, passando nel giusto contesto di ambiente (come attributi di richiesta, eventuali controlli di sicurezza, risanamento dei parametri, ecc.)
  • È possibile programmare o persino a livello di firewall o IDS bloccare le richieste HTTP a * .jsp per ridurre la probabilità che qualcuno carichi un JSP sulla radice Web e sia quindi in grado di eseguire il codice come server Web. Dovrebbero sovrascrivere un JSP esistente. Non è un enorme vantaggio in termini di sicurezza, ma rende il compromesso leggermente più difficile.
  • Applica buone abitudini, come MVC, front controller, filtri servlet, iniezione di dipendenza, ecc. Al contrario di un grande mostruoso JSP che fa tutto il lavoro stesso ed è difficile da leggere / mantenere.

Contro di mettere JSP in WEB-INF:

  • Non è possibile accedere direttamente alla pagina, anche se si tratta di una semplice pagina autonoma che non necessita di elaborazione anticipata. Questo perché i file in / WEB-INF non sono servibili da un contenitore servlet.

File statici

In termini di file puramente statici come HTML, immagine, foglio di stile, javascript, ecc., Posizionali sotto la radice del web (my_app nel tuo caso), ma NOT / WEB-INF (perché non è accessibile).

Layout generale

Per quanto riguarda il layout generale della directory, dipende in qualche modo dal processo di compilazione. Mi piace archiviare tutto in "src" o "source" perché chiarisce quali file vengono generati dalla costruzione e quali sono file sorgente puri. mainti permette di separare il codice di test come le classi junit dal tuo codice sorgente principale, il che è buono. Ma se non hai alcun test unitario (oh no!), Allora è una distinzione insignificante.

D'altra parte, se non si manipola affatto la radice Web durante la compilazione (come se fosse tutto JSP e file statici), allora forse lo si mantiene al livello più alto, come /webrooto /deploye si copiano i file in base alle esigenze, come File .class o .jar. È un'abitudine degli esseri umani (specialmente degli sviluppatori) organizzarsi in modo eccessivo. Un buon segno di un'eccessiva organizzazione è avere molte cartelle con una sola sottocartella.

Quello che hai mostrato

Hai indicato che stai seguendo una convenzione impostata da Maven, quindi se stai già utilizzando Maven, segui semplicemente quel layout. Non c'è assolutamente nulla di sbagliato nel layout che hai descritto.


1

Bene, il tuo src / main / webapp mi ricorda sicuramente un progetto maven. Che è buono.

Per my_app / jsps non ne sono sicuro. Gli sviluppatori di solito lasciano il loro jsp nella cartella webapp, o se vuoi fare un po 'di mappatura dell'URL, in una directory webapp / jsp.

!Avvertimento! : Non dovresti mai mettere un file jsp in web-inf. Il tuo WEB-INF dovrebbe contenere solo file xml per configurare il tuo sito web. Ricorda, il tuo jsp è una pagina web o parte di una pagina web.

Puoi usare il nome delle cartelle come modello, parziale ... qualunque cosa ti stia bene. Dovrebbe essere facile da trovare per uno sconosciuto. Basta separare diversi tipi di contenuti come pagine intere, modelli, viste parziali ...


src / main / webapp contiene un file di layout WAR standard e viene letto dal plugin maven-war durante la compilazione di una webapp Java.
Michael K,

1
Non vi è alcun motivo per cui non si debbano inserire JSP in WEB-INF, purché nel proprio web.xml siano stati configurati servlet che alla fine li inoltreranno. Questo è il modo standard di implementare un'app Struts: tutte le richieste passano attraverso il servlet Struts, che le associa a un'azione e quindi a un JSP.
Michael K,

Concordo con il fatto che non si dovrebbe accedere direttamente a un jsp e prevenirlo dovrebbe essere considerato una buona pratica. Ma ci sono altri modi per farlo.
Brice Ruppen,

1

Sono d'accordo con Brice . Anche io sono un principiante in J2EE, ma penso che all'inizio sia meglio lavorare facilmente e chiaramente.

La cartella principale è WEBAPP e dovresti creare la tua struttura web pensando che la maggior parte delle pagine si troverà lì. In caso contrario, quando le pagine comunicano tra loro probabilmente non è possibile gestire le relazioni tra file senza errori.


1

In realtà l'applicazione WAR può essere costruita senza WEB-INF/web.xml. È possibile creare un'applicazione WAR con solo classi Java all'interno.

Fonte: elementi web descrittori di distribuzione web.xml

Con le annotazioni Java EE, il descrittore di distribuzione web.xml standard è facoltativo. Secondo la specifica servlet 3.0 su http://jcp.org/en/jsr/detail?id=315 , è possibile definire annotazioni su alcuni componenti Web, come servlet, filtri, listener e gestori di tag.

Quindi al giorno d'oggi è possibile creare WAR che sembra JAR con .warestensioni :)

Per rispondere alla tua domanda, la struttura di WAR dipende dalle tue esigenze.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.