JSTL标签函数库是JSP标签技术的第三个知识点,前两个分别是JSP标签、EL表达式和EL函数库。现在来学JSTL标签函数库。
一、JSTL的简介
JSTL是JavaServer Pages Standard Tag Library的缩写,它是由由JCP(Java Community Process)指定标准,可以配合EL表达式来取代java程序,提高代码的阅读性
那么JSTL是由谁开发的?
是由主要由Apache组织的Jakarta Project 实现
如何安装?
下载解压缩后将lib 中的jstl.jar、standard.jar 复制到WEB应用程序的WEB-INF\lib 下
现在还需要安装吗?
如果是javaEE5的就不用安装了,因为已经有了,看下面的图片。
主要有那几种函数库?
核心标签库 (core) --- c
国际化标签 fmt
数据库标签 sql
XML标签 xml
JSTL函数(EL函数) el
上一节我们已经学了 JSTL函数(EL函数) el,而数据库标签 sql 、XML标签 xml不学,国际化标签 fmt 留到以后才学,现在学核心标签库 (core) --- c,那么那个是(core) --- c,看下图描述文件:
二、JSTL的语法
主要的语法:
<c:out> 标签用于输出一段文本内容到pageContext对象当前保存的“out”对象中。
<c:set>标签用于把某一个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。
<c:remove>标签用于删除各种Web域中的属性
<c:catch>标签用于捕获嵌套在标签体中的内容抛出的异常,其语法格式如下:<c:catch [var="varName"]>nested actions</c:catch>
!!<c:if test=“”>标签可以构造简单的“if-then”结构的条件表达式
!!<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
!!<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
!!<c:forTokens>用来浏览一字符串中所有的成员,其成员是由定义符号所分隔的
<c:param>标签 在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。<c:param>标签可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。
<c:import> 标签,实现include操作
<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形式附加在URL地址后面
<c:redirect>标签用于实现请求重定向
下面一个一个的讲解:
1.<c:out>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="cc" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
</head>
<body>
<h1>1.输出常量</h1>
<cc:out value="这是常量"></cc:out>
${"这是常量"}
<h1>2.输出变量</h1>
<%
String str="变量";
request.setAttribute("var",str);
%>
<cc:out value="var"></cc:out>
<cc:out value="${var}"></cc:out>
${var}
<h1>3.输出默认值</h1>
<%
<span style="white-space:pre"> </span>String name="小红";
<span style="white-space:pre"> </span>//pageContext.setAttribute("name",name);
%>
<cc:out value="${name}" default="无名"></cc:out>
${var==null?"无名":var}
<h1>4.HTML转义输出</h1>
<a href="#">xxx</a>
<cc:out value="<a href='#'>xxx</a>"></cc:out>
${fn:escapeXml('<a href="#">xxx</a>') }
</body>
</html>
注意上面的有一行代码是引入描述文件的:
上面的cc是可以随便设定的。
2.<c:set>
3.<c:remove>
标签用于删除各种Web域中的属性
4.<c:catch>
标签用于捕获嵌套在标签体中的内容抛出的异常,其语法格式如下:<c:catch [var="varName"]>nested actions</c:catch>
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="catch"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
</head>
<body>
<catch:catch var="e">
<%
int i=3;
i=i/0;
%>
</catch:catch>
${e}
</body>
</html>
在浏览器中输入:http://localhost/Day06/Jstl/ccatch.jsp
就会显示出:
5.<c:if test=“”>
<c:if test=“”>标签可以构造简单的“if-then”结构的条件表达式
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="if" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
</head>
<body>
<if:if test="${3>1}" var="pp" >
这是正确的
</if:if>
<if:if test="${3<1}" var="kk">
这是错误的
</if:if>
${"<br>"}
${pp}
${"<br>"}
${kk}
</body>
</html>
显示:
6.<c:choose>
<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
String day="4";
pageContext.setAttribute("day",day);
%>
<c:choose>
<c:when test="${day==1}">
${"星期一"}
</c:when>
<c:when test="${day==2}">
${"星期二"}
</c:when>
<c:when test="${day==3}">
${"星期三"}
</c:when>
<c:when test="${day==4}">
${"星期四"}
</c:when>
<c:when test="${day==5}">
${"星期五"}
</c:when>
<c:otherwise>
${"休息日"}
</c:otherwise>
</c:choose>
</body>
</html>
可以显示:
7.<c:forEach>
<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
</head>
<body>
<h1>遍历数组中的数据</h1>
<%
String[] citys={"北京","上海","广州","香港"};
pageContext.setAttribute("citys",citys);
%>
<c:forEach items="${citys}" var="c">
${c}<br>
</c:forEach>
<h1>遍历集合中的数据</h1>
<%
List list=new ArrayList();
list.add("中国");
list.add("美国");
list.add("俄罗斯");
list.add("印度");
pageContext.setAttribute("list",list);
%>
<c:forEach items="${list}" var="l">
${l}<br>
</c:forEach>
<h1>遍历Map中的数据</h1>
<%
Map map=new LinkedHashMap();
map.put("1","第一号");
map.put("2","第二号");
map.put("3","第三号");
map.put("4","第四号");
pageContext.setAttribute("map",map);
%>
<c:forEach items="${map}" var="jk">
${jk}-----${jk.key}:${jk.value}<br>
</c:forEach>
<h1>循环执行指定的内容若干次</h1>
<c:forEach begin="0" end="10" step="2" var="i">
${i}
</c:forEach>
<h1>实验:遍历10到100的偶数,如果数字所在的位置是3的陪数,显示成红色</h1>
<c:forEach begin="10" end="100" step="2" var="i" varStatus="start">
<c:if test="${start.count%3==0}">
<font color="red">
${i}
</font>
</c:if>
<c:if test="${start.count%3!=0}">
<font color="blue">
${i}
</font>
</c:if>
</c:forEach>
</body>
</html>
可以显示:
7.<c:forTokens>
<c:forTokens>用来浏览一字符串中所有的成员,其成员是由定义符号所分隔的
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<c:forTokens items="wo-shi-guang-dong-ren" delims="-" var="str" begin="1" end="3">
${str}<br>
</c:forTokens>
</body>
</html>
可以显示:
8.<c:import>
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
from index.jsp
<c:import url="/index.jsp" var="p" scope="page"></c:import>
xxxx
yyyy
${p}
zzzz
</body>
</html>
可以显示
9.<c:url>
<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形式附加在URL地址后面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
String url=response.encodeURL(request.getContextPath()+"/index.jsp");
out.write(url);
%>
<a href="<%=url %>">首页</a>
<h1>用jstl进行url重写</h1>
<c:url value="/index.jsp" context="${pageContext.request.contextPath}" var="url1" scope="page"></c:url>
<a href="${url1}">首页</a>
</body>
</html>