Een gids voor webgerelateerde annotaties in Java EE

1. Overzicht

Java EE-annotaties maken het leven van ontwikkelaars gemakkelijker doordat ze kunnen specificeren hoe applicatiecomponenten zich in een container moeten gedragen. Dit zijn moderne alternatieven voor XML-descriptoren en maken het in feite mogelijk om standaardcode te vermijden.

In dit artikel zullen we ons concentreren op annotaties die zijn geïntroduceerd met Servlet API 3.1 in Java EE 7. We zullen hun doel onderzoeken en naar hun gebruik kijken.

2. Webannotaties

Servlet API 3.1 introduceerde een nieuwe set annotatietypen die kunnen worden gebruikt in Servlet klassen:

  • @WebServlet
  • @WebInitParam
  • @WebFilter
  • @WebListener
  • @BuienRadarNL
  • @BuienRadarNL
  • @BuienRadarNL
  • @MultipartConfig

We zullen ze in de volgende secties in detail onderzoeken.

3. @WebServlet

Simpel gezegd, deze annotatie stelt ons in staat Java-klassen als servlets te declareren:

@WebServlet ("/ account") public class AccountServlet breidt javax.servlet.http.HttpServlet {public void doGet (HttpServletRequest request, HttpServletResponse response) uit met IOException {// ...} public void doPost (HttpServletRequest response) request, HttpServletRequest response) IOException {// ...}}

3.1. Gebruik attributen van @WebServlet Annotatie

@WebServlet heeft een aantal attributen waarmee we de servlet kunnen aanpassen:

  • naam
  • Omschrijving
  • urlPatterns
  • initParams

We kunnen deze gebruiken zoals weergegeven in het onderstaande voorbeeld:

@WebServlet (name = "BankAccountServlet", description = "Vertegenwoordigt een bankrekening en zijn transacties", urlPatterns = {"/ account", "/ bankAccount"}, initParams = {@WebInitParam (name = "type", value = " besparingen ")}) openbare klasse AccountServlet breidt javax.servlet.http.HttpServlet {String accountType = null; public void init (ServletConfig config) gooit ServletException {// ...} public void doGet (HttpServletRequest-verzoek, HttpServletResponse-reactie) gooit IOException {// ...} public void doPost (HttpServletRequest-verzoek //, HttpServletResponse-antwoord) gooit IOException { ...}}

De naam attribuut overschrijft de standaard servletnaam die standaard de volledig gekwalificeerde klassenaam is. Als we een beschrijving willen geven van wat de servlet doet, kunnen we de Omschrijving attribuut.

De urlPatterns attribuut wordt gebruikt om de URL ('s) te specificeren waarop de servlet beschikbaar is (er kunnen meerdere waarden aan dit attribuut worden verstrekt, zoals weergegeven in het codevoorbeeld).

4. @WebInitParam

Deze annotatie wordt gebruikt met de initParams attribuut van de @WebServlet annotatie en de initialisatieparameters van de servlet.

In dit voorbeeld stellen we een servlet-initialisatieparameter in type, ter waarde van ‘besparingen ':

@WebServlet (name = "BankAccountServlet", description = "Vertegenwoordigt een bankrekening en zijn transacties", urlPatterns = {"/ account", "/ bankAccount"}, initParams = {@WebInitParam (name = "type", value = " besparingen ")}) openbare klasse AccountServlet breidt javax.servlet.http.HttpServlet {String accountType = null; public void init (ServletConfig config) gooit ServletException {accountType = config.getInitParameter ("type"); } public void doPost (HttpServletRequest-verzoek, HttpServletResponse-reactie) gooit IOException {// ...}}

5. @WebFilter

Als we het verzoek en de reactie van een servlet willen wijzigen zonder de interne logica aan te raken, kunnen we de WebFilter annotatie. We kunnen filters aan een servlet of aan een groep servlets en statische inhoud koppelen door een URL-patroon op te geven.

In het onderstaande voorbeeld gebruiken we de @WebFilter annotatie om ongeautoriseerde toegang naar de inlogpagina om te leiden:

@WebFilter (urlPatterns = "/ account / *", filterName = "LoggingFilter", description = "Filter alle accounttransactie-URL's") public class LogInFilter implementeert javax.servlet.Filter {public void init (FilterConfig filterConfig) gooit ServletException {} public void doFilter (ServletRequest-verzoek, ServletResponse-antwoord, FilterChain-keten) gooit IOException, ServletException {HttpServletRequest req = (HttpServletRequest) -verzoek; HttpServletResponse res = (HttpServletResponse) antwoord; res.sendRedirect (req.getContextPath () + "/login.jsp"); chain.doFilter (verzoek, antwoord); } public void destroy () {}}

6. @WebListener

Als we kennis of controle willen over hoe en wanneer een servlet en zijn verzoeken worden geïnitialiseerd of gewijzigd, kunnen we de @WebListener annotatie.

Om een ​​web-listener te schrijven, moeten we een of meer van de volgende interfaces uitbreiden:

  • ServletContextListener - voor meldingen over de ServletContext levenscyclus
  • ServletContextAttributeListener - voor meldingen wanneer een ServletContext attribuut is gewijzigd
  • ServletRequestListener - voor meldingen wanneer een verzoek om een ​​bron wordt gedaan
  • ServletRequestAttributeListener - voor meldingen wanneer een kenmerk wordt toegevoegd, verwijderd of gewijzigd in een ServletRequest
  • HttpSessionListener - voor meldingen wanneer een nieuwe sessie is gemaakt en vernietigd
  • HttpSessionAttributeListener - voor meldingen wanneer een nieuw kenmerk wordt toegevoegd aan of verwijderd uit een sessie

Hieronder ziet u een voorbeeld van hoe we een ServletContextListener om een ​​webapplicatie te configureren:

@WebListener publieke klasse BankAppServletContextListener implementeert ServletContextListener {public void contextInitialized (ServletContextEvent sce) {sce.getServletContext (). SetAttribute ("ATTR_DEFAULT_LANGUAGE", "english"); } public void contextDestroyed (ServletContextEvent sce) {// ...}}

7. @BuienRadarNL

Wanneer we het beveiligingsmodel voor onze servlet willen specificeren, inclusief rollen, toegangscontrole en authenticatievereisten, gebruiken we de annotatie @BuienRadarNL.

In dit voorbeeld beperken we de toegang tot onze AccountServlet de ... gebruiken @BuienRadarNL annotatie:

@WebServlet (name = "BankAccountServlet", description = "Vertegenwoordigt een bankrekening en zijn transacties", urlPatterns = {"/ account", "/ bankAccount"}, initParams = {@WebInitParam (name = "type", value = " besparingen ")}) @ServletSecurity (waarde = @HttpConstraint (rollenAllowed = {" Lid "}), httpMethodConstraints = {@HttpMethodConstraint (waarde =" POST ", rollsAllowed = {" Admin "})}) openbare klasse AccountServlet breidt javax uit. servlet.http.HttpServlet {String accountType = null; public void init (ServletConfig config) gooit ServletException {// ...} public void doGet (HttpServletRequest request, HttpServletResponse response) gooit IOException {// ...} public void doPost (HttpServletRequest request, HttpServletResponse response) gooit IOException {// ...} public void doPost (HttpServletRequest request, HttpServletResponse response) gooit IOException {// ...} public void doPost (HttpServletRequest request, HttpServletResponse response) = 1000d; String paramDepositAmt = request.getParameter ("dep"); double depositAmt = Double.parseDouble (paramDepositAmt); accountBalance = accountBalance + depositAmt; PrintWriter-schrijver = response.getWriter (); writer.println ("Saldo van" + accountType + "account is:" + accountBalance + ""); schrijver.flush (); }}

In dit geval, bij het aanroepen van de AccountServlet, de browser laat een inlogscherm zien waarop de gebruiker een geldige gebruikersnaam en wachtwoord kan invoeren.

We kunnen gebruiken @BuienRadarNL en @BuienRadarNL annotaties om waarden voor de attributen op te geven waarde en httpMethodConstraints, van @BuienRadarNL annotatie.

@BuienRadarNL annotatie is van toepassing op alle HTTP-methoden. Met andere woorden, het specificeert de standaardbeveiligingsbeperking.

@BuienRadarNL heeft drie attributen:

  • waarde
  • rollen Toegestaan
  • Transportgarantie

Van deze attributen is het meest gebruikte attribuut rollen Toegestaan. In het voorbeeldcodefragment hierboven, gebruikers die tot de rol behoren Lid mogen alle HTTP-methoden aanroepen.

@BuienRadarNL annotatie stelt ons in staat om de beveiligingsbeperkingen van een bepaalde HTTP-methode te specificeren.

@BuienRadarNL heeft de volgende kenmerken:

  • waarde
  • emptyRoleSemantic
  • rollen Toegestaan
  • Transportgarantie

In het bovenstaande voorbeeldcodefragment laat het zien hoe de doPost methode is alleen beperkt voor gebruikers die tot de beheerder rol, waardoor de stortingsfunctie alleen kan worden uitgevoerd door een beheerder gebruiker.

8. @MultipartConfig

Deze annotatie wordt gebruikt wanneer we een servlet moeten annoteren om af te handelen multipart / form-data verzoeken (meestal gebruikt voor een servlet voor het uploaden van bestanden).

Dit zal het getParts () en getPart (naam) methoden van de HttpServletRequest kan worden gebruikt om toegang te krijgen tot alle onderdelen, evenals een afzonderlijk onderdeel.

Het geüploade bestand kan naar de schijf worden geschreven door de extensie schrijven (bestandsnaam) van het Part-object.

Nu zullen we een voorbeeldservlet bekijken UploadCustomerDocumentsServlet dat het gebruik ervan aantoont:

@WebServlet (urlPatterns = {"/ uploadCustDocs"}) @MultipartConfig (fileSizeThreshold = 1024 * 1024 * 20, maxFileSize = 1024 * 1024 * 20, maxRequestSize = 1024 * 1024 * 25, location = "./custDocs") public class UploadCustomerDocumentsServlet breidt HttpServlet {beschermde ongeldige doPost (HttpServletRequest-verzoek, HttpServletResponse-reactie) uit met ServletException, IOException {voor (Part part: request.getParts ()) {part.write ("myFile"); }}}

@MultipartConfig heeft vier attributen:

  • fileSizeThreshold - Dit is de drempel voor de grootte bij het tijdelijk opslaan van het geüploade bestand. Als de grootte van het geüploade bestand groter is dan deze drempel, wordt het op de schijf opgeslagen. Anders wordt het bestand in het geheugen opgeslagen (grootte in bytes)
  • maxFileSize - Dit is de maximale grootte van het geüploade bestand (grootte in bytes)
  • maxRequestSize - Dit is de hoogste grootte van het verzoek, inclusief zowel geüploade bestanden als andere formuliergegevens (grootte in bytes)
  • plaats - Dit is de map waarin geüploade bestanden worden opgeslagen

9. Conclusie

In dit artikel hebben we gekeken naar enkele Java EE-annotaties die zijn geïntroduceerd met de Servlet API 3.1 en hun doel en hun gebruik.

Broncode met betrekking tot dit artikel is te vinden op GitHub.