Sprievodca anotáciami súvisiacimi s webom Java EE

1. Prehľad

Anotácie Java EE uľahčujú vývojárom život tým, že im umožňujú určiť, ako sa majú komponenty aplikácie správať v kontajneri. Toto sú moderné alternatívy deskriptorov XML a v zásade umožňujú vyhnúť sa štandardným kódom.

V tomto článku sa zameriame na anotácie zavedené pomocou Servlet API 3.1 v prostredí Java EE 7. Preskúmame ich účel a pozrieme sa na ich použitie.

2. Webové anotácie

Servlet API 3.1 predstavil novú sadu typov anotácií, ktoré je možné použiť v Servlet triedy:

  • @WebServlet
  • @WebInitParam
  • @WebFilter
  • @WebListener
  • @ServletSecurity
  • @HttpConstraint
  • @HttpMethodConstraint
  • @MultipartConfig

Podrobne ich preskúmame v ďalších častiach.

3. @WebServlet

Zjednodušene povedané, táto anotácia nám umožňuje deklarovať triedy Java ako servlety:

@WebServlet ("/ account") verejná trieda AccountServlet rozširuje javax.servlet.http.HttpServlet {public void doGet (požiadavka HttpServletRequest, odpoveď HttpServletResponse) hodí IOException {// ...} public void doPost (požiadavka HttpServletRequest, HttpServletRequest požiadavka, HttpServletRequest požiadavka IOException {// ...}}

3.1. Používanie atribútov @WebServlet Anotácia

@WebServlet má množinu atribútov, ktoré nám umožňujú prispôsobiť servlet:

  • názov
  • popis
  • urlVzory
  • initParams

Môžeme ich použiť, ako je uvedené v príklade nižšie:

@WebServlet (name = "BankAccountServlet", description = "Predstavuje bankový účet a jeho transakcie", urlPatterns = {"/ account", "/ bankAccount"}, initParams = {@WebInitParam (name = "type", value = ") úspory ")}) verejná trieda AccountServlet rozširuje javax.servlet.http.HttpServlet {String accountType = null; public void init (ServletConfig config) hodí ServletException {// ...} public void doGet (požiadavka HttpServletRequest, odpoveď HttpServletResponse) hodí IOException {// ...} public void doPost (požiadavka HttpServletRequest, odpoveď HttpServletResponse) // hodí IOException ...}}

The názov atribút prepíše predvolený názov servletu, ktorý je predvolene úplným názvom triedy. Ak chceme poskytnúť popis toho, čo servlet robí, môžeme použiť popis atribút.

The urlVzory atribút sa používa na určenie adries URL, na ktorých je servlet k dispozícii (tomuto atribútu možno poskytnúť viac hodnôt, ako je uvedené v príklade kódu).

4. @WebInitParam

Táto anotácia sa používa s textom initParams atribút @WebServlet anotácia a inicializačné parametre servletu.

V tomto príklade sme nastavili inicializačný parameter servletu typu, k hodnote „úspor“:

@WebServlet (name = "BankAccountServlet", description = "Predstavuje bankový účet a jeho transakcie", urlPatterns = {"/ account", "/ bankAccount"}, initParams = {@WebInitParam (name = "type", value = ") úspory ")}) verejná trieda AccountServlet rozširuje javax.servlet.http.HttpServlet {String accountType = null; public void init (konfigurácia ServletConfig) hodí ServletException {accountType = config.getInitParameter ("typ"); } public void doPost (požiadavka HttpServletRequest, odpoveď HttpServletResponse) vyvolá IOException {// ...}}

5. @WebFilter

Ak chceme zmeniť požiadavku a odpoveď servletu bez toho, aby sme sa dotkli jeho vnútornej logiky, môžeme použiť WebFilter anotácia. Filtre môžeme priradiť k servletu alebo k skupine servletov a statickému obsahu zadaním vzoru adresy URL.

V príklade nižšie používame @WebFilter anotácia na presmerovanie neoprávneného prístupu na prihlasovaciu stránku:

@WebFilter (urlPatterns = "/ account / *", filterName = "LoggingFilter", description = "Filtrovať všetky adresy transakcií účtu") verejná trieda LogInFilter implementuje javax.servlet.Filter {public void init (FilterConfig filterConfig) hodí ServletException {} public void doFilter (požiadavka ServletRequest, odpoveď ServletResponse, reťazec FilterChain) hodí IOException, ServletException {HttpServletRequest req = (HttpServletRequest) požiadavka; HttpServletResponse res = (HttpServletResponse) odpoveď; res.sendRedirect (req.getContextPath () + "/login.jsp"); chain.doFilter (požiadavka, odpoveď); } public void zničiť () {}}

6. @WebListener

Ak chceme informácie alebo kontrolu nad tým, ako a kedy sa servlet a jeho požiadavky inicializujú alebo zmenia, môžeme použiť server @WebListener anotácia.

Aby sme mohli napísať webový poslucháč, musíme rozšíriť jedno alebo viac z nasledujúcich rozhraní:

  • ServletContextListener - pre oznámenia o ServletContext životný cyklus
  • ServletContextAttributeListener - pre oznámenia, keď a ServletContext atribút je zmenený
  • ServletRequestListener - pre upozornenia vždy, keď je podaná žiadosť o zdroj
  • ServletRequestAttributeListener - pre oznámenia, keď je atribút pridaný, odstránený alebo zmenený v a ServletRequest
  • HttpSessionListener - pre upozornenia, keď sa vytvorí a zničí nová relácia
  • HttpSessionAttributeListener - pre oznámenia, keď je do relácie pridaný alebo odstránený nový atribút

Ďalej uvádzame príklad toho, ako môžeme použiť a ServletContextListener nakonfigurovať webovú aplikáciu:

@WebListener verejná trieda BankAppServletContextListener implementuje ServletContextListener {public void contextInitialized (ServletContextEvent sce) {sce.getServletContext (). SetAttribute ("ATTR_DEFAULT_LANGUAGE", "anglicky"); } public void contextDestroyed (ServletContextEvent sce) {// ...}}

7. @ServletSecurity

Ak chceme špecifikovať model zabezpečenia pre náš servlet, vrátane rolí, riadenia prístupu a požiadaviek na autentifikáciu, použijeme anotáciu @ServletSecurity.

V tomto príklade obmedzíme prístup k našim AccountServlet pomocou @ServletSecurity anotácia:

@WebServlet (name = "BankAccountServlet", description = "Predstavuje bankový účet a jeho transakcie", urlPatterns = {"/ account", "/ bankAccount"}, initParams = {@WebInitParam (name = "type", value = ") úspory ")}) @ServletSecurity (hodnota = @HttpConstraint (roleAllowed = {" člen "}), httpMethodConstraints = {@HttpMethodConstraint (hodnota =" POST ", roleAllowed = {" Admin "})}) verejná trieda AccountServlet rozširuje javax. servlet.http.HttpServlet {Reťazec accountType = null; public void init (ServletConfig config) hodí ServletException {// ...} public void doGet (požiadavka HttpServletRequest, odpoveď HttpServletResponse) hodí IOException {// ...} public void doPost (požiadavka HttpServletRequest, odpoveď HttpServletResponse) dvojnásobok účtu IOException = 1000 d; Reťazec paramDepositAmt = request.getParameter ("dep"); double DepositAmt = Double.parseDouble (paramDepositAmt); accountBalance = accountBalance + DepositAmt; Zapisovač PrintWriter = response.getWriter (); writer.println ("Zostatok na účte" + accountType + "je:" + accountBalance + ""); writer.flush (); }}

V takom prípade pri vyvolaní AccountServlet, prehľadávač zobrazí prihlasovaciu obrazovku pre používateľa na zadanie platného používateľského mena a hesla.

Môžeme použiť @HttpConstraint a @HttpMethodConstraint anotácie na určenie hodnôt pre atribúty hodnotu a httpMethodConstraints, z @ServletSecurity anotácia.

@HttpConstraint anotácia platí pre všetky metódy HTTP. Inými slovami, určuje predvolené bezpečnostné obmedzenie.

@HttpConstraint má tri atribúty:

  • hodnotu
  • roly Povolené
  • záruka prepravy

Z týchto atribútov je najbežnejšie používaný atribút roly Povolené. V príklade vyššie uvedeného fragmentu kódu sú používatelia, ktorí patria do danej role Poslanec môžu vyvolať všetky metódy HTTP.

@HttpMethodConstraint anotácia nám umožňuje určiť bezpečnostné obmedzenia konkrétnej metódy HTTP.

@HttpMethodConstraint má nasledujúce atribúty:

  • hodnotu
  • emptyRoleSemantic
  • roly Povolené
  • záruka prepravy

Vo vyššie uvedenom ukážke kódu ukazuje, ako doPost Táto metóda je obmedzená iba na používateľov, ktorí patria do domény Admin rola umožňujúca vykonávať funkciu vkladu iba prostredníctvom Admin používateľ.

8. @MultipartConfig

Táto anotácia sa používa, keď potrebujeme anotovať servlet, ktorý sa má spracovať multipart / form-data požiadavky (zvyčajne sa používajú pre servlet File Upload).

Toto odhalí getParts () a getPart (meno) metódy HttpServletRequest možno použiť na prístup ku všetkým častiam, ako aj k jednotlivým častiam.

Nahraný súbor je možné zapísať na disk zavolaním na write (názov súboru) časti objektu.

Teraz sa pozrieme na príklad servletu UploadCustomerDocumentsServlet ktorý demonštruje jeho použitie:

@WebServlet (urlPatterns = {"/ uploadCustDocs"}) @MultipartConfig (fileSizeThreshold = 1024 * 1024 * 20, maxFileSize = 1024 * 1024 * 20, maxRequestSize = 1024 * 1024 * 25, location = "./custDocs") verejná trieda UploadCustomerDocuments rozširuje HttpServlet {chránený void doPost (požiadavka HttpServletRequest, odpoveď HttpServletResponse) hodí ServletException, IOException {for (Part part: request.getParts ()) {part.write ("myFile"); }}}

@MultipartConfig má štyri atribúty:

  • fileSizeThreshold - Toto je limit veľkosti pri dočasnom ukladaní nahraného súboru. Ak je veľkosť nahraného súboru väčšia ako táto hranica, uloží sa na disk. V opačnom prípade je súbor uložený v pamäti (veľkosť v bajtoch)
  • maxFileSize - Toto je maximálna veľkosť nahraného súboru (veľkosť v bajtoch)
  • maxRequestSize - Toto je najvyššia veľkosť žiadosti vrátane nahraných súborov a ďalších údajov formulára (veľkosť v bajtoch)
  • umiestnenie - je adresár, v ktorom sú uložené nahrané súbory

9. Záver

V tomto článku sme sa pozreli na niektoré anotácie Java EE zavedené pomocou Servlet API 3.1 a na ich účel a ich použitie.

Zdrojový kód súvisiaci s týmto článkom nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found