JavaRush /Java Blog /Random-IT /Senza pathos. Parliamo di Java EE, delle servlet e dei lo...
eGarmin
Livello 41

Senza pathos. Parliamo di Java EE, delle servlet e dei loro contenitori

Pubblicato nel gruppo Random-IT
In questo argomento, vorrei parlare francamente della mia comprensione dei servlet, cosa sono i contenitori servlet, cosa sono la maggior parte, se non tutti, i framework front-end web e toccare anche l'argomento di come i contenitori servlet e i server delle applicazioni si relazionano a tra loro e contenitori di servlet e server web. Senza pathos.  Parliamo di Java EE, servlet e relativi contenitori - 1Prima di iniziare la conversazione, voglio sottolineare che mi aspetto davvero che ci sia una discussione, perché... Qui non voglio fornire un singolo pezzo di codice, ma voglio solo toccare l'essenza, che può sempre essere espressa a parole. Cercherò di delineare tutti quei punti che non mi erano chiari quando ho iniziato. Quando ho posto domande su vari forum sull'argomento in che modo il servlet container Tomcat differisce da qualsiasi server applicativo, ad esempio WebSphere o Geronimo, le uniche persone che hanno osato rispondere erano degli stronzi che non potevano dire altro che "guarda Wikipedia" o " è difficile dirlo, applicazioni server: questa è un'infrastruttura complessa per applicazioni aziendali, che..." blah blah blah. Non sopporto le persone così e immagino che nemmeno la maggior parte di voi lo sopporti. Correggeremo l’ingiustizia storica. Andare…

Servlet

Qualunque cosa si dica, una servlet è una pagina web scritta in Java. Qualcuno dirà che mi sbaglio e che una servlet è un'applicazione web e che c'è una differenza in questi concetti, ma non è così. Ora non c'è differenza e i siti scritti in PHP possono anche essere tranquillamente chiamati applicazioni web. Ora, questo è del tutto naturale, perché... php supporta pienamente l'OOP e i CMS come Joomla lo utilizzano attivamente. Cos'è una servlet a livello di codice? Questa è una classe che ha una serie di metodi che dormono e vedono se qualcuno vi accede tramite richieste GET o POST HTTP. Quelli. Abbiamo digitato una richiesta GET nel browser, il metodo corrispondente della classe servlet l'accetta e quindi genera una risposta sotto forma di una pagina HTML. Nel senso classico di una servlet, così come è stata concepita da Sun, questa pagina veniva inviata al client riga per riga, iniziando con la riga <!DOCTYPE htm>> e terminando con la riga </html>. Quindi in Java esiste una classe servlet di base chiamata Servlet. Inoltre, ci sono un sacco di altre classi che ereditano da questa classe base e quindi ne estendono le funzionalità. Questo è ciò che è un servlet, niente di più. È semplicemente un analogo Java del codice PHP, che viene eseguito anche sul server e al client viene inviata solo la risposta alla richiesta del browser Web sotto forma di una pagina Web. Tutto.

Framework front-end Web

Il sottotitolo è complicato e di solito scrivono solo framework front-end o anche web museruola , ma ho deciso di sottolineare qui che quando parliamo di framework front-end, stiamo parlando di una GUI per lavorare con Java tramite un browser web. Quelli. anche qui parliamo di siti web in Java, cioè sui servlet. Cos'è quasi qualsiasi framework front-end, ad esempio Apache Struts. È semplicemente un insieme di classi che estendono la classe base Servlet. Niente di più. Quelli. è solo un modo diverso per creare lo stesso servlet regolare. È solo che gli sviluppatori di questo framework (o in altre parole, gli sviluppatori di questa tecnologia) hanno ritenuto che l'aggiunta della Servletclasse base con alcuni metodi sarebbe stata più conveniente per il programmatore rispetto alle scarse funzionalità che il classico servlet di Sun/Oracle ha.

Pagine JSP

Quasi subito agli sviluppatori del concetto di servlet Java è venuta in mente un'altra idea. Dato che stiamo scrivendo un servlet, il cui compito è inviare una pagina html al client, potrebbe essere più corretto scrivere immediatamente questa pagina html e, se hai bisogno di qualche tipo di logica in Java, inserirla semplicemente direttamente nell'HTML. Se non diventa più chiaro, la frase può aiutare: una pagina jsp è un analogo di una pagina php. Difficile? Poi ti spiegherò di nuovo. Cosa facciamo quando scriviamo una pagina in PHP? Abbiamo un HTML statico e quando dobbiamo inserire qualsiasi logica in PHP come loop e condizioni, la inseriamo nel corpo del tag <?php … ?>. Con jsp è tutto uguale, solo la logica è scritta in Java puro, il cui codice è inserito nel corpo del tag <% … %>. Torniamo ancora una volta al concetto di servlet. In sostanza, una pagina JSP è una servlet, ma scritta in modo leggermente diverso. In una normale servlet scriviamo un metodo che esegue una logica e, in base ai suoi risultati, genera una pagina HTML per il client. È solo che dopo un po 'gli sviluppatori di servlet hanno iniziato a pensare: e se non ci fosse praticamente alcuna logica nel metodo e si verificasse quasi solo la formazione di una pagina html, non sarebbe più facile scrivere immediatamente una pagina html quale creare inserti Java minimi? codice. Bene, un'ultima cosa sulle pagine jsp. La prima volta che si accede a una pagina di questo tipo, questa viene compilata in una servlet e quindi eseguita. Le successive richieste a questa pagina jsp saranno più veloci perché sarà già compilato e dovrà solo essere eseguito.

Contenitore servlet

Quindi abbiamo scritto una classe servlet o una pagina JSP. Qual è il prossimo? Come inserirli in un server Web, ad esempio Apache, in modo che possa inviarli al browser Web dell'utente? Il server web può inviare solo html e se la nostra pagina ha, ad esempio, codice php, il server web prima passa la pagina attraverso un interprete che traduce php in html e solo allora il risultato viene inviato al client. Più o meno la stessa cosa accade con i servlet: prima dell'invio, devono essere eseguiti affinché la pagina HTML venga generata e il contenitore servlet è esattamente ciò che è responsabile dell'esecuzione dei servlet e del codice della pagina jsp. Quelli. Un contenitore servlet per Java è un analogo del modulo interprete php in un server web. Pertanto, quando l'utente inserisce un indirizzo nel browser web, la richiesta viene inviata al server web, il server web capisce che viene richiesta una servlet e trasmette la richiesta al contenitore servlet. Successivamente, il contenitore servlet esegue il servlet, invia la pagina HTML risultante al server Web, che a sua volta la restituisce al client. Un contenitore servlet può funzionare da solo, ad es. senza un server web? Qualcosa come Tomcat sicuramente può. E se vogliamo creare un sito che non abbia altre pagine html tranne quelle basate su servlet, allora un contenitore servlet per noi è abbastanza. Ma se vogliamo combinare un sito da servlet e, ad esempio, pagine PHP, dovremo installare un server web. Inoltre, non tutti i server web hanno un servlet container incluso di default, ma quasi tutti permettono di installarlo come plugin. Pertanto, se vogliamo lanciare il nostro sito web su un hosting in Internet, dove molto probabilmente gira Apache, dovremo chiedere al provider se il contenitore servlet è collegato.

JavaEE

Esiste il cosiddetto JavaSE (Java Standard Edition). Questo concetto include tutte le classi java, per il cui utilizzo dobbiamo semplicemente importarle (ad esempio java.util.Date) o addirittura non è necessario farlo (ad esempio Stringperché si trova nel pacchetto java.lang). E c'è Java EE (Java Enterprise Edition). Anche queste classi appartengono a Sun/Oracle, ma l'unica differenza è che sono più difficili da iniziare a utilizzare in un progetto. Una semplice riga import…non basterà, perché... il progetto non verrà compilato. Per correggere la situazione, dovrai trovare il file della libreria javaee.jar e includerlo nel progetto. Questo può essere fatto attraverso le proprietà del progetto nell'ambiente di sviluppo. Si dice spesso che questo processo di connessione si chiami: registrare un nickname jar nel percorso di compilazione o nel percorso di classe del progetto.

Server delle applicazioni

Ora immagina di aver compilato il nostro progetto servlet che utilizza Java EE. Tutto è fantastico, ma ora dobbiamo posizionare le nostre classi compilate in un contenitore servlet. Diciamo che lo hanno fatto. La nostra applicazione funzionerà? La risposta è no. Quando si accede alla servlet, verranno generate eccezioni che indicano che alcune classi non sono state trovate. Perché? Perché abbiamo "ingannato" il compilatore scivolando javaee.jar в classpath, cioè il compilatore ha visto che le classi di Java EE erano a posto e si è calmato, ma il contenitore servlet non vede queste classi, ma vede i collegamenti ad esse dal nostro servlet. Questa situazione è risolvibile all'interno di un contenitore servlet? Naturalmente sì, devi solo aggiungere il file della libreria javaee.jar alla cartella con la nostra servlet nel contenitore servlet . Ora immagina che ci saranno molti di questi progetti e che saranno tutti in esecuzione in un contenitore servlet Tomcat. Ciò significa che dovrai copiare questo file jar nella cartella di ciascun servlet. Questo è scomodo e sbagliato. La situazione è stata risolta introducendo il concetto di server applicativo, in cui questo file è da tempo in un'unica copia e tutti i servlet possono accedervi e non avere la propria copia. Secondo me è molto conveniente e logico. Naturalmente, tutto il trambusto non è dovuto a un file jar (l'ho fornito come esempio): esistono molti file simili. Ma non è tutto ciò che i server delle applicazioni ci offrono. Gli stessi server delle applicazioni possono mantenere connessioni a molte risorse, ad esempio un database. In questo caso, il nostro servlet potrebbe non aprire tale connessione da solo, ma semplicemente prelevarla dal server dell'applicazione. In un contenitore servlet, questo è impossibile, perché... un contenitore è, in una certa misura, un application server ridotto al minimo. In un contenitore, una servlet deve sempre creare connessioni al database stesso. Qualcosa del genere... archivio di guerra Cos'è un archivio di guerra? WAR è un archivio web. In realtà, è solo un file zip, come qualsiasi barattolo. Fondamentalmente, questo è solo un modo per stipare il nostro sito Web, costituito da molte pagine Web, pagine JSP e classi servlet, in un unico file zip. web.xml web.xml è il cosiddetto descrittore di distribuzione. Questo è un file che descrive stupidamente quale riga del browser Web deve essere inviata a quale classe servlet per l'elaborazione, in modo che il contenitore servlet non venga confuso, quale servlet è responsabile di cosa. In generale, in Java è molto di moda descrivere le impostazioni in tutti i tipi di file xml, ma recentemente si è osservata la tendenza ad allontanarsi da questa tradizione. Come, chiedi? E attraverso le annotazioni. Le classi di annotazione in sé non fanno nulla; sono state create solo per descrivere tutti i tipi di impostazioni (metadati) non in un file xml separato, ma direttamente nel codice. Molto comodamente. Tuttavia, ora c'è una certa fase intermedia, in cui alcune impostazioni sono specificate dalle annotazioni e altre da xml, e questo può creare confusione, perché Guardi l'xml e vedi un'impostazione, ma secondo le annotazioni ce n'è un'altra. Quale ha la priorità più alta? Chi lo sa…

Conclusione

Avendo scritto questo, ho pensato che una recensione così veloce non sarebbe stata d'aiuto a nessuno, perché... non contiene alcuna specificazione e nessun esempio, ma d'altra parte non cancellate ciò che è scritto, quindi lasciatelo stare.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION