除了在JSP中编写自己的定制标记之外,您还将发现Java EE实际上提供了一组Java标准标记库(JSTL)供您使用。 这些内置标签包括重复(for-loop)标签,条件标签,变量声明和输出标签等。库还带有许多实用程序功能和国际消息格式标签。 这是一个看起来像的例子。
<%@ 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>
我在这里使用了核心标记,以显示一些隐式变量的映射条目。 您可以在Spec的示例页面顶部定义的那些标签声明中进行更多研究。 这些代码来自GitHub的jsp-example 。
GLASSFISH注意:在GlassFish 3/4中部署以上示例时,您将遇到NullPointerException并导致页面导致错误。 事实证明,GF服务器在ServletContext(应用程序范围)中添加了一个名为com.sun.jsp.taglibraryCache的内部变量,该变量在调用toString()时会抛出NPE! 要解决此问题,我创建了jstl-example2.jsp
将$ {entry.value}包装到自定义JSTL函数中,从而保证返回输出而不会引发异常。 因此,吸取的教训是,您应该始终返回一个String,并且在覆盖时不要抛出Exception
Java类的toString()。 这只是不好的做法。
翻译自: https://www.javacodegeeks.com/2015/02/ee-jsp-generating-dynamic-content-jstl-tag-libraries.html