Ein Handbuch zu Java EE-Web-bezogenen Anmerkungen

1. Überblick

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

In diesem Artikel konzentrieren wir uns auf Anmerkungen, die mit der 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 Annotationstypen eingeführt, die inServlet-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 von@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 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 Attributname überschreibt den Standard-Servlet-Namen, der standardmäßig der vollständig qualifizierte Klassenname ist. Wenn wir beschreiben möchten, was das Servlet tut, können wir das Attributdescriptionverwenden.

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

4. @WebInitParam

Diese Annotation wird mit dem AttributinitParams der Annotation@WebServletund den Initialisierungsparametern des Servlets verwendet.

In diesem Beispiel setzen wir einen Servlet-Initialisierungsparametertype auf den Wert "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 seine interne Logik zu berühren, können wir die AnnotationWebFilterverwenden. Wir können Filter mit einem Servlet oder mit einer Gruppe von Servlets und statischen Inhalten verknüpfen, 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@WebListenerverwenden.

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

  • ServletContextListener – for Benachrichtigungen über den Lebenszyklus vonServletContext

  • ServletContextAttributeListener – for Benachrichtigungen, wenn einServletContext Attribut geändert wird

  • ServletRequestListener – for Benachrichtigungen, wenn eine Anforderung für eine Ressource erfolgt

  • ServletRequestAttributeListener – for Benachrichtigungen, wenn ein Attribut inServletRequest hinzugefügt, entfernt oder geändert wird

  • HttpSessionListener – for Benachrichtigungen, wenn eine neue Sitzung erstellt und zerstört wird

  • HttpSessionAttributeListener – for 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 mitServletContextListener 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 beschränken wir den Zugriff auf unsereAccountServlet mithilfe der Annotation@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();
    }
}

In diesem Fall öffnet der Browser beim Aufrufen vonAccountServlet, 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 Attributevalue undhttpMethodConstraints, der Annotation@ServletSecurity anzugeben.

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

@HttpConstraint hat drei Attribute:

  • Wert

  • Rollen erlaubt

  • Transportgarantie

Von diesen Attributen ist das am häufigsten verwendete AttributrolesAllowed. Im obigen Beispielcode-Snippet dürfen Benutzer, die zur RolleMembergehören, alle HTTP-Methoden aufrufen.

Mit der Annotation von@HttpMethodConstraintkönnen wir die Sicherheitsbeschränkungen einer bestimmten HTTP-Methode angeben.

@HttpMethodConstraint hat die folgenden Attribute:

  • Wert

  • emptyRoleSemantic

  • Rollen erlaubt

  • Transportgarantie

Im obigen Beispielcode-Snippet wird gezeigt, wie die MethodedoPostnur für Benutzer eingeschränkt ist, die zur RolleAdmingehören, sodass die Einzahlungsfunktion nur von einem BenutzerAdminausgeführt werden kann.

8. @MultipartConfig

Diese Annotation wird verwendet, wenn ein Servlet mit Annotationen versehen werden muss, ummultipart/form-data Anforderungen zu verarbeiten (normalerweise für ein Servlet zum Hochladen von Dateien verwendet).

Dadurch werden die MethodengetParts() undgetPart(name) derHttpServletRequest verfügbar gemacht, mit denen auf alle Teile sowie auf ein einzelnes Teil zugegriffen werden kann.

Die hochgeladene Datei kann durch Aufrufen vonwrite(fileName) des Part-Objekts auf die Festplatte geschrieben werden.

Nun sehen wir uns ein BeispielservletUploadCustomerDocumentsServlet an, das seine Verwendung demonstriert:

@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 hat vier Attribute:

  • 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 abgelegt (Größe in Bytes)

  • 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).

  • location - Dies ist das Verzeichnis, in dem hochgeladene Dateien gespeichert werden

9. Fazit

In diesem Artikel befassten wir uns mit einigen Java EE-Anmerkungen, die mit der Servlet-API 3.1 eingeführt wurden, sowie mit deren Zweck und Verwendung.

Der Quellcode zu diesem Artikel istover on GitHub.