Статьи

EE JSP: генерация динамического контента с помощью библиотек тегов JSTL

Помимо написания ваших собственных пользовательских тегов в JSP , вы обнаружите, что Java EE фактически предоставляет готовый для использования набор стандартной библиотеки тегов Java (JSTL). Эти встроенные теги включают в себя повторяющиеся (для цикла) теги, теги условия, объявление переменных, теги вывода и т. Д. Библиотеки также поставляются со многими служебными функциями и тегами форматирования международных сообщений. Вот пример, как это выглядит.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
    <body>
        <h1>JSTL Examples</h1>
        <h2>List of Application Context: ${applicationScope}</h2>
        <table>
            <c:forEach var="entry" items="${applicationScope}">
            <tr>
                <td>${entry.key}</td>
                <td>
                    <c:out value="${entry.value}"/>
                </td>
            </tr>
            </c:forEach>
        </table>
        
        <h2>List of Session Context: ${sessionScope}</h2>
        <table>
            <c:forEach var="entry" items="${sessionScope}">
            <tr>
                <td>${entry.key}</td>
                <td>
                    <c:out value="${entry.value}"/>
                </td>
            </tr>
            </c:forEach>
        </table>
        
        <h2>List of Page Context: ${pageScope}</h2>
        <table>
            <c:forEach var="entry" items="${pageScope}">
            <tr>
                <td>${entry.key}</td>
                <td>
                    <c:out value="${entry.value}"/>
                </td>
            </tr>
            </c:forEach>
        </table>
        
        <h2>List of Request Context: ${requestSope}</h2>
        <table>
            <c:forEach var="entry" items="${requestSope}">
            <tr>
                <td>${entry.key}</td>
                <td>
                    <c:out value="${entry.value}"/>
                </td>
            </tr>
            </c:forEach>
        </table>
        
        <h2>List of Query Parameters: ${param}</h2>
        <table>
            <c:forEach var="entry" items="${param}">
            <tr>
                <td>${entry.key}</td>
                <td>
                    <c:out value="${entry.value}"/>
                </td>
            </tr>
            </c:forEach>
        </table>
        
        <h2>List of Header Parameters: ${header}</h2>
        <table>
            <c:forEach var="entry" items="${header}">
            <tr>
                <td>${entry.key}</td>
                <td>
                    <c:out value="${entry.value}"/>
                </td>
            </tr>
            </c:forEach>
        </table>      
        
        <h2>List of Cookies: ${cookie}</h2>
        <table>
            <c:forEach var="entry" items="${cookie}">
            <tr>
                <td>${entry.key}</td>
                <td>
                    <c:out value="${entry.value}"/>
                </td>
            </tr>
            </c:forEach>
        </table>
    </body>
</html>

Я использовал основной тег здесь для отображения записей карты нескольких неявных переменных. Вы можете узнать больше об этих объявлениях тегов, которые я определил в верхней части страницы примера из спецификации. Этот код взят из jsp-примера из GitHub.

ПРИМЕЧАНИЕ: при развертывании приведенного выше примера в GlassFish 3/4 вы столкнетесь с исключением NullPointerException, в результате чего страница выдаст ошибку. Оказывается, что сервер GF добавил внутреннюю переменную с именем com.sun.jsp.taglibraryCache в ServletContext (область приложения), которая выдает NPE при вызове его toString ()! Чтобы обойти это, я создал jstl-example2.jsp

это оборачивает $ {entry.value} в пользовательскую функцию JSTL, чтобы гарантировать возвращение вывода без исключения. Итак, извлеченный урок заключается в том, что вы всегда должны возвращать строку и не выбрасывать исключение при переопределении
toString () класса Java. Это просто плохая практика.