En guide til Java EE Web-Related Annotations
1. Oversikt
Java EE-merknader gjør utviklernes liv lettere ved å la dem spesifisere hvordan applikasjonskomponenter skal oppføre seg i en container. Dette er moderne alternativer for XML-deskriptorer og gjør det i utgangspunktet mulig å unngå kokerplatekode.
I denne artikkelen vil vi fokusere på merknader introdusert med Servlet API 3.1 i Java EE 7. Vi vil undersøke deres formål og se på bruken av dem.
2. Nettkommentarer
Servlet API 3.1 introduserte et nytt sett med annoteringstyper som kan brukes i Servlet klasser:
- @WebServlet
- @WebInitParam
- @WebFilter
- @WebListener
- @ServletSecurity
- @HttpConstraint
- @HttpMethodConstraint
- @MultipartConfig
Vi vil undersøke dem i detalj i neste avsnitt.
3. @WebServlet
Enkelt sagt, denne merknaden lar oss erklære Java-klasser som servlets:
@WebServlet ("/ konto") offentlig klasse AccountServlet utvider javax.servlet.http.HttpServlet {public void doGet (HttpServletRequest request, HttpServletResponse response) kaster IOException {// ...} offentlig ugyldig doPost (HttpServletRequerv svarforespørsel, Htt IOException {// ...}}
3.1. Bruke attributter av @WebServlet Kommentar
@WebServlet har et sett med attributter som lar oss tilpasse servletten:
- Navn
- beskrivelse
- urlMønstre
- initParams
Vi kan bruke disse som vist i eksemplet nedenfor:
@WebServlet (name = "BankAccountServlet", description = "Representerer en bankkonto og det er transaksjoner", urlPatterns = {"/ account", "/ bankAccount"}, initParams = {@WebInitParam (name = "type", value = " besparelser ")}) offentlig klasse AccountServlet utvider javax.servlet.http.HttpServlet {String accountType = null; offentlig ugyldig init (ServletConfig config) kaster ServletException {// ...} offentlig ugyldig doGet (HttpServletRequest forespørsel, HttpServletResponse svar) kaster IOException {// ...} offentlig ugyldig doPost (HttpServletRequest forespørsel, HttpServletResponse svar) kaster IO ...}}
De Navn attributt overstyrer standard servlets navn som er det fullt kvalifiserte klassenavnet som standard. Hvis vi ønsker å gi en beskrivelse av hva servletten gjør, kan vi bruke beskrivelse Egenskap.
De urlMønstre attributt brukes til å spesifisere URL (er) der servletten er tilgjengelig (flere verdier kan tilføres dette attributtet som vist i kodeeksemplet).
4. @WebInitParam
Denne merknaden brukes med initParams attributt til @WebServlet kommentar og servlets initialiseringsparametere.
I dette eksemplet setter vi en initialiseringsparameter for servlet type, til verdien av 'besparelser':
@WebServlet (name = "BankAccountServlet", description = "Representerer en bankkonto og det er transaksjoner", urlPatterns = {"/ account", "/ bankAccount"}, initParams = {@WebInitParam (name = "type", value = " besparelser ")}) offentlig klasse AccountServlet utvider javax.servlet.http.HttpServlet {String accountType = null; public void init (ServletConfig config) kaster ServletException {accountType = config.getInitParameter ("type"); } offentlig ugyldig doPost (HttpServletRequest-forespørsel, HttpServletResponse-svar) kaster IOException {// ...}}
5. @WebFilter
Hvis vi vil endre forespørselen og svaret fra en servlet uten å berøre den interne logikken, kan vi bruke WebFilter kommentar. Vi kan knytte filtre til en servlet eller til en gruppe servlets og statisk innhold ved å spesifisere et URL-mønster.
I eksemplet nedenfor bruker vi @WebFilter kommentar for å omdirigere uautorisert tilgang til påloggingssiden:
@WebFilter (urlPatterns = "/ account / *", filterName = "LoggingFilter", description = "Filtrer alle URL-adresser for kontotransaksjoner") offentlig klasse LogInFilter implementerer javax.servlet.Filter {public void init (FilterConfig filterConfig) kaster ServletException {} offentlig ugyldig doFilter (ServletRequest-forespørsel, ServletResponse-svar, FilterChain-kjede) kaster IOException, ServletException {HttpServletRequest req = (HttpServletRequest) forespørsel; HttpServletResponse res = (HttpServletResponse) respons; res.sendRedirect (req.getContextPath () + "/login.jsp"); chain.doFilter (forespørsel, svar); } offentlig tomrom ødelegge () {}}
6. @WebListener
Skulle vi ønske kunnskap eller kontroll over hvordan og når en servlet og dens forespørsler initialiseres eller endres, kan vi bruke @WebListener kommentar.
For å skrive en nettlytter må vi utvide ett eller flere av følgende grensesnitt:
- ServletContextListener - for varsler om ServletContext Livssyklus
- ServletContextAttributeListener - for varsler når en ServletContext attributt endres
- ServletRequestListener - for varsler når det blir gjort en forespørsel om en ressurs
- ServletRequestAttributeListener - for varsler når et attributt legges til, fjernes eller endres i en ServletRequest
- HttpSessionListener - for varsler når en ny økt opprettes og ødelegges
- HttpSessionAttributeListener - for varsler når et nytt attributt legges til eller fjernes fra en økt
Nedenfor er et eksempel på hvordan vi kan bruke en ServletContextListener for å konfigurere en webapplikasjon:
@WebListener offentlig klasse BankAppServletContextListener implementerer ServletContextListener {public void contextInitialized (ServletContextEvent sce) {sce.getServletContext (). SetAttribute ("ATTR_DEFAULT_LANGUAGE", "engelsk"); } public void contextDestroyed (ServletContextEvent sce) {// ...}}
7. @ServletSecurity
Når vi vil spesifisere sikkerhetsmodellen for servletten vår, inkludert roller, tilgangskontroll og autentiseringskrav, bruker vi merknaden @ServletSecurity.
I dette eksemplet vil vi begrense tilgangen til vår AccountServlet bruker @ServletSecurity kommentar:
@WebServlet (name = "BankAccountServlet", description = "Representerer en bankkonto og det er transaksjoner", urlPatterns = {"/ account", "/ bankAccount"}, initParams = {@WebInitParam (name = "type", value = " besparelser ")}) @ServletSecurity (verdi = @HttpConstraint (rollerAllowed = {" Medlem "}), httpMethodConstraints = {@HttpMethodConstraint (verdi =" POST ",rollerAllowed = {" Admin "})} offentlig klasse AccountServlet utvider javax. servlet.http.HttpServlet {Streng accountType = null; public void init (ServletConfig config) kaster ServletException {// ...} public void doGet (HttpServletRequest request, HttpServletResponse response) kaster IOException {// ...} public void doPost (HttpServletRequest request, HttpServletResponse response) kaster IO = 1000d; Streng paramDepositAmt = request.getParameter ("dep"); dobbelt innskuddAmt = Double.parseDouble (paramDepositAmt); accountBalance = accountBalance + depositAmt; PrintWriter-forfatter = respons.getWriter (); writer.println ("Balanse for" + accountType + "konto er:" + accountBalance + ""); writer.flush (); }}
I dette tilfellet når du påberoper deg AccountServlet, nettleseren dukker opp et påloggingsskjermbilde for brukeren å angi et gyldig brukernavn og passord.
Vi kan bruke @HttpConstraint og @HttpMethodConstraint merknader for å spesifisere verdier for attributtene verdi og httpMethodConstraints, av @ServletSecurity kommentar.
@HttpConstraint merknader gjelder alle HTTP-metoder. Med andre ord spesifiserer den standard sikkerhetsbegrensning.
@HttpConstraint har tre attributter:
- verdi
- roller Tillatt
- transportGaranti
Ut av disse attributtene er det mest brukte attributtet roller Tillatt. I eksempelkodebiten ovenfor brukerne som tilhører rollen Medlem har lov til å påkalle alle HTTP-metoder.
@HttpMethodConstraint merknader lar oss spesifisere sikkerhetsbegrensningene for en bestemt HTTP-metode.
@HttpMethodConstraint har følgende attributter:
- verdi
- emptyRoleSemantic
- roller Tillatt
- transportGaranti
I eksempelkodebiten ovenfor viser den hvordan doPost metoden er bare begrenset for brukere som tilhører Administrator rolle, slik at innskuddsfunksjonen bare kan utføres av en Administrator bruker.
8. @MultipartConfig
Denne merknaden brukes når vi trenger å kommentere en servlet som skal håndteres flerdelt / skjemadata forespørsler (vanligvis brukt for en filopplastingsservlet).
Dette vil utsette getParts () og getPart (navn) metoder for HttpServletRequest kan brukes til å få tilgang til alle deler så vel som en individuell del.
Den opplastede filen kan skrives til disken ved å ringe til skriv (filnavn) av delobjektet.
Nå skal vi se på et eksempel på servlet UploadCustomerDocumentsServlet som viser bruken:
@WebServlet (urlPatterns = {"/ uploadCustDocs"}) @ MultipartConfig (fileSizeThreshold = 1024 * 1024 * 20, maxFileSize = 1024 * 1024 * 20, maxRequestSize = 1024 * 1024 * 25, location = "./custDocs") public class UploadCustomer utvider HttpServlet {beskyttet ugyldig doPost (HttpServletRequest forespørsel, HttpServletResponse respons) kaster ServletException, IOException {for (Del del: request.getParts ()) {part.write ("myFile"); }}}
@MultipartConfig har fire attributter:
- fileSizeThreshold - Dette er størrelsesterskelen når du lagrer den opplastede filen midlertidig. Hvis størrelsen på den opplastede filen er større enn denne terskelen, blir den lagret på disken. Ellers lagres filen i minnet (størrelse i byte)
- maxFileSize - Dette er den maksimale størrelsen på den opplastede filen (størrelse i byte)
- maxRequestSize - Dette er den høyeste størrelsen på forespørselen, inkludert både opplastede filer og annen skjemadata (størrelse i byte)
- plassering - Dette er katalogen der opplastede filer lagres
9. Konklusjon
I denne artikkelen så vi på noen Java EE-merknader introdusert med Servlet API 3.1 og deres formål og deres bruk.
Kildekode relatert til denne artikkelen finner du på GitHub.