1、JSTL 简介
(1)JavaServer Pages Standard Tag Library
(2)由JCP(Java Community Process)指定标准
(3)提供给 Java Web 开发人员一个标准通用的标签函数库
(4)和 EL 配合来取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性、维护性和方便性
2、JSTL1.1安装
(1)下载
JSTL 主要由Apache组织的Jakarta Project 实现
http://tomcat.apache.org/taglibs/standard/
容器必须支持Servlet 2.4 且JSP 2.0 以上版本
JavaEE1.4
(2)安装
解压缩后将lib 中的jstl.jar、standard.jar 复制到WEB应用程序的WEB-INF\lib 下
3、JSTL标签库
(1)核心标签库 (core) --- c
(2)国际化标签 fmt
(3)数据库标签 sql --Servlet
(4)XML标签 xml
(5)JSTL函数(EL函数) el
4、<c:out>标签
<c:out> 标签用于输出一段文本内容到pageContext对象当前保存的“out”对象中。
1.c:out 输出内容到浏览器端
输出固定值
<c:out value="Hello c out~"/>
输出变量
<c:out value="${m}"/>
转义html,默认为转义,可以设置escapeXml属性为false,禁止转义
<c:out value="<a href='#'>link</a>" escapeXml="false"/>
允许输出默认值,如果给定值不存在,输出默认值
<c:out value="${city}" default="北京"/>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ 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>
<hr><h1>进行html转义输出</h1>
<a href="#">xxx</a>
<c:out value="<a href='#'>xxx</a>" escapeXml="true"></c:out>
${fn:escapeXml("<a href='#'>xxx</a>") }
<hr><h1>输出默认值</h1>
<%
String age = "100";
pageContext.setAttribute("age",age);
%>
<c:out value="${age}" default="99"></c:out>
${empty age ? 99 : age }
<hr><h1>输出变量</h1>
<%
String name = "itheima";
pageContext.setAttribute("name",name);
%>
<c:out value="${name}"></c:out>
${name }
<hr><h1>输出常量</h1>
<c:out value="123456"></c:out>
${123456 }
</body>
</html>
5、<c:set>标签
<c:set>标签用于把某一个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。
2.c:set 设置值到四个域,设置四个范围中的java对象的属性性
在指定域中增加、修改属性
<c:set var="name" value="value" scope="page"/>
设置一个保存在四个范围的java对象的属性值,cset不能设置对象进域,但是可以更改域中对象的属性
<c:set targe="${person}" property="name" value="lisi"/>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@page import="com.itheima.domain.Person"%>
<%@ 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>
<hr><h1>设置JavaBean的属性</h1>
<%
Person p = new Person();
pageContext.setAttribute("p",p);
%>
<c:set target="${p}" property="name" value="小昭"></c:set>
${p.name }
<c:set target="${p}" property="name" value="赵敏"></c:set>
${p.name }
<hr><h1>向指定的Map中增加/修改属性</h1>
<%
Map map = new HashMap();
map.put("name","张无忌");
map.put("age",19);
pageContext.setAttribute("map",map);
%>
<c:set target="${map}" property="sex" value="男"></c:set>
${map.sex }
<c:set target="${map}" property="sex" value="女"></c:set>
${map.sex }
<hr><h1>向指定的域中增加/修改属性</h1>
<c:set var="name" scope="page" value="张三丰"></c:set>
${name }
<c:set var="name" scope="page" value="张翠山"></c:set>
${name }
</body>
</html>
6、<c:remove>标签
<c:remove>标签用于删除各种Web域中的属性。
其语法格式如下:
<c:remove var="varName"
[scope="{page|request|session|application}"] />
3.c:remove用来删除四个域中的值
<c:remove var="age" scope="page"/>
<%@ page language="java" import="java.util.*" 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>
</head>
<body>
<hr><h1>cremove可以删除各个域中的属性,如果不写scope属性,cremove的时候会将四个域中指定名称的属性都删掉</h1>
<%
pageContext.setAttribute("room","310");
request.setAttribute("room","311");
%>
${room }${requestScope.room }
<c:remove var="room"/>
${room }
</body>
</html>
7、<c:catch>标签
(1)<c:catch>标签用于捕获嵌套在标签体中的内容抛出的异常,其语法格式如下:<c:catch [var="varName"]>nested actions</c:catch>
(2)var属性用于标识<c:catch>标签捕获的异常对象,它将保存在page这个Web域中。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:catch var="myex“ >
<%
10/0;
%>
</c:catch>
异常:<c:out value="${myex}" /> ${myex}<br />
异常 myex.getMessage:<c:out value="${myex.message}" /><br />
异常 myex.getCause:<c:out value="${myex.cause}" /><br />
异常 myex.getStackTrace:<c:out value="${myex.stackTrace}" />
4.c:catch 用来捕获程序的异常,将捕获到的异常对象保存在page域中
<c:catch var="e">
<%
String s = null;
s.charAt(1);
%>
</c:catch>
${e.message}
8、<c:if>标签
<c:if test=“”>标签可以构造简单的“if-then”结构的条件表达式
5.c:if 用来取代页面中if语句,请记住,没有c:else,想要写else,只能再写个c:if,然后条件是反的
<c:if test="${n>5}"></c:if>
<%@ page language="java" import="java.util.*" 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>
</head>
<body>
<c:if test="${1 == 1}" var="flag" scope="page">
1确实等于1
</c:if>
${pageScope.flag }
<c:if test="${1 != 1}">
你确定吗?
</c:if>
</body>
</html>
9、<c:choose>标签
<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:set value="${param.count}" var="count“ /> pageContext(count,2)
<c:choose>
<c:when test="${count == 0}">
对不起,没有符合您要求的记录。
</c:when>
<c:otherwise>
符合您要求的记录共有${count}条.
</c:otherwise>
</c:choose>
6.c:choose c:when c:otherwise 一起使用,取代if elseif else 或 swich case
<c:choose>
<c:when test="${weekday==1}">
星期一
</c:when>
<c:when test="${weekday==1}">
星期二
</c:when>
<c:when test="${weekday==1}">
星期三
</c:when>
<c:otherwise>
输入无效
</c:otherwise>
</c:choose>
<%@ page language="java" import="java.util.*" 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>
</head>
<body>
<%
pageContext.setAttribute("num",99);
%>
<c:choose>
<c:when test="${num>100}">
num 大于100
</c:when>
<c:when test="${num<100}">
num 小于 100
</c:when>
<c:when test="${num == 100}">
num 等于 100
</c:when>
<c:otherwise>
num 是一个数字吗?
</c:otherwise>
</c:choose>
</body>
</html>
10、<c:forEach>标签
语法1:
<c:forEach [var="varName"]
items="collection" [varStatus="varStatusName"]
[begin="begin"]
[end="end"]
[step="step"]>
//Body内容
</c:forEach>
public int getIndex()返回当前迭代的索引号
public java.lang.Integer getStep()返回为标签设置的step属性的值,如果没有设置step属性则返回null
public boolean isFirst()返回当前是否是第一次迭代操作
public boolean isLast()返回当前是否是最后一次迭代操作
数组的遍历:将arr数组中的每个元素取出,保存到page域的i中
<c:forEach var="i" items="${arr}">
${i}
</c:forEach>
List遍历
<c:forEach var="e" items="${list}">
${e}
</forEach>
Map遍历
<c:forEach var="entry" items="map">
${entry.key} ${entry.value}
</c:forEach>
控制指定次数的循环:从1开始到10结束,步长为1,保存到i中,并求和
<c:forEach begin="1" end="10" step="1" var="i">
<c:set var="sum" value="${sum + i}">
</c:forEach>
<%
int atts[] = {1,2,3,4,5,6,7,8,9,10};
request.setAttribute("atts", atts);
%>
<c:forEach items="${atts}" var="item"
begin="0" end="9" step="1" >
${item}</br>
</c:forEach>
语法2:
<c:forEach [var="varName"]
[varStatus="varStatusName"]
begin="begin"
end="end"
[step="step"]>
//Body内容
</c:forEach>
<c:forEach begin="1" end="10" var="item" >
${item}</br>
</c:forEach>
11、varStatus属性
用来存放现在指到之成员的相关信息
------------------------------------------------------------------------------------------------
<c:forEach begin="10" end="100" step="2" var="i" varStatus="status">
<c:if test="${status.count}%3 == 0">
<font color="red">${i}</font>
</c:if>
<c:if test="${status.count}%3 != 0">
<font color="blue">${i}</font>
</c:if>
</c:forEach>
<c:forEach var="i" begin="100" end="200" step="5" varStatus="status">
<c:if test="${status.first}">
begin:<c:out value="${status.begin}">begin</c:out>
end:<c:out value="${status.end}">end</c:out>
step:<c:out value="${status.step}">step</c:out>
<br/>
sequence:
</c:if>
<c:out value="${i}"/>
<c:if test="${status.last}">
<br/>There are
<c:out value="${status.count}"/> numbers in the list.
</c:if>
</c:forEach>
----------------------------------------------------------------------------------------------
<%
Map<String,String> map = new HashMap<String,String>();
map.put("001","aaa");
map.put("002","bbb");
map.put("003","ccc");
request.setAttribute("map",map);
%>
<c:forEach var="m" items="${requestScope.map}">
${m.key } , ${m.value } <br/>
</c:forEach>
----------------------------------------------------------------------------------------------
<%
Map<String,String> map = new HashMap<String,String>();
map.put("001","aaa");
map.put("002","bbb");
map.put("003","ccc");
request.setAttribute("map",map);
%>
<c:forEach var="m" items="${requestScope.map}">
${m.key } , ${m.value } <br/>
</c:forEach>
实验:遍历10到100的偶数,如果数字所在的位置是3的倍数,显示成红色
<%@ page language="java" import="java.util.*" 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>
</head>
<body>
<br><hr><h1>实验:遍历10到100的偶数,如果数字所在的位置是3的倍数,显示成红色</h1>
<c:forEach begin="10" end="100" step="2" var="i" varStatus="status">
<c:if test="${status.count%3 == 0}">
<font color="red" >${i }</font>
</c:if>
<c:if test="${status.count%3 != 0}">
<font color="blue" >${i }</font>
</c:if>
</c:forEach>
<br><hr><h1>控制重复执行标签体</h1>
<c:forEach begin="0" end="10" step="2" var="i" varStatus="status">
${i }
</c:forEach>
<br><hr><h1>迭代Map中的元素</h1>
<%
Map map = new HashMap();
map.put("name","杨过");
map.put("age",17);
pageContext.setAttribute("map",map);
%>
<c:forEach items="${map}" var="entry">
${entry.key }:${entry.value }
</c:forEach>
<hr><h1>迭代List中的元素</h1>
<%
List list = new ArrayList();
list.add("天山童老");
list.add("李秋水");
list.add("无崖子");
pageContext.setAttribute("list",list);
%>
<c:forEach items="${list }" var="name">
${name }
</c:forEach>
<hr><h1>迭代数组中的元素</h1>
<%
String [] strs = {"王语嫣","段誉","虚竹","乔峰"};
pageContext.setAttribute("strs",strs);
%>
<c:forEach items="${strs}" var="str">
${str }
</c:forEach>
</body>
</html>
12、<c:forTokens>
用来浏览一字符串中所有的成员,其成员是由定义符号所分隔的
8.c:forTokens 切割字符串(复习 StiringTokenize类)
<c:forTokens items="${s}" delims="," var="e">
${e}
</c:forTokens>
<c:forTokens
items="stringOfTokens"
delims="delimiters"
[var="varName"]
[varStatus="varStatusName"]
[begin="begin"]
[end="end"]
[step="step"]>
//body内容
</c:forTokens>
<%@ page language="java" import="java.util.*" 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>
</head>
<body>
切割字符串
<c:forTokens items="www.itheima.com" delims="." var="str">
${str } <br>
</c:forTokens>
</body>
</html>
13、<c:param>标签
(1)在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。<c:param>标签可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。
(2)<c:param>标签在为一个URL地址附加参数时,将自动对参数值进行URL编码,例如,如果传递的参数值为“中国”,则将其转换为“%d6%d0%b9%fa”后再附加到URL地址后面,这也就是使用<c:param>标签的最大好处。
(3)示例:<c:param name="name" value="value" />
14、<c:import> 标签
引入1.jsp的输出,拼接到当前jsp的输出中
<c:import url="/1.jsp" context="/day08"/>
引入1.jsp的输出,保存到scope域中以var指定名为名称的属性中
<c:improt url="/1.jsp" context="/day08" var="content" scope="page"/>
<%@ page language="java" import="java.util.*" 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>
</head>
<body>
cimport用来进行页面包含操作<br>
<c:import url="/index.jsp" var="index" scope="page"></c:import>
${index }
</body>
</html>
15、<c:url>标签
<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形式附加在URL地址后面
<c:url value="/index.jsp"context="/day04" var="myurl2" scope="page">
<c:param name="username" value="张三"></c:param>
</c:url>
<%@ page language="java" import="java.util.*" 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>
</head>
<body>
<hr><h1>java方式实现URL重写</h1>
<%
String url = "/Day07/index.jsp";
url = response.encodeURL(url);
%>
<%= url %>
<hr><h1>curl标签实现URL重写</h1>
<c:url context="/Day07" value="/index.jsp" var="url" scope="page">
<c:param name="name" value="张+"></c:param>
</c:url>
${url }
<a href="${url }">xxx</a>
</body>
</html>
16、<c:redirect>标签
<c:redirect>标签用于实现请求重定向
<c:redirect url="/index.jsp" context="/day08"/>
<%@ page language="java" import="java.util.*" 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>
</head>
<body>
<c:redirect url="/index.jsp" context="${pageContext.request.contextPath}"></c:redirect>
</body>
</html>