Servlet - questo è Java-nporpaMMa, che utilizza la classe come superclasse HttpServiet. Una servlet viene utilizzata per estendere le capacità di un server esistente, in particolare di un server Web. Tipicamente, una servlet viene eseguita su un server speciale. Tali server sono chiamati Java Application Server. Un server di applicazioni Java include come elemento costitutivo un server Web (a volte non uno, ma diversi), nonché server che funzionano con componenti server, server di servizi ausiliari, ecc. Un servlet opera nell'ambiente fornito dal server. La parte del server progettata per gestire le servlet è chiamata contenitore delle servlet. La specifica del servlet presuppone la presenza di metodi standard nella classe servlet, la cui esecuzione avviene in una o nell'altra fase del ciclo di vita del servlet. Questi metodi vengono chiamati dal contenitore servlet. Un'implementazione della specifica servlet è inclusa nei pacchetti linguistici Java standard.
Questo libro tratta un server di applicazioni Java chiamato Blazix. Blazix Server fornisce un set completo di funzionalità per lavorare con i servlet. Oltre a creare una classe (o classi) servlet, nonché a configurare il programma servlet creato e installarlo sul server, è necessario modificare il file di configurazione del server Web. I valori di base sono specificati nel file di configurazione come segue: servlet.name: myservlet
servlet.myservlet.classNome: miopacchetto.MyServletClass servlet.mioservlet.url: /mysrvlet
Ad ogni servlet deve essere assegnato un nome(servlet.name), con cui viene identificato sul server. Questo nome viene utilizzato per impostare le proprietà del servlet, in particolare per indicare il nome della classe in cui è memorizzato il programma servlet (riga successiva), nonché l'indirizzo al quale si accede a questo servlet (terza riga).
Il client chiede al server Web l'indirizzo dove si trova la servlet (l'indirizzo deve essere specificato come valore di servlet.myservlet.url nel file di configurazione del server Web). Il server passa la richiesta e i dati (se presenti) al servlet, riceve la risposta dal servlet e la inoltra al client.
Questa potrebbe essere la fine della spiegazione di cosa sia un servlet. Tuttavia, ci sono molti dettagli interessanti e utili a cui dovresti prestare attenzione e studiarli in modo più dettagliato.
È particolarmente importante tenere presente che il percorso della classe servlet deve essere specificato in una variabile ciasspath oppure può essere posizionato nella directory C:\Blazix\classes o nella directory specificata nel file di configurazione del server Web come server.ciassDir. Dopo che il file di configurazione è stato modificato per includere informazioni sul nuovo servlet, il server deve essere arrestato e riavviato. Il servlet può anche essere posizionato su un server in esecuzione utilizzando l'utilità di amministrazione, ma per fare ciò, il servlet deve essere inserito in un file WAR di archivio Web. Se il file della classe servlet è stato modificato, non è necessario arrestare il server e riavviarlo. Per impostazione predefinita, il server è configurato in modo che la chiamata di un servlet su http://localhost:81/_reload provochi il ricaricamento di tutte le classi e la classe servlet modificata sia disponibile per le richieste del client (Figura 4.1). Visita questa pagina dopo che il file della classe servlet è stato modificato. Arrestare il server semplicemente non è necessario.
Se il lettore ha avuto una certa esperienza con i servlet, apprezzerà la semplicità del server Blazix rispetto ad altri server Java, come Tomcat.
Per iniziare subito, diamo un'occhiata a un semplice esempio, un servlet alcuni-servlet (Listato 4.1).
Listato 4.1. Servlet SomeServlet.java I
importa java.io.*; importa javax.servlet.*; importa javax.servlet.http.*;
la classe pubblica SomeServlet estende HttpServlet ( public void doGet(richiesta HttpServletRequest,
HttpServletResponse risposta) lancia ServletException, IOException ( Printwriter out = risposta.getWriter(); out.println("Hello World");
Nel file di configurazione del server Web, scrivere quanto segue:
servlet.name: primo
servlet.first.className: SomeServlet
servlet.first.url: /dofirst
Quindi apparirà la chiamata al servlet dal browser http://localhost:81 /dofirst (Figura 4.2).
Le servlet Java forniscono un metodo indipendente dalla piattaforma per creare applicazioni Web (questo non è indiscutibile, ma non approfondiremo ulteriormente la questione, poiché in quel caso dovremo decidere cosa intendiamo per applicazione Web, che non è inclusa nell'elenco degli argomenti trattati) e molte applicazioni. Sono veloci nel funzionamento e prive delle limitazioni che hanno le applicazioni CGI. Una servlet viene eseguita sotto il controllo di un server Web e, a differenza di un'applet, non richiede un'interfaccia utente grafica. La servlet interagisce con il server scambiando con esso richieste e risposte. Il programma client effettua richieste al server. La richiesta viene elaborata dal server, passata al servlet e il servlet invia una risposta tramite il server al client. Oggi, i servlet sono molto popolari quando si creano applicazioni Web interattive. Esistono molti server Web in grado di gestire servlet, inclusi Tomcat, iPlanet Web Server (in precedenza Netscape
Enterprise Server), Blazix. J Builder Enterprise utilizza il Borland Enterprise Server (BES) incluso e supporta anche Server Web Logica, WebSphere e iPlanet. J Builder Enterprise Server include un server Tomcat predefinito.
Riso. 4.2. Chiamare un servlet
Un vantaggio importante dei servlet è la loro velocità. A differenza delle applicazioni CGI, le servlet vengono caricate in memoria una sola volta e quindi eseguite direttamente dalla memoria. Le servlet sono essenzialmente applicazioni multi-thread. Inoltre, sono indipendenti dalla piattaforma poiché sono scritti in Java.
Tecnologia JSP, a cui è dedicata Il capitolo 3 è un'estensione della tecnologia servlet a JSP Attenzione speciale si concentra sul lavoro con documenti HTML e XML. I frammenti JSP trovano il loro utilizzo più comune come parte del codice HTML e XML. Come fare una scelta e decidere se utilizzare servlet o pagine server? Le servlet sono più adatte a risolvere problemi di programmazione di basso livello e meno adatte a risolvere problemi di creazione della logica di presentazione dell'applicazione. Le pagine del server JSP, invece, si concentrano principalmente su come presentare il risultato all'utente nel modo più conveniente. Le pagine lato server vengono create incorporate nel codice HTML utilizzando lo stile di creazione dei documenti HTML. La tecnologia JSP offre funzionalità molto più ricche rispetto al semplice HTML. Le pagine JSP possono fornire la possibilità di implementare la logica dell'applicazione utilizzando semplici componenti Java nonché componenti server EJB creando librerie di collegamenti personalizzate. Le stesse pagine del server Java possono essere componenti logici di presentazione modulari e riutilizzabili che possono essere utilizzati insieme a vari modelli e filtri. Le pagine JSP vengono convertite in servlet, quindi in teoria è possibile utilizzare esclusivamente servlet. Tuttavia, la tecnologia JSP è stata creata per semplificare il processo di creazione di documenti Web separando la logica di presentazione dell'applicazione dal contenuto del documento. Nella maggior parte dei casi, la risposta inviata al cliente è composta sia da modelli di presentazione del documento, sia da dati generati automaticamente compilando il modello. In tali situazioni risulta molto più semplice lavorare con JSP che con i servlet.
Una delle cose migliori di Java è la sua natura versatile. Naturalmente, la creazione di desktop tradizionali e persino applicazioni mobili- E' grandioso. Ma cosa succede se vuoi uscire dai sentieri battuti ed entrare nel territorio dello sviluppo di applicazioni web in Java? Ce n'è uno per te buone notizie: Il linguaggio viene fornito con un'API Servlet completa che consente di creare applicazioni Web affidabili senza troppi problemi.
Creazione di applicazioni Java con servlet
Quindi, abbiamo già creato i file di configurazione dell'applicazione. Tuttavia, nel suo stato attuale, non fa letteralmente nulla. Vogliamo che i clienti siano in grado di registrarsi utilizzando un modulo HTML, quindi la prossima cosa che dobbiamo fare è creare file JSP che visualizzeranno il modulo sopra e i dettagli del cliente una volta completata con successo la registrazione. Questo è ciò che faremo ora.
Stiamo lavorando sull'aspetto
L'aspetto dell'applicazione sarà definito da due file JSP: nel contesto MVC questi sono chiamati visualizzazioni. Il primo sarà responsabile della visualizzazione del modulo di registrazione e possibili errori, richiamato dopo aver controllato i dati inseriti. La seconda sarà una normale pagina di benvenuto che mostrerà i dati inseriti dal cliente una volta completata con successo la procedura di registrazione.
Ecco il primo file JSP:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Registrazione
$(violazione).
Il file contiene semplice HTML con un paio di aggiunte. Questa è la bellezza di JSP combinato con JSTL e JEL. Nota quanto è facile verificare gli errori di convalida utilizzando tag standard come<с:if>E
L'attributo action del modulo di registrazione punta al seguente URL: $(pageContext.request.contextPath)/processcustomer . Ciò significa che ogni volta che un cliente tenta di registrarsi, i dati verranno inviati a processcustomer indipendentemente dall'URL da cui si accede al modulo. Ciò si ottiene attraverso la funzionalità degli oggetti disponibili dal file JSP, come request .
Vedremo presto come la servlet si lega all'URL processcustomer e come interagisce con l'input. Per ora, diamo un'occhiata al file JSP responsabile della pagina di benvenuto:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Grazie per la registrazione!
I tuoi dati inseriti:
Nome:$(nome)
Cognome:$(cognome)
E-mail:$(e-mail)
Ora che abbiamo compreso il rendering della pagina, il passo successivo è creare una servlet responsabile della raccolta dei dati del cliente dalle richieste POST e della convalida dei dati in modo semplice.
Scrivere un controllore
Scrivere un servlet in grado di recuperare dati da un modulo di registrazione non potrebbe essere più semplice. Tutto quello che dobbiamo fare è scrivere una sottoclasse della classe HttpServlet e implementare i suoi metodi doGet() o doPost() (o entrambi, se necessario). In questo caso la servlet interagirà con i dati provenienti dalle richieste POST.
Ecco come appare:
@WebServlet(name = "CustomerController", urlPatterns = "/processcustomer") la classe pubblica CustomerController estende HttpServlet ( @Override protected void doPost(richiesta HttpServletRequest, risposta HttpServletResponse) genera ServletException, IOException ( RequestCustomer cliente = RequestCustomer.fromRequestParameters(richiesta); cliente .setAsRequestAttributes(richiesta); Elenca violazioni = cliente.validate(); if (!violations.isEmpty()) ( request.setAttribute("violations", violazioni); ) String url = determineUrl(violations). , risposta); ) private String determineUrl(Elenco violazioni) ( if (!violations.isEmpty()) ( return "/"; ) else ( return "/WEB-INF/views/customerinfo.jsp"; ) ) classe statica privata RequestCustomer ( private final String firstName; private final String lastName; private final String email; private RequestCustomer(String firstName, String lastName, String email) ( this.firstName = firstName; this.lastName = lastName; this.e-mail = e-mail; ) public static RequestCustomer fromRequestParameters(richiesta HttpServletRequest) ( restituisce nuovo RequestCustomer(request.getParameter("nome"), request.getParameter("cognome"), request.getParameter("email")); ) public void setAsRequestAttributes(richiesta HttpServletRequest) ( request.setAttribute("nome", nome); request.setAttribute("cognome", cognome); request.setAttribute("email", email); ) public List validate() ( Violazioni dell'elenco = new ArrayList<>(); if (!StringValidator.validate(firstName)) ( violazioni.add("Il nome è un campo obbligatorio"); ) if (!StringValidator.validate(lastName)) ( violazioni.add("Il cognome è un campo obbligatorio") ; ) if ( !EmailValidator.validate(e-mail)) ( violazioni.add("L'e-mail deve essere ben formattata"); ) restituisce violazioni; ) ) )
La prima cosa da notare qui è l'uso dell'annotazione @WebServlet(name ="CustomerController", urlPatterns = "/processcustomer"). Indica al contenitore servlet di utilizzare la classe CustomerController per gestire le richieste HTTP a /processcustomer . Lo stesso effetto può essere ottenuto aggiungendo direttive di mappatura servlet a web.xml in questo modo, ma poiché stiamo utilizzando la specifica Servlet 3.1 non è necessario farlo.
Qui abbiamo chiamato il servlet CustomerController perché è considerata buona pratica utilizzare il nome della classe servlet come valore dell'attributo name dell'annotazione @WebServlet. In caso contrario, alcuni contenitori non potranno corrispondere, generando un errore 404.
La stessa classe CustomerController fa alcune semplici cose. Innanzitutto, raccoglie l'input del modulo utilizzando un'implementazione dell'interfaccia HttpServletRequest, che contiene valori corrispondenti ai campi nome, cognome ed email del modulo. Quindi imposta questi valori come attributi della query in modo che possano essere nuovamente visualizzati nel modulo o nella pagina dei risultati. Infine, i validatori controllano la correttezza dei dati inseriti.
I validatori sono classi semplici che controllano determinate proprietà, ad esempio se una stringa è vuota o se l'e-mail assomiglia a un'e-mail. Puoi vedere la loro implementazione sul GitLab dell'autore.
Il risultato della convalida influenza l'ulteriore corso degli eventi: se i dati non sono validi, il client viene reindirizzato tramite l'oggetto RequestDispatcher alla pagina di registrazione, dove vengono visualizzati gli errori corrispondenti. Se tutto è in ordine, viene visualizzata la pagina di benvenuto.
Quindi, abbiamo creato un'intera applicazione web in Java che ti consente di registrare i client utilizzando un modulo HTML, un servlet di base e alcuni file JSP. E' ora di lanciarlo.
Avvia l'applicazione
Per avviare l'applicazione è necessario completare i seguenti passaggi:
IDEA IntelliJ). Quando distribuisci il progetto e lo esegui, il browser predefinito dovrebbe avviarsi con una finestra di registrazione.
Conclusione
Hai quindi acquisito tutte le competenze necessarie per creare la tua applicazione web in Java senza dover ricorrere a framework complessi. Tutto ciò di cui hai bisogno è un'API Servlet, una tecnologia come JSP per il rendering e strumenti Java nativi. Fantastico, vero?
Vale la pena notare che l'implementazione della classe CustomerController evidenzia i punti di forza e di debolezza delle servlet: da un lato mostra brevemente quanto sia facile elaborare i parametri della richiesta e inviare risposte al client in formati diversi. Ma questa funzionalità ha un prezzo: entrambe le implementazioni delle interfacce HttpServletResponse e HttpServletResponse sono normali localizzatori di servizi. Questo non vuol dire che sia una cosa negativa, poiché i localizzatori contengono semplicemente dati. Tuttavia, è necessario ricordare che queste implementazioni saranno sempre legate alla servlet.
Servletè un programma Java che viene eseguito sul lato server di un'applicazione web. Proprio come le applet si espandono dinamicamente funzionalità I servlet del browser Web estendono dinamicamente la funzionalità del server Web.
Lavoro servlet"e può essere descritto come segue: quando arriva una richiesta da un client, il server Web, utilizzando uno speciale file di configurazione, può determinare quale servlet deve essere eseguito. Successivamente, il server Web avvia la JVM, che a sua volta esegue il servlet elabora la richiesta e trasferisce il contenuto al Web - al server (possibilmente sotto forma di una pagina HTML). Il server Web invia la risposta al client (una pagina HTML generata dal servlet).
Un server WEB è essenzialmente una sorta di contenitore che carica servlet"s, li esegue e, dopo aver ricevuto il risultato da loro, lo invia al client.
Servlet nell'architettura delle applicazioni Web
Grazie alla sua potenza e flessibilità, servlet"possono svolgere un ruolo significativo nell'architettura del sistema. Possono eseguire attività applicative destinate al middleware, agire come proxy per il client e persino migliorare la funzionalità del middleware aggiungendo il supporto per nuovi protocolli e altre funzionalità. Il middleware funziona come un server delle applicazioni in un cosiddetto sistema client-server a tre livelli e si trova tra un client leggero, come un browser Web, e l'origine dati.
Servlet come server proxy
Per supportare le applet, i servlet possono fungere da proxy. Ciò può essere importante poiché la sicurezza Java consente alle applet di connettersi solo al server da cui sono state scaricate. Se l'applet deve connettersi a un server di database situato su un'altra macchina, servlet può creare questa connessione per l'applet.
Temporaneo e permanente servlet"S
I servlet possono essere avviati e arrestati per ciascuna richiesta del client. Possono anche essere lanciati all'avvio del server Web ed esistere fino all'arresto. Temporaneo servlet"vengono caricati su richiesta e offrono un buon modo per risparmiare risorse del server per funzioni utilizzate raramente. I servlet persistenti vengono caricati all'avvio del server Web e durano fino all'arresto. I servlet vengono installati come estensioni persistenti sul server se il costo dell'esecuzione sono molto elevati (come stabilire una connessione al database) se offrono funzionalità persistenti lato server (come un servizio RMI) o nei casi in cui devono rispondere alle richieste del client il più rapidamente possibile assegnare. servlet"e permanente o temporaneo; questa è una funzione di impostazione del server Web.
Ciclo di vita della servlet, javax.servlet.Servlet
Le servlet vengono eseguite sulla piattaforma del server Web come parte dello stesso processo del server Web stesso. Il server Web è responsabile dell'inizializzazione, del richiamo e della distruzione di ciascuna istanza della servlet. Il web server interagisce con la servlet attraverso una semplice interfaccia: javax.servlet.Servlet.
L'interfaccia javax.servlet.Servlet include tre metodi principali:
- dentro()
- servizio()
- distruggere()
e due metodi di supporto:
- getServletConfig()
- getServletInfo()
Somiglianze tra le interfacce servlet"e l'applet Java sono ovvi. È stato progettato esattamente così! Le servlet Java stanno ai server Web come le applet stanno ai browser Web. L'applet viene eseguita nel browser Web, eseguendo azioni su sua richiesta attraverso un'interfaccia speciale. La servlet fa il stessa cosa quando si lavora su un server Web.
Inizializzazione servlet, metodo init()
Quando il servlet viene caricato per la prima volta, viene chiamato il metodo init(). Ciò consente al servlet di eseguire qualsiasi lavoro di configurazione, come l'apertura di file o la creazione di connessioni ai propri server. Se il servlet è installato in modo permanente sul server, viene caricato all'avvio del server. Altrimenti, il server attiva la servlet quando riceve la prima richiesta da un client di eseguire il servizio fornito da quella servlet.
È garantito che il metodo dentro() terminerà prima di qualsiasi altra chiamata al servlet, ad esempio una chiamata al metodo servizio(). notare che dentro() verrà chiamato una sola volta; non verrà chiamato finché il servlet non verrà scaricato e quindi caricato nuovamente dal server.
Metodo dentro() accetta un argomento: un riferimento a un oggetto ServletConfig, che contiene gli argomenti per inizializzare la servlet. Questo oggetto ha un metodo getServletContext() restituire un oggetto ServletContext, che contiene informazioni sull'ambiente del servlet.
Nucleo della servlet, metodo service()
Metodo servizio()è il cuore della servlet. Ogni richiesta del client risulta in una chiamata al metodo servizio(). Questo metodo legge la richiesta e genera un messaggio di risposta utilizzando i suoi due argomenti ServletRequest e ServletResponse:
Quindi ci sono due modi per passare le informazioni dal client al servlet. Il primo avviene attraverso il passaggio di valori nei parametri della richiesta. I valori dei parametri possono essere inseriti nell'URL. Il secondo modo per passare informazioni da un client a un servlet è tramite un InputStream (o Reader).
Come funziona il metodo servizio()è essenzialmente semplice: crea una risposta per ogni richiesta del client passata dal server. Tuttavia, è necessario ricordare che potrebbero esserci più richieste parallele elaborate contemporaneamente. Se il metodo servizio() richiede risorse esterne, come file, database, quindi è necessario garantire che l'accesso alle risorse sia thread-safe.
Scaricamento di un servlet, metodo destroy()
Metodo distruggere() chiamato a rilasciare tutte le risorse (ad esempio, aprire file e connessioni al database) prima di scaricare il servlet. Questo metodo può essere vuoto se non è necessario eseguire operazioni di finitura. Prima di chiamare il metodo distruggere() il server attende il completamento di tutte le operazioni di manutenzione oppure la scadenza di un certo periodo di tempo. Ciò significa che il metodo distruggere() può essere chiamato durante l'esecuzione di alcuni metodi a lunga esecuzione servizio().
È importante formalizzare il metodo distruggere() in modo tale da evitare di chiudere le risorse necessarie fino a esaurimento delle chiamate servizio() non verrà completato.
Configurazione servlet, metodo getServletConfig()
Metodo getServletConfig() restituisce un riferimento a un oggetto che implementa l'interfaccia ServletConfig. Questo oggetto fornisce l'accesso alle informazioni di configurazione del servlet, ad es. accesso ai parametri di inizializzazione del servlet e all'oggetto del contesto del servlet ServletContext, che dà accesso alla servlet e al suo ambiente.
Informazioni sulla servlet, metodo getServletInfo()
Metodo getServletInfo() definito dal programmatore che crea il servlet per restituire una stringa contenente informazioni sul servlet, come l'autore e la versione del servlet.
Interfaccia ServletRequest
ServletRequest fornisce informazioni al client sui parametri della richiesta HTTP al servlet, ad es. fornisce dati inclusi nome e valori dei parametri, attributi e flusso di input. Queste informazioni vengono passate al metodo servizio().
Prossimo esempio di servlet mostra come ottenere informazioni da un parametro richiesta metodo servizio():
Lettore di lettori bufferizzato; Stringa parametro1; Stringa parametro2; servizio public void(richiesta ServletRequest, risposta ServletResponse) ( reader = request.getReader(); param1 = request.getParameter("Primo"); param2 = request.getParameter("Secondo"); )
Ulteriori informazioni sulla richiesta sono disponibili alla servlet tramite metodi, i principali dei quali sono riportati nella tabella seguente:
getAttributo() | Restituisce il valore dell'attributo specificato di questa richiesta. |
getContentLength() | Richiedere la taglia, se nota. |
getContentType() | Restituisce il tipo MIME del corpo della richiesta. |
getInputStream() | Restituisce un InputStream per leggere i dati binari dal corpo della richiesta. |
OttieniNomiParametri() | Restituisce un array di stringhe con i nomi di tutti i parametri. |
getParameterValues() | Restituisce una matrice di valori per il parametro specificato. |
getProtocollo() | Restituisce il protocollo e la versione della richiesta come una stringa simile |
getReader() | Restituisce un BufferedReader per recuperare il testo dal corpo della richiesta. |
getRealPath() | Restituisce il percorso reale per il percorso virtuale specificato. |
getRemoteAddr() | Indirizzo IP del client che ha inviato questa richiesta. |
getRemoteHost() | Il nome host della macchina client che ha inviato questa richiesta. |
getSchema() | Restituisce lo schema utilizzato nell'URL di questa richiesta (ad esempio https, http, ftp e così via). |
getNomeServer() | Il nome host del server che ha accettato questa richiesta. |
getServerPort() | Restituisce il numero di porta utilizzato per ricevere questa richiesta. |
Interfaccia di risposta servlet
Interfaccia ServletResponseè uno strumento per inviare dati al client. Tutti i metodi di questo strumento servono specificamente a risolvere questo problema:
Public java.lang.String getCharacterEncoding() public void setLocale(java.util.Locale loc) public java.util.Locale getLocale()
Il primo metodo restituisce il tipo di codifica MIME (ad esempio UTF8) in cui verranno visualizzate le informazioni. I secondi due metodi funzionano anche con il set di caratteri. Indicano la lingua utilizzata nel documento (ad esempio, russo).
Public ServletOutputStream getOutputStream() genera java.io.IOException
Il metodo getOutputStream restituisce il flusso di output per il servlet. Questo flusso viene utilizzato, ad esempio, per generare file binari. I dati di testo possono essere emessi utilizzando java.io.Writer:
Il pubblico java.io.PrintWriter getWriter() genera java.io.IOException
Il metodo getWriter() converte automaticamente le stringhe nel set di caratteri specificato nei metodi getCharacterEncoding() e getLocale().
Public void setContentLength(int len)
Il metodo setContentLength imposta il valore del campo dell'intestazione HTTP "Content-Length"
Public void setContentType(tipo stringa)
Il metodo setContentType viene utilizzato per inviare il tipo di contenuto MIME del documento. Campo dell'intestazione HTTP "Content-Type".
Il flusso di dati in uscita viene bufferizzato. Ciò significa che un dato verrà inviato al client solo dopo che il buffer sarà pieno.
Public void setBufferSize(int size) public int getBufferSize() public void flushBuffer() genera java.io.IOException public void resetBuffer()
I 4 metodi precedenti consentono, rispettivamente, di impostare la dimensione del buffer di invio, di ottenerne la dimensione, di inizializzare l'invio del contenuto del buffer al client senza attendere che venga riempito e anche di cancellare questo buffer di dati.
Booleano pubblico isCommit()
Utilizzando il metodo isComtched è possibile ottenere un flag che indica se l'invio dei dati al client è già iniziato. Il flag sarà positivo se l'intestazione della risposta HTTP è già stata inviata.
Reset pubblico dell'annullamento()
Se l'intestazione HTTP non è stata ancora inviata, il metodo reset "ripristina" l'intestazione HTTP ai suoi valori predefiniti.
Grafici JFreeChart nei servlet
La libreria grafica JFreeChart può essere utilizzata nei servlet per creare grafici e visualizzarli sulle pagine del sito Web come immagini. Vengono presentati i dettagli della descrizione e gli esempi di utilizzo di JFreeChart nelle servlet.
Servlet con libreria grafica Chart.js
JNI nel servlet
In alcuni casi potrebbe essere necessario utilizzare JNI in un'applicazione WEB. Viene presentato un esempio di utilizzo di JNI nei servlet.
Messaggi JMS in un servlet
La servlet può essere utilizzata per comunicare JMS messaggi tra applicazioni. Viene presentato un esempio di utilizzo di un servlet per inviare e leggere messaggi JMS in un contenitore JBoss.
Java Servlet è un programma lato server scritto nell'omonimo linguaggio di programmazione, che riceve segnali dal client e gli invia risposte. È l'elemento chiave che costituisce il tipico Java EE, oltre a JSP, EJB, XML e altre tecnologie correlate. L'applicazione può essere inserita in un pacchetto Fascicolo GUERRA(Web AR chive) per la distribuzione su un server web. Un server che può eseguire un servlet Java è chiamato contenitore. Un programma che viene eseguito su un server di questo tipo può creare pagine Web dinamiche.
Servlet Java: nozioni di base
I contenitori più popolari e ampiamente utilizzati sono Tomcat e JBoss. Tecnicamente, una servlet è una normale classe Java che ha un'estensione per il protocollo Common Client-Server o HTTP. In pratica viene utilizzato per elaborare le richieste tramite rispettivamente gli override HttpServlet GET e POST. Il contenitore Java Servlet fornisce Http.ServletRequest e Http.ServletResponse, che sono oggetti di richiesta-risposta. E viene solitamente utilizzato in combinazione con JSP per generare contenuto dinamico.
Scenario tipico del modello:
I filtri servlet Java sono componenti plug-in Java utilizzati per intercettare ed elaborare le richieste prima che vengano inviate ai servlet e rispondere dopo il completamento del codice e prima che il contenitore invii la risposta al client.
Attività comuni eseguite con i filtri:
I filtri sono abilitati e configurati in un file descrittore di distribuzione (web.xml). Servlet e filtri non si conoscono, quindi puoi aggiungere o rimuovere un filtro semplicemente modificando il file web.xml. È possibile avere più filtri per una risorsa o creare una catena di filtri per web.xml o eseguire filtri Java Servlet che implementano l'interfaccia javax.servlet.Filter.
Le richieste parallele al server vengono elaborate dai thread, che forniscono importanti qualità del web: multithreading e parallelismo.
Funzioni principali:
La necessità di utilizzare pagine web dinamiche
Ci sono molte ragioni per cui un'azienda vorrebbe creare pagine web dinamiche al volo, ad esempio quando i dati sul sito web cambiano frequentemente. I siti di notizie e meteo in genere si affidano alla CGI per mantenere i contenuti aggiornati senza richiedere la costante attenzione degli sviluppatori. Le pagine web di e-commerce che elencano i prezzi correnti e i livelli di inventario utilizzano CGI per recuperare questo contenuto su richiesta, estraendolo dall'infrastruttura interna dell'azienda.
Molti utenti hanno esperienza nell'utilizzo della tecnologia Java per creare servizi Web basati su CGI, ma i servlet Java sono più efficienti, più potenti, più facili da usare e più economici rispetto alle tradizionali alternative CGI.
Vantaggi dei servlet Java:
Sono passati quasi vent'anni dall'avvento del linguaggio di programmazione Java. Durante questo periodo, si prevedeva che Java sarebbe morto e sarebbe stato dimenticato; i programmatori ridevano della sua lentezza e avidità di risorse. Ma c'erano anche quelli che credevano in Java, hanno sviluppato tutti i tipi di librerie, sviluppato la comunità, dimostrato con insistenza che non ci sono limiti per Java: in tempo reale, incorporato, AI: tutto è possibile. Abbiamo deciso di non restare da parte e di realizzare una piccola serie di articoli su Java in questa sezione. Andare!
La tua teiera sceglie Java
Secondo la stessa Oracle, oggi il virtuale macchina Java installato su più di tre miliardi di dispositivi. E non si tratta solo di computer e smartphone, ma anche di fotocamere, televisori, lettori Blu-ray, stampanti, carte SIM, bancomat e persino automobili. Questo elenco crescerà costantemente e, con esso, le offerte dei datori di lavoro per i programmatori Java. Anche adesso, il numero di offerte di lavoro per i programmatori Java supera il resto. E le aziende sono disposte a pagare sempre di più, attirando i dipendenti e organizzando condizioni di lavoro più favorevoli.
Per cosa è buono?
I programmatori Java sono attratti dal minimalismo della sua sintassi. Nessun modificatore o parola funzione non necessaria. Anche l'assenza di ereditarietà multipla, che all'inizio confondeva un po' i programmatori C++, alla fine si rivela ragionevole e giustificata. Logica semplice, lavoro automatico con memoria, documentazione dettagliata, forum con risposte a tutti i tipi di domande, open source: tutto ciò consente di comprendere rapidamente il processo di sviluppo e riduce significativamente il numero di potenziali errori. Anche i contadini indiani padroneggiano Java in un paio di mesi, almeno così dicono i loro diplomi :). Inoltre, Java è un linguaggio interpretato. Il compilatore converte il codice sorgente nel cosiddetto bytecode, che è facile da riconvertire, il che rende Java particolarmente interessante per il reverse engineering.
Bene, cominciamo
Java è un linguaggio orientato agli oggetti, il che significa che tutte le variabili, i metodi e le costanti sono dichiarati all'interno di una classe. Oltre alle classi, esistono anche le interfacce: uno speciale costrutto astratto che consente di descrivere il comportamento di un oggetto senza specificare un'implementazione specifica. E se in Java non esiste un'ereditarietà multipla delle classi, una classe può implementare un numero qualsiasi di interfacce, il che consente a un oggetto di avere molte funzioni, ma di fornirne solo alcune.
I tipi di dati possono essere divisi in due gruppi: semplici (int, long, char e così via) e tipi di oggetto: classi, interfacce, array. I tipi semplici hanno sempre e ovunque una dimensione fissa. Ad esempio, su qualsiasi architettura e dispositivo, int occupa quattro byte di memoria. Questo è abbastanza conveniente per i calcoli. L'array di dati contiene un attributo di lunghezza speciale, che memorizza la dimensione dell'array, per il quale un ringraziamento speciale agli sviluppatori. Diversi tipi di dati vengono passati ai metodi in modo diverso. I tipi semplici vengono sempre passati per valore. Oggetto: sempre per riferimento per risparmiare memoria. Ciò significa che se passiamo int a = 10 e cambiamo il suo valore in 5 nel metodo chiamato, allora nel metodo originale a sarà ancora 10. Ma se cambiamo una proprietà dell'oggetto, allora cambierà nel metodo originale .
Ricorda la memoria
Sebbene il programmatore Java sia libero dalla necessità di allocare e deallocare memoria, l'ignoranza di alcune funzionalità operative macchina virtuale e il garbage collector può facilmente trasformare il tuo programma in un mostro insaziabile, divorando il tempo della CPU e tutta la memoria disponibile.
Quando crei un nuovo array, ricorda sempre che è molto più semplice creare tanti piccoli pezzi di memoria che uno enorme. Altrimenti rischi di incappare in un errore di memoria esaurita, il che significa più o meno che avevi memoria, ma è tutta sparita.
Molti programmatori, quando passano a Java e scoprono la pulizia automatica della memoria, iniziano a creare oggetti in grandi quantità, sperando che tutto si risolva da solo. Nel frattempo, un netturbino è come una macchina che può rimuovere solo la spazzatura che viene gettata in un bidone della spazzatura vicino alla casa. Se non hai più bisogno di alcuni dati, non dovresti memorizzarli per ogni evenienza, come un mucchio di vecchie cartoline: assegna null al puntatore dati e aiuta il custode a ripulire :). È anche una buona idea cancellare l'elenco se non ne hai più bisogno. Ricorda, l'oggetto rimarrà in memoria finché ci saranno riferimenti ad esso nel codice. Anche se il tuo programma funziona con 16 giga di memoria e non corre il rischio di bloccarsi con Memoria esaurita, a causa di un eccesso di memoria utilizzata diventerà sempre più goffo e lento. Il 99% dei reclami degli utenti relativi ai programmi Java lenti sono dovuti a scritti inefficienti codice sorgente. Se hai bisogno di creare costantemente oggetti che vengono utilizzati rapidamente e che non sono più necessari, ad esempio molti piccoli messaggi, valuta la possibilità di creare un pool che memorizzerà un numero di istanze per un uso ripetuto. Ricorda, creare ed eliminare un oggetto è un'operazione costosa.
Mettiamoci al lavoro, signori.
Un esempio vale più di mille parole. Puoi scorrere il manuale e guardare le hellowords standard senza di noi, quindi supponiamo che tu lo abbia già fatto e che tu sia pronto per implementare un esempio più interessante.
Tu ed io ci impegneremo nell'applicazione lato server di Java e scriveremo un piccolo programma per "monitorare" gli utenti social networks. Per fare questo, non è nemmeno necessario trovare un lavoro presso la NSA: gli utenti pubblicano tutto per se stessi e tutto ciò che dobbiamo fare è ricevere queste informazioni, sistematizzarle e visualizzarle magnificamente. Prendiamo uno dei popolari servizi sociali, ad esempio foursquare, e disegna gli spostamenti dei nostri amici sulla mappa.
Per prima cosa, vediamo cosa possiamo ottenere da Foursquare. Dopo aver esaminato le pagine degli sviluppatori, rivolgiamo la nostra attenzione a due metodi:
- https://developer.foursquare.com/docs/users/checkins - luoghi visitati dall'utente. Purtroppo per ora è supportato solo per un utente registrato al programma, e si vocifera che a causa di limitazioni implementative rimarrà tale;
- https://developer.foursquare.com/docs/checkins/recent - luoghi visitati dagli amici dell'utente registrato. Se giochi un po' con questa funzione, diventa chiaro un fatto triste: per ogni amico viene restituito esattamente un posto: l'ultimo posto in cui ha effettuato il check-in.
Per utilizzare l'API Foursquare, devi registrare la nostra futura applicazione, andare a questo indirizzo: https://ru.foursquare.com/developers/register e compilare i campi (sì, dovrai registrarti anche in Foursquare stesso, ma puoi farlo benissimo senza di me).
Tra i campi importanti qui, possiamo solo notare "Nome applicazione", "URL download / pagina di benvenuto" (inserisci qui un indirizzo web personalizzato) e "URI di reindirizzamento" - questo è l'indirizzo a cui il server ci invierà dopo la registrazione. Inseriremo qui il valore desiderato in seguito, ma per ora puoi semplicemente inserire qualsiasi indirizzo web. Fai clic su "Salva" e la nostra applicazione tracker sarà registrata con successo.
Salendo verso le nuvole
Captain Obvious comunica che qualsiasi applicazione server richiede un server per funzionare. Creare un server da soli è una seccatura, quindi utilizzeremo le soluzioni cloud attualmente più diffuse. Il cloud sarà sponsorizzato da Google Corporation perché il loro Google App Engine è gratuito e abbastanza facile da configurare e utilizzare. Innanzitutto, vai qui e scarica l'SDK di Google App Engine per Java.
Ora puoi iniziare a creare il progetto. Per lo sviluppo Java utilizzo IntelliJ IDEA, ma puoi utilizzare l'ambiente Eclipse gratuito e altrettanto noto.
Selezioniamo un nuovo progetto Java. Chiamiamolo nsa_tracker.
Nella scheda successiva, contrassegna Applicazione Web e Google App Engine a sinistra e indica il percorso dell'SDK di App Engine precedentemente scaricato e decompresso.
Ora siediti e lascia che l'IDE faccia il suo dovere. Se hai scelto IDEA e hai fatto tutto correttamente, di conseguenza vedrai un progetto finito che, una volta avviato, apre una finestra del browser con contenuto vuoto. Puoi iniziare a programmare.
Cominciamo a cercare
Quindi, abbiamo una cartella di progetto, che contiene la cartella src. Metteremo lì le fonti. Le origini Java sono raggruppate in pacchetti. Un pacchetto è una cartella su disco. I pacchetti sono necessari per non scaricare tutte le fonti in un mucchio, ma per separarle, guidate dai principi della logica. Ad esempio, il codice relativo all'interfaccia utente verrebbe logicamente inserito nel pacchetto ui, le interazioni di rete nel pacchetto network. Ciò facilita notevolmente lo sviluppo e il supporto del progetto in un secondo momento. Storicamente, la pratica era quella di iniziare la struttura del pacchetto con il nome dell'azienda seguito dal nome del programma. Ciò ti aiuterà a identificare facilmente le nostre fonti tra una serie di fonti simili in futuro. Per il nostro programma creeremo un pacchetto org.nsa.tracker. Creeremo delle classi al suo interno.
Le servlet vengono utilizzate sul server per elaborare le richieste degli utenti. Una servlet è una classe che, di regola, eredita HttpServlet e funziona secondo il principio richiesta-risposta. Tutto ciò che serve è sovrascrivere il metodo doGet. Su richiesta dell'utente, dobbiamo accedere a Foursquare, scaricare l'elenco dei check-in degli amici e reindirizzare la richiesta alla pagina con la mappa.
Per lavorare con l'API foursquare, utilizzeremo la libreria gratuita foursquare-api-java, che può essere presa da qui. Una libreria Java è un archivio ZIP con estensione jar contenente classi Java compilate che implementano funzionalità specifiche. Per l'autorizzazione avremo bisogno di ClientId e ClientSecret, ottenuti durante la fase di registrazione dell'applicazione in Foursquare. Poiché questi parametri non cambiano durante l'esecuzione del programma, li dichiareremo come costanti.
Stringa finale statica privata CLIENT_ID = "FAKE_CLIENT_ID"; private static final String CLIENT_SECRET = "FAKE_CLIENT_SECRET";
Finale significa che a questa variabile è stato assegnato un valore finale che non può essere modificato. Static rende una variabile disponibile a tutte le istanze di una determinata classe. Utilizzando l'esempio di autorizzazione della libreria foursquare-api-java, otteniamo approssimativamente il seguente codice:
Protected void doGet(HttpServletRequest req, HttpServletResponse resp) genera ServletException, IOException ( FoursquareApi foursquareApi = new FoursquareApi(CLIENT_ID, CLIENT_SECRET, CALLBACK_URL); String code = req.getParameter("code"); if (code == null) ( // Vai alla pagina di registrazione resp.sendRedirect(foursquareApi.getAuthenticationUrl()); else ( try (foursquareApi.authenticateCode(code); // La registrazione è riuscita, carica i dati dei risultati
Notare "genera ServletException, IOException" nella dichiarazione del metodo. Questa riga significa che il metodo potrebbe potenzialmente generare una di queste eccezioni. Un'eccezione in Java è un oggetto che segnala il verificarsi di una situazione eccezionale. Sono verificabili e non verificabili. Le eccezioni controllate devono essere gestite circondando parte del codice con un blocco try-catch o passando sopra. Le eccezioni non controllate generalmente non vengono gestite perché si verificano quando il programma non è in grado di ripristinare il proprio stato. In questo metodo gestiamo solo FoursquareApiException.
Quando il server Web riceve una richiesta per un'applicazione, utilizza il descrittore di distribuzione per abbinare l'URL della richiesta al codice che dovrebbe gestire la richiesta. Il descrittore di distribuzione è un file XML chiamato web.xml. Aggiungiamo una descrizione del servlet di tracciamento.
Ora le richieste a /track verranno elaborate dal nostro servlet denominato TrackerServlet. È possibile impostare il parametro Callback URL sul valore corretto http://localhost:8080/track.
Per visualizzare i risultati è possibile utilizzare le Static Maps API, gentilmente fornite dalla stessa società Google (https://developers.google.com/maps/documentation/staticmaps/). Il nostro servlet genererà una semplice pagina HTML e la restituirà in risposta alla richiesta dell'utente.
StringBuilder sb = new StringBuilder("
- "); indice = 1; for (Checkin checkin: result.getResult()) ( sb.append("
Per generare la pagina viene utilizzata la classe StringBuilder, questo è dovuto al fatto che le stringhe in Java sono oggetti immutabili. Quando si concatenano stringhe utilizzando l'operatore +. è creato nuova linea in mente. StringBuilder risparmia memoria utilizzando un array di caratteri per archiviare le stringhe da unire. Inviamo la risposta all'utente:
Byte resultBytes = sb.toString().getBytes("utf-8"); resp.setContentLength(resultBytes.length); resp.getOutputStream().write(resultBytes);
...E tutto è pronto. Lo lanciamo e vediamo qualcosa di simile a un'immagine con la scritta "Risultato del programma".
Qual è il prossimo?
L'applicazione può essere migliorata, ad esempio separando la raccolta e la visualizzazione dei dati. Sposta la raccolta dei dati in un servizio separato che funzionerà costantemente e ricorderà tutti i movimenti degli utenti nel database. Quindi sarà possibile visualizzare non i singoli punti, ma un percorso collegato. Scavando un po' nell'API Foursquare, puoi estrarre ancora più informazioni sull'attività dell'utente.
Ma spero di essere riuscito nella cosa principale: convincerti che Java è semplice e interessante. Ci vediamo tra un mese!
Libri per programmatori Java
Ti consigliamo di iniziare ad imparare la lingua con il libro “Java. Java: una guida per principianti di Herbert Schildt. Il livello successivo è “Java. Guida completa» da lui e puoi imparare di più sui servlet dal libro "Java Servlets and JSP: A Collection of Recipes" (Java Servlet and JSP Cookbook) di Bruce W. Perry.