今天在地铁刷公众号的时候看到这么一篇文章,JSTL详解,虽然现在已经很少项目用到了,页面的动态处理都是用饿Vue.js,不过当作复习一下也是挺好的,而且文章确实写的很简洁。
说实话,JSTL的标签库我自己用过的就只有核心标签库,但是实际开发中常用到的估计不止这么一下,下面我们看一下这篇文章。
转载自:公众号:Java大联盟,原创:南风。https://mp.weixin.qq.com/s/7YnCwq9fQ6CleqkZ8LRKew
什么是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>