JSTL标签
java标准标签库,英文全称:java standard tag libarary
1 分类
共有以下几种:
核心标签库 (c标签库) //常用,熟练运用
国际化标签(fmt标签库)
EL函数库(fn函数库)
xml标签库(x标签库)//操作xml,但是一般在dao层做,不用了解
sql标签库(sql标签库)//操作sql数据库,但是一般在dao层做,不用了解
2 使用步骤
2.1 导入jstl支持的jar包
(标签背后隐藏的java代码,因为jstl标签语言(还有jsp标签)都会被编译成java代码,java代码需要jar包的支持)
注意:使用javaee5.0以上的项目,会自动导入jstl支持的jar包
2.2 使用taglib指令导入标签库
使用taglib标签导入标签库: <%@ taglib uri="tld文件的uri名称" prefix="简写" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
注意:上面prefix一般都写c,也可以是其它字母。
2.3 完成上面2个步骤了,就可以在jsp中使用jstl
核心标签了。若是要使用fmt标签库,fn函数库等,则需根据第2.2中,使用taglib标签指令,添加对应的uri,就能使用了。
3 核心标签库的重点标签
保存数据:<c:set></c:set>获取数据:<c:out value=""></c:out>单条件判断:<c:if test=""></c:if>多条件判断:<c:choose></c:choose><c:when test=""></c:when><c:otherwise></c:otherwise>循环数据:<c:forEach items=”” var=””></c:forEach><c:forTokens items="" delims=""></c:forTokens>重定向:<c:redirect></c:redirect>
3.1 <c:set>标签
<c:set>标签用于把某一个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。
3.2 <c:out>标签
out标签:用于输出一段文本到浏览器中。也可以结合EL表达式,获取域中的值并输出。和EL表达式直接输出唯一区别是可以结合escapeXml属性和default属性作用。
3.3 <c:if>标签
if标签:单条件的判断
3.4 <c:choose>标签
<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
3.5<c:forEach>标签
<
c:forEach
>
标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
forEach中的属性:
begin:从集合中的第begin个元素开始进行迭代,begin的索引值默认从0开始编号。end:到哪个索引值结束,默认到最后一个元素。step:指定迭代的步长,即迭代因子的迭代增量,默认是1items:将要迭代的集合对象var:当前迭代到的对象
varStatus:当前正在遍历元素的状态对象。(其中count属性:当前遍历的位置,从1开始。)
3.6 <c:forTokens>标签
forTokens标签:循环切割特殊字符串。
3.7 <c:redirect>标签
<
c:redirect
>
标签用于将当前的访问请求转发或重定向到其他资源,它可以根据
url
属性所指定的地址,执行类似
<
jsp:forward
>
这个
JSP
标准标签的功能,将访问请求转发到其他资源;或执行
response.sendRedirect
()
方法的功能,将访问请求重定向到其他资源。
验证Demo如下:
<%@ page language="java" import="java.util.*, com.cn.entity.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>使用jstl核心标签库</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%--
使用jstl中的核心标签 库
--%>
<%-- set标签:保存数据(保存到域中),默认保存到page域中 --%>
<h2>set标签:保存数据(保存到域中),默认保存到page域中,属性socope的值可为:page/request/session/application</h2>
<c:set var="name" value="page1111"></c:set>
取出scope默认值(page域)中保存的数据:${name }<br/>
<c:set var="name" value="page1111" scope="page"></c:set>
取出page域中保存的数据:${pageScope.name }<br/>
<c:set var="name" value="request2222" scope="request"></c:set>
取出request域中保存的数据:${requestScope.name }<br/>
<c:set var="name" value="session2222" scope="session"></c:set>
取出session域中保存的数据:${sessionScope.name }<br/>
<c:set var="name" value="application2222" scope="application"></c:set>
取出application域中保存的数据:${applicationScope.name }<br/>
<hr/>
<%-- out标签:用于输出一段文本到浏览器中 --%>
<h2>out标签:用于输出一段文本到浏览器中。也可以结合EL表达式,获取域中的值并输出。和EL表达式直接输出唯一区别是可以结合escapeXml属性和default属性作用</h2>
直接输出值:<c:out value="这里写什么,就直接输出什么"></c:out><br/>
默认从page域中获取数据:<c:out value="${name }"></c:out><br/>
用out标签从page域中获取数据:<c:out value="${pageScope.name }"></c:out><br/>
用out标签从request域中获取数据:<c:out value="${requestScope.name }"></c:out><br/>
用out标签从session域中获取数据:<c:out value="${sessionScope.name }"></c:out><br/>
用out标签从application域中获取数据:<c:out value="${applicationScope.name }"></c:out><br/>
<%--
out标签与el表达式有区别吗?详见下面的例子。
out标签中的属性:
default:当value的值为null后者""空时,可以输出默认值。但是el表达式只能输出空。
escapeXml:是否对value值进行转义(指定是否将>、<、&、'、" 等特殊字符进行HTML编码转换后再进行输出。)
false,转义,则将其中的html、xml解析出来。
true,不转义(默认)
--%>
<%
String msg = null;
pageContext.setAttribute("msg", msg);
%>
out标签default属性的作用::<c:out value="${msg }" default="默认值:<h3>这里会原样输出吗?</h3>"></c:out><br/>
out标签escapeXml属性的作用:<c:out value="${msg }" default="默认值:<h3>这里会原样输出吗?</h3>" escapeXml="false"></c:out><br/>
out标签escapeXml属性的作用(使用EL表达式):<c:out value="${msg }" default="默认值:<h3>这里会原样输出吗?</h3>" escapeXml="${!(empty msg) }"></c:out><br/>
EL表达式获取的值:${msg }
<hr/>
<%-- if标签:单条件的判断 --%>
<h2>if标签:单条件的判断</h2>
<c:if test="true">
条件成立,这里会显示出来。<br/>
</c:if>
<c:if test="${5>3 }">
条件成立,这里会显示出来。<br/>
</c:if>
<c:if test="${empty msg }">
条件成立,这里会显示出来。<br/>
</c:if>
<c:if test="false">
条件不成立,这里不会显示出来。<br/>
</c:if>
<c:if test="${5<3 }">
条件不成立,这里不会显示出来。<br/>
</c:if>
<%-- choose标签+when标签+otherwise标签:多条件的判断 --%>
<h2>choose标签+when标签+otherwise标签</h2>
<c:set var="score" value="83" scope="page"></c:set>
考试成绩为${score }分,成绩为:<c:choose>
<c:when test="${score>=90 && score<=100}">优秀</c:when>
<c:when test="${score>=80 && score<90}">良好</c:when>
<c:when test="${score>=60 && score<80}">一般</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
<hr/>
<%-- forEach标签:循环 --%>
<%
//创建List集合数据
List<Student> list = new ArrayList();
list.add(new Student(1, "木丁西", '男', 24));
list.add(new Student(2, "marry", '女', 18));
list.add(new Student(3, "刘先森", '男', 59));
//将集合保存到page域中
pageContext.setAttribute("list", list);
//创建Map集合数据
Map<String, Student> map = new HashMap<String, Student>();
map.put("004", new Student(4, "吴莫愁", '女', 32));
map.put("005", new Student(5, "张馨予", '女', 35));
map.put("006", new Student(6, "木先生", '男', 33));
//将集合保存到page域中
pageContext.setAttribute("map", map);
%>
<%--
注意我用c:set存储集合不行
--%>
<%-- <c:set var="list2" value="${list }"></c:set> --%>
>>>>>>>>>>>>>>>>>>>${empty list }<c:out value="${list }" default="哈哈哈"></c:out>
<h2>forEach标签:循环</h2>
<%--
forEach中的属性:
begin:从集合中的第begin个元素开始进行迭代,begin的索引值默认从0开始编号。
end:到哪个索引值结束,默认到最后一个元素。
step:指定迭代的步长,即迭代因子的迭代增量,默认是1
items:将要迭代的集合对象
var:当前迭代到的对象
varStatus:当前正在遍历元素的状态对象。(其中count属性:当前遍历的位置,从1开始。)
--%>
<%-- 遍历List --%>
<c:forEach begin="0" end="2" step="1" items="${pageScope.list }" var="stu" varStatus="varSta">
第${varSta.count }个学生-->编号:${stu.id }#姓名:${stu.name }#性别:${stu.sex }#年龄:${stu.age }<br/>
</c:forEach>
<%-- 遍历Map --%>
<c:forEach items="${map }" var="entry">
${entry.key }=${entry.value }【编号:${entry.value.id }#姓名:${entry.value.name }#性别:${entry.value.sex }#年龄:${entry.value.age }】<br/>
</c:forEach>
<hr/>
<%-- forTokens标签:循环切割特殊字符串
其属性如下:
items:将要迭代的集合对象
delims:字符串的分割符,可以同时有几个分割符(依次写在引号内即可。)
var:String类型,当前迭代的对象元素
--%>
<h2>forTokens标签:循环切割特殊字符串</h2>
<%
String str = "刘先生+java-php*net-python-木先生";
pageContext.setAttribute("str", str);
%>
<c:forTokens delims="-*+" items="${str }" var="s" >
${s }<br/>
</c:forTokens>
<hr/>
<%-- redirect:重定向
--%>
<h2>redirect:重定向</h2>
<%-- <c:redirect url="http://www.baidu.com"></c:redirect> --%>
<%-- <c:redirect url="/index.jsp"></c:redirect> --%>
</body>
</html>
效果: