1. JSTL标签库概述
JSTL全称为JavaServerPages Standard Tag Library。
由JCP(Java Community Process)指定标准。
是提供给 Java Web 开发人员一个标准通用的标签函数库。
可以和 EL 配合来取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性、维护性和方便性。 EL表达式获取值 ,jstl标签是一些结构书写
2. jstl引入
在java ee5及其以上版本,已经默认包含了jstl标签库,可以直接直接使用。
再通过指令确定引入的标签库名称:
<%@taglib uri="" prefix=""%> uri="地址" prefix简称
3. 拓展:命名空间或名称空间概述
在通过taglib指令引入标签的时候,需要指定一个名称空间URN。这个URN中的内容看似是一个地址,但是实际上表示的是一个名字。书写形式为地址的原因是希望做到每一个指定标签库规范的人都可以有唯一一份规范,避免两两之间相互重复。
a. 在使用jstl标签库时,需要通过taglib标签引入,其中uri包含的内容是一个地址,但是这个地址其实是一个命名空间(URN)。
b. URI中包含URL和URN两部分。其中URN是作为一个唯一的名称空间来使用,目的是确定网络中当前jstl标签库仅此一个,不会出现引入的错误。
c.URN的编写方式:http://域名/分级1/分级2/分级3…
URI相当于北京市徐帅 URL 相当于地球中国北京某某公司徐帅 因为北京市可能在火星上也有 所以URI的范围比URL的范围大,
4. taglib可以引入的标签库
core ---- 核心标签库 c库
fmt ---- 国际标签库
sql ---- sql标签库
xml ---- xml标签库
a. taglib指令引入core库
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
设置完以后 c就可以替代 http://java.sun.com/jsp/jstl/core ,所以把c称之为简称 它可以是其他的比如b,e。。。名字随意取
5. JSTL标签库中常用标签
a. <c:set>
a. 设置/修改域中属性。
scope:是域的意思 就是你要向那个域设置值
var:相当于原来设置变量的name
value 相当于设置的变量的值
target:代表的是目标,也就是在整个域中寻找一个目标,然后可以修改目标的name和值 ,里面的el表达式用的是{$ a} 自动寻找域
property:属性的意思,可以设置map中键的值和对象的属性
<c:set scope="request" var="name" value="zs"></c:set> 相当于原来的<%request.setAttribute("name","zs");%>
<h3>c:set设置域中值</h3> <c:set scope="page" var="a" value="abc"></c:set> <c:set scope="request" var="a" value="123"></c:set> <c:set scope="session" var="a" value="789"></c:set> <c:set scope="application" var="a" value="114"></c:set> ${pageScope.a } abc ${requestScope.a} 123 ${sessionScope.a } 789 ${applicationScope.a } 114 ${a} 自动寻值从小到大的范围找 abc <h4>修改域中的值</h4> <c:set scope="request" var="a" value="曹洋"></c:set> ${requestScope.a} 曹洋
b.设置和修改map中的值
<h3>c:set设置map中的值</h3> <% Map<String,String> map = new HashMap<String,String>(); pageContext.setAttribute("map", map); %> <c:set target="${map}" property="name" value="小朴朴"></c:set> ${map} 结果:{name,小朴朴} ${map.name } 结果:小朴朴 <h4>修改map中的值</h4> <c:set target="${map }" property="name" value="小兰兰"></c:set> ${map } 结果:{name,小兰兰} ${map.name } 结果:小兰兰
c.修改javaBean中的值
<h3>javabean中值的修改</h3> <% Person p = new Person("李帅",19,"女"); pageContext.setAttribute("p", p); %> ${p.name } <c:set target="${p}" property = "name" value="小帅帅"></c:set> ${p.name } <!-- javabean中如果没有对应addr属性的set方法提供,则不能随意设置新的属性 --> <%-- <c:set target="${p }" property="addr" value="河北"></c:set> --%> <%-- ${p.addr } --%>
d.c:remove移除域中属性
<h3>c:remove移除域中属性</h3> <c:set scope="page" var="name" value="谢逊"></c:set> <c:set scope="request" var="name" value="韦一笑"></c:set> <c:set scope="session" var="name" value="殷天正"></c:set> <c:set scope="application" var="name" value="黛绮丝"></c:set> ${pageScope.name } ${requestScope.name } ${sessionScope.name } ${applicationScope.name} ${name } <hr> <!-- 删除指定域中的数据 --> <c:remove var="name" scope="request" /> ${pageScope.name } ${requestScope.name } ${sessionScope.name } ${applicationScope.name} <hr> <!-- 如果不指定删除哪一个域,则将全部域中对应的属性删除 --> <c:remove var="name"/> ${pageScope.name } ${requestScope.name } ${sessionScope.name } ${applicationScope.name}
e.c:if判断结构
<h3>c:if 判断结构</h3> <c:set var="num" value="100" scope="request"></c:set> <c:if test="${num<100}" var="flag"> //test就是if()判断语句中的内容 var代表的是当前判断的结果true or false num小于100 var中的变量值不能相同,即使相同那么就是指定var中变量的域,要再加一个属性scope </c:if> ${flag } <c:if test="${num>=100}" var="flag1"> num大于等于100 </c:if> ${flag1}
f:c:choose选择判断结构
首个满足条件的进行输出
<h3>c:choose选择判断结构</h3> <c:choose> <c:when test="${num<100 }">num小于100</c:when> //test中间用的是el的条件判断 <c:when test="${num<1000 }">num小于1000</c:when> <c:when test="${num<10000 }">num小于10000</c:when> <c:otherwise>num大于等于10000</c:otherwise> </c:choose>
g.c:forEach 循环结构
先来看看起始标签可以用到的属性
begin: 开始下标 从0开始
end: 结束下标
items: items:要进行迭代的集合。对于它所支持的类型将在下面进行讲解。是一个数组&集合类变量,相当于一个取值范围,var的变量相当于一个迭代器,每次按顺序取这个集合里的一个值进行操作,一直循环。类似for(iterator:Collection){}中的Collection
step: 步长就是一次循环 加几,默认为1
var: 每次循环拿到的元素
varStatus:代表每一个遍历到的元素的状态,如下表
<c:forEach>标签的items属性支持Java平台所提供的所有标准集合类型。此外,您可以使用该操作来迭代数组(包括基本类型数组)中的元素。它所支持的集合类型以及迭代的元素如下所示:
l java.util.Collection:调用iterator()来获得的元素。
l java.util.Map:通过java.util.Map.Entry所获得的实例。
l java.util.Iterator:迭代器元素。
l java.util.Enumeration:枚举元素。
l Object实例数组:数组元素。
l 基本类型值数组:经过包装的数组元素。
l 用逗号定界的String:分割后的子字符串。
l javax.servlet.jsp.jstl.sql.Result:SQL查询所获得的行。
index 指下标 count指遍历到的元素的个数
<h3>c:forEach 循环结构</h3> <%-- <c:forEach begin="0" end="100" step="2" var="e" varStatus="stat"> ${stat.count} </c:forEach> --%> <!-- 0到100能够被3整除的偶数总数(count) --> <c:forEach begin="0" end="100" step="2" var="i" varStatus="s" > <c:if test="${s.count%3 == 0 }"> <font color='red'>${i}</font> </c:if> <c:if test="${s.count%3 != 0 }"> <font color='blue'>${i}</font> </c:if> </c:forEach>
事实上定义了一个s名的对象作为varStatus的绑定值。该绑定值也就是status封装了当前遍历的状态,比如,可以从该对象上查看是遍历到了第几个元素:${status.count}
<h4>遍历数据结构</h4> <% List list = new LinkedList(); list.add("abc"); list.add(123); list.add(true); pageContext.setAttribute("list", list); %> <c:forEach items="${list }" var="l" step="1"> ${l} </c:forEach>
f. c:catch 捕获异常
<h3>c:catch 捕获异常</h3> <c:catch var="ca"> <% String str = null; str.toLowerCase(); %> </c:catch> ${ca }
g. c:forTokens 切割字符串
<h3>c:forTokens切割字符串</h3> <c:forTokens items="www.tedu.cn" delims="." var="v"> ${v } </c:forTokens>