JSTL详解


什么是JSTL?

JSP Standard Tag Library,简称JSTL,JSP标准标签库,提供了一系列的标签供开发者在JSP页面中使用,编写各种动态功能。

常用JSTL标签库

JSTL提供了很多标签,以库为单位进行分类,实际开发中最常用的标签库有3种。

1.核心标签库

2.格式化标签库

3.函数标签库

如何使用?

1.Maven添加JSTL依赖jar文件。

<dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

2.JSP页面导入JSTL标签库,prefix设置前缀,相当于别名,在JSP页面中可以直接通过别名使用标签,uri设置对应的标签库。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

3.使用标签完成功能。

核心标签库

引入核心标签库。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

set:向域对象中添加一个数据。

var为变量名,value为变量值,scope为保存的域对象,默认为pageContext。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <c:set var="message" value="张三" scope="request"/>
     ${requestScope.message }
</body>
</html>

修改对象的属性值。

property为属性名,value为属性值,target为对象名,注意这里需要使用EL表达式。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.southwind.entity.Reader" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <%
        Reader reader = new Reader();
        request.setAttribute("reader", reader);
     %>
     <c:set value="张三" property="name" target="${reader}"></c:set>
     <c:set value="1" property="id" target="${reader}"></c:set>
     ${reader }
</body>
</html>

out:输出域对象中的数据。

value为变量名,default的作用是若变量不存在,则输出default的值。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <c:set var="message" value="张三" scope="request"/>
     <c:out value="${message }" default="未定义"></c:out>
</body>
</html>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <c:out value="${message }" default="未定义"></c:out>
</body>
</html>

remove:删除域对象中的数据。

var为要删除的变量名。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <c:set var="info" value="Java"></c:set>
     <c:remove var="info"/>
     <c:out value="${info }" default="未定义"/>
</body>
</html>

catch:捕获异常。

若JSP的Java脚本抛出异常,会直接将异常信息打印到浏览器。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <%
        int num = 10/0;
     %>
</body>
</html>

使用catch可以将异常信息保存到域对象中。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <c:catch var="error">
     <%
        int num = 10/0;
     %>
     </c:catch>
     <c:out value="${error }"></c:out>
</body>
</html>

if :流程控制。

test为判断条件,如果条件成立,会输出标签内部的内容,否则不输出。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <c:set value="1" var="num1"></c:set>
     <c:set value="2" var="num2"></c:set>
     <c:if test="${num1>num2}">${num1 } > ${num2 }</c:if>
     <c:if test="${num1<num2}">${num1 } < ${num2 }</c:if>
</body>
</html>

choose:流程控制。

相当于if-else的用法,when相当于if,otherwise相当于else。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <c:set value="1" var="num1"></c:set>
     <c:set value="2" var="num2"></c:set>
     <c:choose>
          <c:when test="${num1>num2}">${num1 }</c:when>
          <c:otherwise>${num2 } </c:otherwise>   
     </c:choose>
</body>
</html>

forEach:迭代集合。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.southwind.entity.Reader" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        Reader reader1 = new Reader();
        reader1.setId(1);
        reader1.setName("张三");
        Reader reader2 = new Reader();
        reader2.setId(2);
        reader2.setName("李四");
        Reader reader3 = new Reader();
        reader3.setId(3);
        reader3.setName("王五");
        List<Reader> list = new ArrayList<Reader>();
        list.add(reader1);
        list.add(reader2);
        list.add(reader3);
        request.setAttribute("list", list);
        Map<Integer,Reader> map = new HashMap<Integer,Reader>();
        map.put(1, reader1);
        map.put(2, reader2);
        map.put(3, reader3);
        request.setAttribute("map", map);
        Set<Reader> set = new HashSet<Reader>();
        set.add(reader1);
        set.add(reader2);
        set.add(reader3);
        request.setAttribute("set", set);
    %>
     <c:forEach items="${list }" var="reader">
          ${reader }<br/>
       </c:forEach>
       <hr/>
     <c:forEach items="${map }" var="reader">
            ${reader }<br/>
     </c:forEach>
     <hr/>
     <c:forEach items="${set}" var="reader">
            ${reader }<br/>
     </c:forEach>
</body>
</html>

格式化标签库

可以将日期和数字按照一定的格式进行格式化输出。

引入格式化标签库:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

日期格式化:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <%
        pageContext.setAttribute("date", new Date());
     %>
     <c:out value="${date }"></c:out><br/>
     <fmt:formatDate value="${date }"/><br/>
     <fmt:formatDate value="${date }" pattern="yyyy-MM-dd hh:mm:ss" />
</body>
</html>

数字格式化:

value为数值,maxIntegerDigits为整数位,maxFractionDigits为小数位。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <fmt:formatNumber value="32165.23434" maxIntegerDigits="2" maxFractionDigits="3"></fmt:formatNumber>
</body>
</html>

函数标签库

引入函数标签库。

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

函数标签库的使用与其他标签稍有区别,类似与EL表达式。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <%
        pageContext.setAttribute("info", "Java,C");
     %>
     判断是否包含"Ja":${fn:contains(info,"Java") }<br/>
     判断是否以"Ja"开始:${fn:startsWith(info,"Ja") }<br/>
     判断是否以"C"结尾:${fn:endsWith(info,"C") }<br/>
     求"va"的下标:${fn:indexOf(info,"va") }<br/>
     "Java"替换为"JavaScript":${fn:replace(info,"Java","JavaScript") }<br/>
     截取:${fn:substring(info,2,3) }<br/>
     以","分割:${fn:split(info,",")[1] }
</body>
</html>


原文链接:https://blog.csdn.net/Howinfun/article/details/82751892