Ein Handbuch zu webbezogenen Anmerkungen zu Java EE

1. Übersicht

Java EE-Annotationen erleichtern Entwicklern das Leben, indem sie festlegen können, wie sich Anwendungskomponenten in einem Container verhalten sollen. Dies sind moderne Alternativen für XML-Deskriptoren und ermöglichen es grundsätzlich, Boilerplate-Code zu vermeiden.

In diesem Artikel konzentrieren wir uns auf Anmerkungen, die mit Servlet API 3.1 in Java EE 7 eingeführt wurden. Wir werden ihren Zweck untersuchen und ihre Verwendung untersuchen.

2. Web Annotations

Mit der Servlet-API 3.1 wurde eine neue Reihe von Anmerkungstypen eingeführt, die in Servlet- Klassen verwendet werden können:

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

Wir werden sie in den nächsten Abschnitten ausführlich untersuchen.

3. @WebServlet

Einfach ausgedrückt, diese Annotation ermöglicht es uns, Java-Klassen als Servlets zu deklarieren :

@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. Verwenden von Attributen der @ WebServlet- Annotation

@WebServlet verfügt über eine Reihe von Attributen, mit denen wir das Servlet anpassen können:

  • Name
  • Beschreibung
  • urlPatterns
  • initParams

Wir können diese wie im folgenden Beispiel gezeigt verwenden:

@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 { // ... } }

Das Attribut name überschreibt den Standard-Servlet-Namen, der standardmäßig der vollständig qualifizierte Klassenname ist. Wenn wir eine Beschreibung der Funktionsweise des Servlets bereitstellen möchten, können wir das Attribut description verwenden .

Das Attribut urlPatterns wird verwendet, um die URL (s) anzugeben, unter denen das Servlet verfügbar ist (für dieses Attribut können mehrere Werte bereitgestellt werden, wie im Codebeispiel gezeigt).

4. @WebInitParam

Diese Annotation wird mit dem initParams- Attribut der @ WebServlet- Annotation und den Initialisierungsparametern des Servlets verwendet .

In diesem Beispiel legen wir ein Servlet - Initialisierungsparameter Typ , auf den Wert von ‚Einsparungen‘:

@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

Wenn wir die Anforderung und Antwort eines Servlets ändern möchten, ohne dessen interne Logik zu berühren, können wir die Annotation WebFilter verwenden . Wir können Filter einem Servlet oder einer Gruppe von Servlets und statischem Inhalt zuordnen, indem wir ein URL-Muster angeben.

Im folgenden Beispiel verwenden wir die Annotation @WebFilter , um nicht autorisierten Zugriff auf die Anmeldeseite umzuleiten:

@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

Wenn wir wissen oder steuern möchten, wie und wann ein Servlet und seine Anforderungen initialisiert oder geändert werden, können wir die Annotation @WebListener verwenden .

Um einen Weblistener zu schreiben, müssen wir eine oder mehrere der folgenden Schnittstellen erweitern:

  • ServletContextListener - für Benachrichtigungen über den ServletContext- Lebenszyklus
  • ServletContextAttributeListener - für Benachrichtigungen, wenn ein ServletContext- Attribut geändert wird
  • ServletRequestListener - für Benachrichtigungen, wenn eine Anforderung für eine Ressource erfolgt
  • ServletRequestAttributeListener - für Benachrichtigungen, wenn ein Attribut in einer ServletRequest hinzugefügt, entfernt oder geändert wird
  • HttpSessionListener - für Benachrichtigungen, wenn eine neue Sitzung erstellt und zerstört wird
  • HttpSessionAttributeListener - für Benachrichtigungen, wenn ein neues Attribut zu einer Sitzung hinzugefügt oder aus dieser entfernt wird

Im Folgenden finden Sie ein Beispiel dafür, wie Sie mit einem ServletContextListener eine Webanwendung konfigurieren können:

@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

Wenn wir das Sicherheitsmodell für unser Servlet angeben möchten, einschließlich Rollen, Zugriffskontrolle und Authentifizierungsanforderungen, verwenden wir die Annotation @ServletSecurity .

In diesem Beispiel wird der Zugriff auf unser AccountServlet mithilfe der Annotation @ServletSecurity eingeschränkt :

@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(); } }

In diesem Fall öffnet der Browser beim Aufrufen des AccountServlet einen Anmeldebildschirm, in dem der Benutzer einen gültigen Benutzernamen und ein gültiges Kennwort eingeben kann.

Wir können die Annotationen @HttpConstraint und @HttpMethodConstraint verwenden , um Werte für die Attribute value und httpMethodConstraints der Annotation @ServletSecurity anzugeben .

Die Annotation @HttpConstraint gilt für alle HTTP-Methoden. Mit anderen Worten, es gibt die Standardsicherheitsbeschränkung an.

@HttpConstraint hat drei Attribute:

  • Wert
  • Rollen erlaubt
  • Transportgarantie

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 - Dies ist der Größenschwellenwert, wenn die hochgeladene Datei vorübergehend gespeichert wird. Wenn die Größe der hochgeladenen Datei diesen Schwellenwert überschreitet, wird sie auf der Festplatte gespeichert. Andernfalls wird die Datei im Speicher gespeichert (Größe in Byte).
  • maxFileSize - Dies ist die maximale Größe der hochgeladenen Datei (Größe in Byte).
  • maxRequestSize - Dies ist die höchste Größe der Anforderung, einschließlich hochgeladener Dateien und anderer Formulardaten (Größe in Byte).
  • Speicherort - Dies ist das Verzeichnis, in dem hochgeladene Dateien gespeichert werden

9. Fazit

In diesem Artikel haben wir uns einige Java EE-Annotationen angesehen, die mit der Servlet-API 3.1 eingeführt wurden, sowie deren Zweck und Verwendung.

Der Quellcode zu diesem Artikel ist auf GitHub zu finden.