一、JSTL标签库简介
JSTL标签库的使用是为了弥补html标签的不足,规范定义而诞生的。其包括核心标签、国际化标签、数据库标签、xml标签和JSTL函数。
二、核心标签库说明
JSTL的核心标签共有13个,从功能上分为4类:
- 表达式控制标签:out标签、set标签、remove标签、catch标签
- 流程控制标签:if标签、choose标签、when标签、otherwise标签
- 循环标签:forEach标签、forTokens标签
- URL操作标签:import标签、url标签、redirect标签、param标签
在JSP页面引入核心标签库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
三、表达式控制标签
1.out标签
功能:用来输出数据对象(字符串、表达式)的内容或结果。
语法:
- <c:out value="要显示的数据对象" 【escapeXml=“true|false”】 【default=“默认值”】 />
- <c:out value="要显示的数据对象" 【escapeXml=“true|false”】>默认值</c:out>
标签属性:
范例
<%@ page language="java" pageEncoding="UTF-8"%>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML>
<html>
<head>
<title>JSTL: --表达式控制标签“out”标签的使用</title>
</head>
<body>
<h3><c:out value="下面的代码演示了c:out的使用,以及在不同属性值状态下的结果。"/></h3>
<hr/>
<ul>
<%--(1)直接输出了一个字符串。 --%>
<li>(1)<c:out value="JSTL的out标签的使用" /></li>
<li>(2)<c:out value="<a href='http://www.cnblogs.com/'>点击链接到博客园</a>" /></li>
<%--escapeXml="false"表示value值中的html标签不进行转义,而是直接输出 --%>
<li>(3)<c:out value="<a href='http://www.cnblogs.com/'>点击链接到博客园</a>" escapeXml="false"/></li>
<%--(4)字符串中有转义字符,但在默认情况下没有转换。 --%>
<li>(4)<c:out value="<未使用字符转义>" /></li>
<%--(5)使用了转义字符<和>分别转换成<和>符号。 --%>
<li>(5)<c:out value="<使用字符转义>" escapeXml="false"></c:out></li>
<%--(6)设定了默认值,从EL表达式${null}得到空值,所以直接输出设定的默认值。 --%>
<li>(6)<c:out value="${null}">使用了默认值</c:out></li>
<%--(7)未设定默认值,输出结果为空。 --%>
<li>(7)<c:out value="${null}"></c:out></li>
<%--(8)设定了默认值,从EL表达式${null}得到空值,所以直接输出设定的默认值。 --%>
<li>(8)<c:out value="${null}" default="默认值"/></li>
<%--(9)未设定默认值,输出结果为空。 --%>
<li>(9)<c:out value="${null}"/></li>
</ul>
</body>
</html>
2.set标签
功能:用于把某个对象存在指定的域范围内,或者将某个对象存储到Map或者JavaBean对象中。
语法:
- <c:set value="值1" var="name1" 【scope=“page|reuqest|session|application”】 />
- <c:set var="name2" 【scope="page|request|session|application】> 值2</c:set>
- <c:set value="值3" target="JavaBean对象" property="属性名" />
- <c:set target="JavaBean对象" property="属性名">值</c:set>
标签属性
Person类
/**
* 类名称:Person
* 类描述:一个只有getter和setter方法的JavaBean或者说一个pojo(简单的Java对象(Plain Old Java Objects))类,
* 作为一个vo(数据传输对象)。定义了四个变量age、name、sex和home。
*/
public class Person {
private String age;
private String home;
private String name;
private String sex;
public String getAge() {
return age;
}
public String getHome() {
return home;
}
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public void setAge(String age) {
this.age = age;
}
public void setHome(String home) {
this.home = home;
}
public void setName(String name) {
this.name = name;
}
public void setSex(String sex) {
this.sex = sex;
}
}
范例
<%@ page language="java" pageEncoding="UTF-8" import="java.util.*"%>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%--使用JSP的指令元素指定要使用的JavaBean --%>
<jsp:useBean id="person" class="javaBean.Person"/>
<%--负责实例化Bean,id指定实例化后的对象名,可以通过${person}得到person在内存中的值(或者使用person.toString()方法)。 --%>
<!DOCTYPE HTML>
<html>
<head>
<title>JSTL: --表达式控制标签“set”标签的使用</title>
</head>
<body>
<h3>代码给出了给指定scope范围赋值的示例。</h3>
<hr/>
<ul>
<%--将data1的值放入page范围中 --%>
<li>把值放入page域中:<c:set var="data1" value="page" scope="page"></c:set></li>
<%--使用EL表达式从pageScope取出data1的值 --%>
<li>page域中取值:${pageScope.data1}</li>
<%--将data2的值放入request范围中 --%>
<li>把值放入request域中:<c:set var="data2" value="request" scope="request"></c:set></li>
<%--使用EL表达式从requestScope取出data2的值 --%>
<li>request域中取值:${requestScope.data2}</li>
<%--将data3的值放入session范围中 --%>
<li>把值放入request域中:<c:set value="session" var="data3" scope="session"></c:set></li>
<%--使用EL表达式从sessionScope取出data3的值 --%>
<li>ssession域中取值:${sessionScope.data3}</li>
<%--将data4的值放入application范围中 --%>
<li>把值放入applicationScope域中:<c:set value="application" var="data4" scope="application"></c:set></li>
<%--使用EL表达式从application取出data4的值 --%>
<li>ssession域中取值:${applicationScope.data4}</li>
<%--不指定范围使用EL自动查找得到值 --%>
<li>未指定scope的范围,会从不同的范围内查找得到相应的值:${data1}、${data2}、${data3}、${data4}</li>
</ul>
<hr/>
<h3>使用Java脚本实现以上功能</h3>
<ul>
<li>把一个值放入page域中。<%pageContext.setAttribute("data1","page");%></li>
<li>从page域中得到值:<%out.println(pageContext.getAttribute("data1"));%></li>
<li>把一个值放入request域中。<%request.setAttribute("data2","request");%></li>
<li>从request域中得到值:<%out.println(request.getAttribute("data2"));%></li>
<li>把一个值放入session域中。<%session.setAttribute("data3","session");%></li>
<li>从session中域得到值:<%out.println(session.getAttribute("data3"));%></li>
<%--out.println()方法与<%=%>表达式输出功能一样
但使用表达式输出(<%=%>)明显要比使用out.println()输出更好。
--%>
<li><%=session.getAttribute("data3") %></li>
<li>把另一个值放入application域中。<%application.setAttribute("data4","application");%></li>
<li> 从application域中得到值:<%out.println(application.getAttribute("data4"));%></li>
<li><%=application.getAttribute("data4")%></li>
<li>未指定scope的范围,会从不同的范围内查找得到相应的值:
<%=pageContext.findAttribute("data1")%>、
<%=pageContext.findAttribute("data2")%>、
<%=pageContext.findAttribute("data3")%>、
<%=pageContext.findAttribute("data4")%>
</li>
</ul>
<hr/>
<h3>操作JavaBean,设置JavaBean的属性值</h3>
<%--设置JavaBean的属性值,等同与setter方法,Target指向实例化后的对象,property指向要插入值的参数名。
注意:使用target时一定要指向实例化后的JavaBean对象,也就是要跟<jsp:useBean>配套使用,
也可以java脚本实例化,但这就失去了是用标签的本质意义。
使用Java脚本实例化:
<%@page import="javabean.Person"%
<% Person person=new Person(); %>
--%>
<c:set target="${person}" property="name">韩信</c:set>
<c:set target="${person}" property="age">25</c:set>
<c:set target="${person}" property="sex">男</c:set>
<c:set target="${person}" property="home">中国</c:set>
<ul>
<li>使用的目标对象为:${person}</li>
<li>从Bean中获得的name值为:<c:out value="${person.name}"></c:out></li>
<li>从Bean中获得的age值为:<c:out value="${person.age}"></c:out></li>
<li>从Bean中获得的sex值为:<c:out value="${person.sex}"></c:out></li>
<li>从Bean中获得的home值为:<c:out value="${person.home}"></c:out></li>
</ul>
<hr/>
<hr/>
<h3>操作Map</h3>
<%
Map map = new HashMap();
request.setAttribute("map",map);
%>
<%--将data对象的值存储到map集合中 --%>
<c:set property="data" value="韩信" target="${map}"/>
${map.data}
</body>
</html>
3.remove标签
功能:从指定JSP范围移除指定变量
语法:<c:remove var="变量名" 【scope=“page|request|session|application"】/>
范例
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML>
<html>
<head>
<title>JSTL: --表达式控制标签“remove”标签的使用</title>
</head>
<body>
<ul>
<c:set var="name" scope="session">韩信</c:set>
<c:set var="age" scope="session">25</c:set>
<li><c:out value="${sessionScope.name}"></c:out></li>
<li><c:out value="${sessionScope.age}"></c:out></li>
<%--使用remove标签移除age变量 --%>
<c:remove var="age" />
<li><c:out value="${sessionScope.name}"></c:out></li>
<li><c:out value="${sessionScope.age}"></c:out></li>
</ul>
</body>
</html>
4.catch标签
功能:用于捕获嵌套在标签体中的内容抛出的异常
语法:<c:catch 【var="varName"】>容易产生异常的代码</c:catch>(var属性用于标识标签捕获的异常对象,它将保存在page域中)
范例
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML>
<html>
<head>
<title>JSTL: --表达式控制标签“catch”标签实例</title>
</head>
<body>
<h4>catch标签实例</h4>
<hr>
<%--把容易产生异常的代码放在<c:catch></c:catch>中,
自定义一个变量errorInfo用于存储异常信息 --%>
<c:catch var="errorInfo">
<%--实现了一段异常代码,向一个不存在的JavaBean中插入一个值--%>
<c:set target="person" property="hao"></c:set>
</c:catch>
<%--用EL表达式得到errorInfo的值,并使用<c:out>标签输出 --%>
异常:<c:out value="${errorInfo}" /><br />
异常 errorInfo.getMessage:<c:out value="${errorInfo.message}" /><br />
异常 errorInfo.getCause:<c:out value="${errorInfo.cause}" /><br />
异常 errorInfo.getStackTrace:<c:out value="${errorInfo.stackTrace}" />
</body>
</html>
四、流程控制标签
1.if标签
功能:用来实现条件控制。
语法:
- <c:if test="testCondition" var="varName" 【scope=“{page|request|session|application}”】/>
- <c:if test="testCondition" 【var="varName"】 【scope="{page|request|session|application}"】></c:if>
标签属性
范例
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML>
<html>
<head>
<title>JSTL: --流程控制标签 if标签示例</title>
</head>
<body>
<h4>if标签示例</h4>
<hr>
<form action="JSTL_if_tag.jsp" method="post">
<input type="text" name="uname" value="${param.uname}">
<input type="submit" value="登录">
</form>
<%--使用if标签进行判断并把检验后的结果赋给adminchock,存储在默认的page范围中。 --%>
<c:if test="${param.uname=='admin'}" var="adminchock">
<%--可以把adminchock的属性范围设置为session,这样就可以在其他的页面中得到adminchock的值,
使用<c:if text=”${adminchock}”><c:if>判断,实现不同的权限。 --%>
<c:out value="管理员欢迎您!"/>
</c:if>
<%--使用EL表达式得到adminchock的值,如果输入的用户名为admin将显示true。 --%>
${adminchock}
</body>
</html>
2.choose标签、when标签、otherwise标签
功能:类似于if-else if-else
语法:
<c:when test="条件1">
//业务逻辑1
<c:when>
<c:when test="条件2">
//业务逻辑2
<c:when>
<c:when test="条件n">
//业务逻辑n
<c:when>
<c:otherwise>
//业务逻辑
</c:otherwise>
</c:choose>
范例
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML>
<html>
<head>
<title>JSTL: -- choose及其嵌套标签标签示例</title>
</head>
<body>
<h4>choose及其嵌套标签示例</h4>
<hr/>
<%--通过set标签设定score的值为85 --%>
<c:set var="score" value="85"/>
<c:choose>
<%--使用<c:when>进行条件判断。
如果大于等于90,输出“您的成绩为优秀”;
如果大于等于70小于90,输出“您的成绩为良好”;
大于等于60小于70,输出“您的成绩为及格”;
其他(otherwise)输出“对不起,您没能通过考试”。
--%>
<c:when test="${score>=90}">
你的成绩为优秀!
</c:when>
<c:when test="${score>70 && score<90}">
您的成绩为良好!
</c:when>
<c:when test="${score>60 && score<70}">
您的成绩为及格
</c:when>
<c:otherwise>
对不起,您没有通过考试!
</c:otherwise>
</c:choose>
</body>
</html>
1.forEach标签
功能:循环条件遍历集合。
语法:
<c:forEach
var=”name”
items=”Collection”
varStatus=”StatusName”
begin=”begin”
end=”end”
step=”step”>
本体内容
</c:forEach>
var=”name”
items=”Collection”
varStatus=”StatusName”
begin=”begin”
end=”end”
step=”step”>
本体内容
</c:forEach>
标签属性
varStatus属性
范例
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page import="java.util.ArrayList"%>
<!DOCTYPE HTML>
<html>
<head>
<title>JSTL: -- forEach标签实例</title>
</head>
<body>
<h4><c:out value="forEach实例"/></h4>
<%
List<String>list = new ArrayList<String>();
list.add(0, "贝贝");
list.add(1, "晶晶");
list.add(2, "欢欢");
list.add(3, "莹莹");
list.add(4, "妮妮");
request.setAttribute("list", list);
%>
<B><c:out value="不指定begin和end的迭代:" /></B><br>
<%--不使用begin和end的迭代,从集合的第一个元素开始,遍历到最后一个元素。 --%>
<c:forEach var="fuwa" items="${list}">
<c:out value="${fuwa}"/><br/>
</c:forEach>
<B><c:out value="指定begin和end的迭代:" /></B><br>
<%--指定begin的值为1、end的值为3、step的值为2,
从第二个开始首先得到晶晶,每两个遍历一次,
则下一个显示的结果为莹莹,end为3则遍历结束。 --%>
<c:forEach var="fuwa" items="${list}" begin="1" end="3" step="2">
<c:out value="${fuwa}"/><br/>
</c:forEach>
<B><c:out value="输出整个迭代的信息:" /></B><br>
<%--指定varStatus的属性名为s,并取出存储的状态信息 --%>
<c:forEach var="fuwa"
items="${list}"
begin="3"
end="4"
varStatus="s"
step="1">
<c:out value="${fuwa}" />的四种属性:<br>
所在位置,即索引:<c:out value="${s.index}" /><br>
总共已迭代的次数:<c:out value="${s.count}" /><br>
是否为第一个位置:<c:out value="${s.first}" /><br>
是否为最后一个位置:<c:out value="${s.last}" /><br>
</c:forEach>
</body>
</html>
功能:该标签用于浏览字符串,并根据指定的字符将字符串截取。
语法:
<c:forTokens items=”strigOfTokens”
delims=”delimiters”
[var=”name”
begin=”begin”
end=”end”
step=”len”
varStatus=”statusName”] >
本体内容
</c:forTokens>
参数说明:
delims=”delimiters”
[var=”name”
begin=”begin”
end=”end”
step=”len”
varStatus=”statusName”] >
本体内容
</c:forTokens>
参数说明:
- items指定被迭代的字符串
- delims指定使用的分隔符
- var指定用来存放遍历到的成员
- begin指定遍历的开始位置
- end指定遍历结束的位置
- step指定遍历步长
- varStatus存放遍历到的成员的状态信息
范例
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML>
<html>
<head>
<title>JSTL: -- forTokens标签实例</title>
</head>
<body>
<h4><c:out value="forToken实例"/></h4>
<hr/>
<%--提示:分隔符的作用是根据标识,截取字符串。
如果未设定分隔符或在字符串中没有找到分隔付,将把整个元素作为一个元素截取。
在实际应用中用于在除去某些符号在页面中显示。 --%>
<c:forTokens var="str" items="北、京、欢、迎、您" delims="、">
<c:out value="${str}"></c:out><br/>
</c:forTokens>
<br/>
<c:forTokens items="123-4567-8854" delims="-" var="t">
<c:out value="${t}"></c:out><br/>
</c:forTokens>
<br/>
<c:forTokens items="1*2*3*4*5*6*7"
delims="*"
begin="1"
end="3"
var="n"
varStatus="s">
<c:out value="${n}" />的四种属性:<br>
所在位置,即索引:<c:out value="${s.index}" /><br>
总共已迭代的次数:<c:out value="${s.count}" /><br>
是否为第一个位置:<c:out value="${s.first}" /><br>
是否为最后一个位置:<c:out value="${s.last}" /><br>
</c:forTokens>
</body>
</html>
六、URL操作标签
1.import标签
功能:该标签可以把其他静态或动态文件包含到JSP文件,与<jsp:include>的区别: <jsp:include>只能包含喊一个web应用中的文件,而<c:import>可以包含其他web应用中的文件,甚至是网络上的资源。
语法:
- <c:import url="url" 【context=“context”】【value=“value”】【scope=“page|request|session|application”】/>
- <c:import url="url" varReader="name" 【context="context"】 【charEncoding="encoding"】/>
范例
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML>
<html>
<head>
<title>JSTL: -- import标签实例</title>
</head>
<body>
<h4><c:out value="import实例"/></h4>
<hr/>
<h4><c:out value="绝对路径引用的实例" /></h4>
<%--使用绝对路径导入百度首页,
导入时使用<c:catch></c:catch>捕获异常。
--%>
<c:catch var="error1">
<c:import url="http://wwww.baidu.com" charEncoding="utf-8"/>
</c:catch>
${error1}
<hr/>
<h4>
<c:out value="相对路径引用本应用中的文件" />
</h4>
<%--使用相对路径导入同一文件夹下的“JSTL的import标签使用说明”文件,
接收的字符编码格式使用charEncoding设置为utf-8。 --%>
<c:catch var="error2">
<c:import url="JSTL的import标签使用说明" charEncoding="utf-8"/>
</c:catch>
${error2}
<hr/>
<h4><c:out value="使用字符串输出相对路径引用的实例,并保存在session范围内" /></h4>
<%--导入“JSTL的import标签使用说明.txt”,
使用var定义的变量接收要导入的文件,并存储在session中,
如果在其他页面同样也要导入该文件,只须使用<c:out>输出“JSTL的import标签使用说明.txt”的值即可。
--%>
<c:catch var="error3">
<c:import
var="myurl"
url="JSTL的import标签使用说明"
scope="session"
charEncoding="utf-8"/>
<c:out value="${myurl}"></c:out>
<hr/>
<c:out value="${myurl}" />
</c:catch>
${error3}
</body>
</html>
2.url标签
功能:用于在JSP页面中构建一个url地址,其主要目的是实现url重写。
语法:
- <c:url value="value" 【var="name"】 【scope="page|request|session|application"】 【context="context"】
- <c:url value="value" 【var="name"】 【scope=“page|request|session|application”】 【context="context"】><c:param name="参数名" value=“值“></c:url>
标签属性
范例
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML>
<html>
<head>
<title>JSTL: -- url标签实例</title>
</head>
<body>
<c:out value="url标签使用"></c:out>
<h4>使用url标签生成一个动态的url,并把值存入session中.</h4>
<hr/>
<c:url value="http://www.baidu.com" var="url" scope="session">
</c:url>
<a href="${url}">百度首页(不带参数)</a>
<hr/>
<h4>
配合 <c:param>标签给url加上指定参数及参数值,生成一个动态的url然后存储到paramUrl变量中
</h4>
<c:url value="http://www.baidu.com" var="paramUrl">
<c:param name="userName" value="韩信"/>
<c:param name="pwd">123456</c:param>
</c:url>
<a href="${paramUrl}">百度首页(带参数)</a>
</body>
</html>
3.redirect标签
功能:该标签用来实现重定向。
语法:
- <c:redirect url="url" 【context="contet"】/>
- <c:redirect url="url" 【context="context"】><c:param name="name1" value="value1"></c:redirect>
标签属性
范例
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML>
<html>
<head>
<title>JSTL: -- redirect标签实例</title>
</head>
<body>
<c:redirect url="http://www.baidu.com">
<%--在重定向时使用<c:param>标签为URL添加了两个参数:uname=GACL和password=123 --%>
<c:param name="uname">GACL</c:param>
<c:param name="password">123</c:param>
</c:redirect>
</body>
</html>