8.1 Wprowadzenie do adnotacji serwletów

Począwszy od wersji 7, Tomcat zaczął obsługiwać specyfikację serwletów WWW Servlet API 3.0 . W szczególności pojawił się w nim pakiet o nazwie javax.servlet.annotation. Zawiera różne rodzaje adnotacji, których można użyć do opisywania klasy serwletu. Jeśli używasz adnotacji, deskryptor wdrożenia (web.xml) nie jest wymagany.

Lista najbardziej przydatnych adnotacji:

adnotacja Opis
1 @WebServlet Deklaruje serwlet
2 @WebInitParam Określa parametr inicjalizacji
3 @WebFilter Deklaruje filtr internetowy
4 @WebListener Deklaruje web lisener
5 @ServletSecurity Umożliwia skonfigurowanie ustawień zabezpieczeń

Przykład:

@WebServlet( urlPatterns = {"/api/*"} )
public class Example extends HttpServlet {
    protected void doGet( HttpServletRequest request, HttpServletResponse response) throws Exception {
         response.setContentType("text/html");
         PrintWriter out = response.getWriter();
         out.println("Hello World!");
    }
}

Wystarczy jedna adnotacja, aby zadeklarować serwlet i zmapować go tak, aby obsługiwał wszystkie żądania, które będą przychodzić do adresu URL podanego przez plik /api/*.

8.2 Konfigurowanie mapowania serwletów

Adnotacja posiada @WebServletwiele parametrów, które pozwalają na bardzo elastyczną konfigurację opisywanego serwletu. Przyjrzyjmy się głównym z nich:

Atrybut Opis
1 name Unikalna nazwa serwletu (jak w web.xml)
2 displayName Czytelna dla człowieka nazwa serwletu
3 description Opis serwletu
4 value Ustawia adres URL dla mapowania
5 urlPatterns Określa listę adresów URL do mapowania (używane zamiast wartości)
6 initParams Umożliwia ustawienie parametrów początkowych serwletu
7 asyncSupported Określa, że ​​serwlet może działać asynchronicznie (HTTP/2)
8 loadOnStartup Numer sekwencyjny do sterowania priorytetem uruchamiania serwletu
9 smallIcon Ustawia małą ikonę serwletu
10 largeIcon Ustawia dużą ikonę serwletu

Jest tu kilka interesujących punktów.

Po pierwsze, zauważ, że valuei urlPatternssą atrybutami wymiennymi. Oba pozwalają określić listę adresów URL, na które aplet powinien być mapowany.

Po drugie, parametr asyncSupportedwskazuje, czy aplet będzie poprawnie przetwarzał żądania asynchroniczne przez protokół HTTP/2.

Trzecim ważnym atrybutem jest initParams, pozwala ustawić listę parametrów, które zostaną umieszczone w ServletContext.

Przykład:

@WebServlet(
        urlPatterns = {"/sendFile", "/uploadFile"},
        loadOnStartup = 1,
        asyncSupported = true,
        initParams = {
            @WebInitParam(name = "saveDir", value = "c:/uploaded"),
            @WebInitParam(name = "allowedTypes", value = "jpg,gif,png")
        }
)
public class ImageUploadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String saveDir = getInitParameter("saveDir");
        String fileTypes = getInitParameter("allowedTypes");

        PrintWriter writer = response.getWriter();

        writer.println("saveDir = " + saveDir);
        writer.println("fileTypes = " + fileTypes);
    }
}

8.3 Konfigurowanie mapowania filtrów

Jak wspomniano powyżej, filtry są serwletami typu użytkowego i są konfigurowane jak serwlety. Oto atrybuty adnotacji @WebFilter:

Atrybut Opis
1 filterName Filtruj unikalną nazwę (jak w web.xml)
2 displayName Czytelna dla człowieka nazwa filtra
3 description Opis filtra
4 value / urlPatterns Ustawia listę adresów URL do mapowania
5 dispatcherTypes Określa listę DispatcherTypes
6 servletNames Określa listę serwletów, do których należy się zastosować
7 initParams Umożliwia ustawienie parametrów początkowych filtra
8 asyncSupported Określa, że ​​filtr może działać asynchronicznie (HTTP/2)
9 smallIcon Ustawia małą ikonę filtra
10 largeIcon Ustawia dużą ikonę filtra

Przykład filtra, który przechwytuje wszystkie żądania do określonych serwletów :

@WebFilter(servletNames = {"MyOwnServlet", "UploadServlet"})
public class MyFilter implements Filter {
    // implements Filter's methods here...
}

Przykład filtra z wieloma parametrami :

@WebFilter(
        urlPatterns = "/uploadFilter",
        initParams = @WebInitParam(name = "fileTypes", value = "doc;xls;zip;txt;jpg;png;gif")
)
public class UploadFilter implements Filter {
    // implements Filter's methods here...
}

Przykład filtru podanego typu dla RequestDispatcher :

@WebFilter(
        urlPatterns = "/admin",
        dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD}
)
public class MyFilter implements Filter {
    // implements Filter's methods here...
}

Więcej o przeznaczeniu filtrów i serwletów dowiesz się z kolejnych wykładów.