Kontekst- og servlet-initialiseringsparametre

1. Oversigt

Servlets er almindelige Java-klasser, der kører i en servlet-container.

HTTP-servlets (en bestemt type servlet) er førsteklasses borgere i Java-webapplikationer. API for HTTP-servlets er rettet mod at håndtere HTTP-anmodninger gennem den typiske anmodning-behandling-svar-cyklus, implementeret i klient-server-protokoller.

Desuden kan servlets kontrollere interaktionen mellem en klient (typisk en webbrowser) og serveren ved hjælp af nøgleværdipar i form af anmodnings- / svarparametre.

Disse parametre kan initialiseres og bindes til et anvendelsesomfang (kontekstparametre) og et servlet-specifikt omfang (servletparametre).

I denne vejledning lærer vi hvordan man definerer og får adgang til parametre for kontekst og initialisering af servlet.

2. Initialisering af servletparametre

Vi kan definere og initialisere servletparametre ved hjælp af annoteringer og standardinstallationsbeskrivelsen - the “Web.xml” fil. Det er værd at bemærke, at disse to muligheder ikke udelukker hinanden.

Lad os undersøge hver af disse muligheder i dybden.

2.1. Brug af kommentarer

Ved at initialisere servlets-parametre med kommentarer kan vi holde konfiguration og kildekode på samme sted.

I dette afsnit demonstrerer vi, hvordan du definerer og får adgang til initialiseringsparametre, der er bundet til en bestemt servlet ved hjælp af annoteringer.

For at gøre det implementerer vi en naiv UserServlet klasse, der indsamler brugerdata gennem en almindelig HTML-formular.

Lad os først se på JSP-filen, der gengiver vores form:

   Kontekst og initialisering Servletparametre 

Udfyld nedenstående formular:

Navn:E-mail:

Bemærk, at vi har kodet formularerne handling attribut ved hjælp af EL (ekspressionssprog). Dette gør det muligt altid at pege på “/ UserServlet” sti, uanset placeringen af ​​applikationsfilerne på serveren.

Det “$ {PageContext.request.contextPath}” udtryk indstiller en dynamisk URL til formularen, som altid er relateret til applikationens kontekststi.

Her er vores første implementering af servlet:

@WebServlet (name = "UserServlet", urlPatterns = {"/ userServlet"}, initParams = {@WebInitParam (name = "name", value = "Ikke oplyst"), @WebInitParam (name = "email", value = " Ikke oplyst ")})) offentlig klasse UserServlet udvider HttpServlet {// ... @ Override beskyttet ugyldigt doPost (HttpServletRequest anmodning, HttpServletResponse svar) kaster ServletException, IOException {processRequest (anmodning, svar); forwardRequest (anmodning, svar, "/WEB-INF/jsp/result.jsp"); } beskyttet ugyldig procesRequest (HttpServletRequest anmodning, HttpServletResponse svar) kaster ServletException, IOException {request.setAttribute ("navn", getRequestParameter (anmodning, "navn")); request.setAttribute ("e-mail", getRequestParameter (anmodning, "e-mail")); } beskyttet ugyldig forwardRequest (HttpServletRequest anmodning, HttpServletResponse svar, streng sti) kaster ServletException, IOException {request.getRequestDispatcher (sti). fremad (anmodning, svar); } beskyttet String getRequestParameter (HttpServletRequest anmodning, String navn) {String param = request.getParameter (navn); returner! param.isEmpty ()? param: getInitParameter (navn); }} 

I dette tilfælde har vi defineret to servlet initialiseringsparametre, navn og e-mail, ved ved brug af initParams og @WebInitParam kommentarer.

Bemærk, at vi har brugt HttpServletRequest's getParameter () metode til at hente dataene fra HTML-formularen og getInitParameter () metode til at få adgang til parametre til initialisering af servlet.

Det getRequestParameter () metode kontrollerer, om navn og e-mail anmodningsparametre er tomme strenge.

Hvis de er tomme strenge, får de tildelt standardværdierne for de matchende initialiseringsparametre.

Det doPost () metode henter først navnet og e-mailen, som brugeren indtastede i HTML-formularen (hvis nogen). Derefter behandler den anmodningsparametrene og videresender anmodningen til en “Resultat.jsp” fil:

    Brugerdata 

Brugeroplysninger

Navn: $ {navn}

E-mail: $ {email}

Hvis vi distribuerer vores eksempler på webapplikation til en applikationsserver, såsom Apache Tomcat, Oracle GlassFish eller JBoss WidlFly, og kører den, skal den først vise HTML-formular-siden.

Når brugeren har udfyldt navn og e-mail felter og indsendt formularen, vil den output dataene:

Brugeroplysninger Navn: brugerens navn E-mail: brugerens e-mail 

Hvis formularen bare er tom, vises parametre for initialisering af servlet:

Brugeroplysninger Navn: Ikke oplyst E-mail: Ikke oplyst 

I dette eksempel har vi vist hvordan man definerer initialiseringsparametre for servlet ved hjælp af annoteringer, og hvordan man får adgang til dem med getInitParameter () metode.

2.2. Brug af Standard Deployment Descriptor

Denne tilgang adskiller sig fra den, der bruger annoteringer, da den giver os mulighed for at holde konfiguration og kildekode isoleret fra hinanden.

For at vise, hvordan initialiseringsservletparametre defineres med “Web.xml” fil, lad os først fjerne initParam og @WebInitParam kommentarer fra UserServlet klasse:

@WebServlet (name = "UserServlet", urlPatterns = {"/ userServlet"}) offentlig klasse UserServlet udvider HttpServlet {...} 

Lad os derefter definere parametre for initialisering af servlet i “Web.xml” fil:

   UserServlet UserServlet navn Ikke oplyst e-mail Ikke oplyst 

Som vist ovenfor, definerer servlet initialiseringsparametre ved hjælp af “Web.xml” filen koger bare ned til at bruge , og tags.

Desuden er det muligt at definere så mange servletparametre efter behov, så længe vi holder os til ovenstående standardstruktur.

Når vi omplacerer applikationen til serveren og kører den igen, skal den opføre sig som den version, der bruger annoteringer.

3. Initialisering af kontekstparametre

Nogle gange er vi nødt til at definere nogle uforanderlige data, der skal deles globalt og få adgang til på tværs af en webapplikation.

På grund af dataens globale natur skal vi Brug kontekstinitialiseringsparametre for hele applikationen til lagring af data snarere end at ty til servlet-modparterne.

Selvom det ikke er muligt at definere parametre for kontekstinitialisering ved hjælp af annoteringer, kan vi gøre dette i “Web.xml” fil.

Lad os antage, at vi vil give nogle globale standardværdier til det land og den provins, hvor vores applikation kører.

Vi kan opnå dette med et par kontekstparametre.

Lad os omformulere “Web.xml” arkiver tilsvarende:

  provins Mendoza land Argentina 

Denne gang har vi brugt , , og tags til at definere provins og Land kontekstparametre.

Selvfølgelig skal vi omlægge UserServlet klasse, så den kan hente disse parametre og videregive dem til resultatsiden.

Her er servlets relevante sektioner:

@WebServlet (name = "UserServlet", urlPatterns = {"/ userServlet"}) offentlig klasse UserServlet udvider HttpServlet {// ... beskyttet ugyldig procesRequest (HttpServletRequest anmodning, HttpServletResponse svar) kaster ServletException, IOException {anmodning navn.Att ", getRequestParameter (anmodning," navn ")); request.setAttribute ("e-mail", getRequestParameter (anmodning, "e-mail")); request.setAttribute ("provins", getContextParameter ("provins")); request.setAttribute ("land", getContextParameter ("land")); } beskyttet String getContextParameter (String name) {- return getServletContext (). getInitParameter (name); }} 

Bemærk venligst getContextParameter () metodeimplementering, som først får servlet-konteksten igennem getServletContext (), og henter derefter kontekstparameteren med getInitParameter () metode.

Dernæst skal vi omlægge “Resultat.jsp” fil, så den kan vise kontekstparametrene sammen med de servlet-specifikke parametre:

Navn: $ {navn}

E-mail: $ {email}

Provins: $ {provins}

Land: $ {land}

Endelig kan vi omplacere applikationen og udføre den igen.

Hvis brugeren udfylder HTML-formularen med et navn og en e-mail, viser den disse data sammen med kontekstparametrene:

Brugeroplysninger Navn: brugerens navn E-mail: brugerens e-mail Provins: Mendoza Land: Argentina 

Ellers ville det sende servlet- og kontekstinitialiseringsparametrene:

Brugerinformation Navn: Ikke oplyst E-mail: Ikke oplyst Provins: Mendoza Land: Argentina 

Mens eksemplet er konstrueret, viser det det hvordan man bruger parametre til initialisering af kontekst til at gemme uforanderlige globale data.

Da dataene er bundet til applikationskonteksten, snarere end til en bestemt servlet, kan vi få adgang til dem fra en eller flere servlets ved hjælp af getServletContext () og getInitParameter () metoder.

4. Konklusion

I denne artikel vi lærte nøglebegreberne for kontekst og servlet initialiseringsparametre og hvordan man definerer dem og får adgang til dem ved hjælp af annoteringer og “Web.xml” fil.

I ganske lang tid har der været en stærk tendens i Java til at slippe af med XML-konfigurationsfiler og migrere til annoteringer, når det er muligt.

CDI, Spring, Hibernate, for at nævne nogle få, er skarpe eksempler på dette.

Ikke desto mindre er der intet iboende galt med at bruge “Web.xml” fil til definition af kontekst- og servlet-initialiseringsparametre.

Selvom Servlet API har udviklet sig i temmelig hurtigt tempo mod denne tendens, Vi har stadig brug for implementeringsbeskrivelsen til at definere parametre for kontekstinitialisering.

Som sædvanligt er alle kodeeksempler vist i denne artikel tilgængelige på GitHub.