Ръководство за Java EE Анотации, свързани с уеб

1. Общ преглед

Java EE анотациите улесняват живота на разработчиците, като им позволяват да определят как компонентите на приложението трябва да се държат в контейнер. Това са съвременни алтернативи за XML дескриптори и по същество позволяват да се избегне шаблонния код.

В тази статия ще се съсредоточим върху анотациите, въведени със Servlet API 3.1 в Java EE 7. Ще проучим тяхната цел и ще разгледаме тяхното използване.

2. Уеб анотации

API на Servlet 3.1 представи нов набор от типове анотации, които могат да се използват в класовете на Servlet :

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

Ще ги разгледаме подробно в следващите раздели.

3. @WebServlet

Просто казано, тази анотация ни позволява да декларираме Java класове като сървлети :

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

3.1. Използване на атрибути на @WebServlet Annotation

@WebServlet има набор от атрибути, които ни позволяват да персонализираме сървлета:

  • име
  • описание
  • urlPatterns
  • initParams

Можем да ги използваме, както е показано в примера по-долу:

@WebServlet( name = "BankAccountServlet", description = "Represents a Bank Account and it's transactions", urlPatterns = {"/account", "/bankAccount" }, initParams = { @WebInitParam(name = "type", value = "savings")}) public class AccountServlet extends javax.servlet.http.HttpServlet { String accountType = null; public void init(ServletConfig config) throws ServletException { // ... } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } }

В името на атрибута отменя името по подразбиране сървлет, който е напълно определено име на клас по подразбиране. Ако искаме да предоставим описание на това, което прави сървлетът, можем да използваме атрибута description .

В urlPatterns атрибут се използва за определяне на URL адреса (и), на която сървлета е достъпно (множество стойности могат да бъдат предоставени на този атрибут, както е показано в примера с код).

4. @WebInitParam

Тази анотация се използва с initParams атрибут на @WebServlet анотация и инициализация на параметрите на сървлет е.

В този пример задаваме тип параметър за инициализация на сървлета на стойността на „спестявания“:

@WebServlet( name = "BankAccountServlet", description = "Represents a Bank Account and it's transactions", urlPatterns = {"/account", "/bankAccount" }, initParams = { @WebInitParam(name = "type", value = "savings")}) public class AccountServlet extends javax.servlet.http.HttpServlet { String accountType = null; public void init(ServletConfig config) throws ServletException { accountType = config.getInitParameter("type"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } }

5. @WebFilter

Ако искаме да променим заявката и отговора на сървлета, без да докосваме вътрешната му логика, можем да използваме анотацията WebFilter . Можем да свържем филтри със сървлет или с група сервлети и статично съдържание, като посочим модел на URL.

В примера по-долу използваме анотацията @WebFilter, за да пренасочим всеки неоторизиран достъп до страницата за вход:

@WebFilter( urlPatterns = "/account/*", filterName = "LoggingFilter", description = "Filter all account transaction URLs") public class LogInFilter implements javax.servlet.Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; res.sendRedirect(req.getContextPath() + "/login.jsp"); chain.doFilter(request, response); } public void destroy() { } }

6. @WebListener

Ако искаме знания или контрол върху това как и кога един сървлет и неговите заявки се инициализират или променят, можем да използваме анотацията @WebListener

За да напишем уеб слушател, трябва да разширим един или повече от следните интерфейси:

  • ServletContextListener - за известия за жизнения цикъл на ServletContext
  • ServletContextAttributeListener - за известия при промяна на атрибут ServletContext
  • ServletRequestListener - за известия, когато се прави заявка за ресурс
  • ServletRequestAttributeListener - за известия при добавяне, премахване или промяна на атрибут в ServletRequest
  • HttpSessionListener - за известия при създаване и унищожаване на нова сесия
  • HttpSessionAttributeListener - за известия при добавяне или премахване на нов атрибут от сесия

По-долу е даден пример за това как можем да използваме ServletContextListener за конфигуриране на уеб приложение:

@WebListener public class BankAppServletContextListener implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { sce.getServletContext().setAttribute("ATTR_DEFAULT_LANGUAGE", "english"); } public void contextDestroyed(ServletContextEvent sce) { // ... } }

7. @ServletSecurity

Когато искаме да посочим модела на защита за нашия сървлет, включително роли, изисквания за контрол на достъпа и удостоверяване, използваме анотацията @ServletSecurity .

В този пример ще ограничим достъпа до нашия AccountServlet, като използваме анотацията @ServletSecurity :

@WebServlet( name = "BankAccountServlet", description = "Represents a Bank Account and it's transactions", urlPatterns = {"/account", "/bankAccount" }, initParams = { @WebInitParam(name = "type", value = "savings")}) @ServletSecurity( value = @HttpConstraint(rolesAllowed = {"Member"}), httpMethodConstraints = {@HttpMethodConstraint(value = "POST", rolesAllowed = {"Admin"})}) public class AccountServlet extends javax.servlet.http.HttpServlet { String accountType = null; public void init(ServletConfig config) throws ServletException { // ... } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { double accountBalance = 1000d; String paramDepositAmt = request.getParameter("dep"); double depositAmt = Double.parseDouble(paramDepositAmt); accountBalance = accountBalance + depositAmt; PrintWriter writer = response.getWriter(); writer.println(" Balance of " + accountType + " account is: " + accountBalance + ""); writer.flush(); } }

В този случай, при извикване на AccountServlet, браузърът изскача екран за вход, за да може потребителят да въведе валидно потребителско име и парола.

Можем да използваме @HttpConstraint и @HttpMethodConstraint пояснения, за да определите стойности за атрибутите стойност и httpMethodConstraints, на @ServletSecurity анотация.

Анотацията @HttpConstraint се прилага за всички HTTP методи. С други думи, той определя ограничението за сигурност по подразбиране.

@HttpConstraint има три атрибута:

  • стойност
  • Роли
  • транспорт Гаранция

Out of these attributes, the most commonly used attribute is rolesAllowed. In the example code snippet above, users who belong to the role Member are allowed to invoke all HTTP methods.

@HttpMethodConstraint annotation allows us to specify the security constraints of a particular HTTP method.

@HttpMethodConstraint has the following attributes:

  • value
  • emptyRoleSemantic
  • rolesAllowed
  • transportGuarantee

In the example code snippet above, it shows how the doPost method is restricted only for users who belong to the Admin role, allowing the deposit function to be done only by an Admin user.

8. @MultipartConfig

This annotation is used when we need to annotate a servlet to handle multipart/form-data requests (typically used for a File Upload servlet).

This will expose the getParts() and getPart(name) methods of the HttpServletRequest can be used to access all parts as well as an individual part.

The uploaded file can be written to the disk by calling the write(fileName) of the Part object.

Now we will look at an example servlet UploadCustomerDocumentsServlet that demonstrates its usage:

@WebServlet(urlPatterns = { "/uploadCustDocs" }) @MultipartConfig( fileSizeThreshold = 1024 * 1024 * 20, maxFileSize = 1024 * 1024 * 20, maxRequestSize = 1024 * 1024 * 25, location = "./custDocs") public class UploadCustomerDocumentsServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { for (Part part : request.getParts()) { part.write("myFile"); } } }

@MultipartConfig has four attributes:

  • fileSizeThreshold - Това е прагът на размера при временно запазване на качения файл. Ако размерът на качения файл е по-голям от този праг, той ще се съхранява на диска. В противен случай файлът се съхранява в паметта (размер в байтове)
  • maxFileSize - Това е максималният размер на качения файл (размер в байтове)
  • maxRequestSize - Това е най-големият размер на заявката, включително както качени файлове, така и други данни на формуляра (размер в байтове)
  • местоположение - Това е директорията, в която се съхраняват качените файлове

9. Заключение

В тази статия разгледахме някои анотации на Java EE, въведени със Servlet API 3.1 и тяхното предназначение и тяхното използване.

Изходният код, свързан с тази статия, може да бъде намерен в GitHub.