JSTL  (JSP 标准标签库)

JSTL  (JSP 标准标签库)

一、简介

Java Server Pages Standard Tag Libray(JSTL)

1.定义:

是一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML 处理,甚至数据库和访问数据库操作等。

 

我们现在只讨论 JSTL 中最重要的标签,迭代集合以及格式化数字和日期几

个标签。

 

2.核心标签库:

http://java.sun.com/jsp/jstl/core c:

包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等。

 

3.格式化标签库:

http://java.sun.com/jsp/jstl/fmt   fmt:

用来格式化显示数据的工作,比如:对不同区域的日期格式化等。

 

4.JSTL的使用 ★

1).将jstl相关的jar包拷贝到项目的lib目录下

jstl.jar和standard.jar

2).在页面引入想要使用的库

<%@taglib uri="要使用的库的路径" prefix="前缀名" %>

3).使用标签

<前缀名:标签名   属性名="属性值"></前缀名:标签名>

4).标签一般通过el表达式操作域对象

 

EX:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

为了在 JSP 页面使用 JSTL 类库,必须以下列格式使用 taglib 指令:

<%@taglib uri="" prefix=""%>

例如:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

前缀可以是任意内容,遵循规范可以使团队中由不同人员编写的代码更加相

似;所以,建议使用事先设计好的前缀。此时需要导入两个 jar 包

直接放入 Tomcat 的 lib 目录下即可。

一般通用的前缀 使用 core ==> c fmt ==> fmt

二、标签的使用

1. 条件动作标签

条件动作指令用于处理页面的输出结果依赖于某些输入值的情况,在 Java中是利用 if、 if…else 和 switch 语句来进行处理的。在 JSTL 中也有 4 个标签可以执行条件式动作指令:if、 choose、when 和 otherwise。

1). if 标签 ★★

 

if 标签先对某个条件进行测试,如果该条件运算结果为 true, 则处理它的主体内容,测试结果保存在一个 Boolean 对象中,并创建一个限域变量来引用

Boolean 对象。可以利用 var 属性设置限域变量名,利用 scope 属性来指定其作用范围。if 的语法有两种形式:没有主体内容、有主体内容

 

1.没有主体内容

 

<c:if test="" var="" scope=""></c:if>

 

test="判断条件,返回true或false"

var="限域变量名,用户接收判断条件的返回值"

scope="限域变量名的域范围 page|request|session|application 

未指定则 由小到大 查找

 

该情况下:var 指定的限域变量由同一个 JSP 页面中后面的标签测试所决定。

 

示例:

<%

request.setAttribute("age", 26);

%>

 

<c:if test="${age==26}" var="flag" scope="request">

</c:if>

 

2.有主体内容

 

<c:if test="" var="" scope="">

// 主体内容(当满足条件时,执行的代码)

</c:if>

 

示例:

<%

request.setAttribute("age", 26);

%>

<c:if test="${age >1 }">

<h2>Hello</h2>

</c:if>

 

 

主体内容为 JSP,若测试条件为 true,则处理 JSP。

JSTL 中没有 else 标签,为了模拟 else 的情景,需要使用两个 if 标签,并且这两个标签为相反的条件。

 

3.示例代码:

//注意 操作域对象或常量

<%

  request.setAttribute("num", 10);

  %>

 //完整格式 一般不用

 <c:if test="${num > 1 }" var="flag" scope="request">

  <h2>Hello JSTL</h2>

 </c:if>

 获取限域变量中的值:${requestScope.flag }

 

<hr> 

//一些奇怪的代码 因为有自动转型 不用研究

<c:if test="${1==1 }" var="flag1"></c:if>  ${flag1 } <br>

<c:if test="${1=='1' }" var="flag2"></c:if>  ${flag2 } <br> //这行不注释可能报错

<c:if test="${'1'=='1' }" var="flag3"></c:if>  ${flag3 } <br> 

<c:if test="${'1==1' }" var="flag4"></c:if>  ${flag4 } <br> 

<c:if test="1==1" var="flag5"></c:if>  ${flag5 } <br> 

<c:if test="${num == 10 }" var="flag6"></c:if>  ${flag6 } <br>  

<c:if test="true" var="flag7"></c:if>  ${flag7 } <br>  

 

<hr>

//一般都会用这种简便用法

<c:if test="${num >1 }">

<h2>Hello</h2>

</c:if>

<c:if test="${num <=1 }">

<h2>Hi</h2>

</c:if>

结果:

 

 

2) choose、when 和 otherwise 标签 ★

choose 和 when 标签的作用与 Java 中的 switch 和 case 关键字相似。也就是说:他们为相互排斥的条件式执行提供相关内容。

类似对应 choose ==> switch  

when test ==> case

default ==> otherwise

 

语法:

<c:choose>

  <c:when test="返回boolean类型的判断条件">

  // 满足条件执行的代码

  </c:when>

  ...(可添加多个when标签)

  <c:otherwise>

  // 当所有的when不执行时执行的代码

  </c:otherwise>

 </c:choose>

 

注意:

1、choose标签与otherwise标签没有属性,

when标签必须设置test属性

 

2、choose标签中只能包含when标签与otherwise标签,

when标签与otherwise标签可以包含其它标签

 

插入if标签异常示例:

Illegal "c:if" after "c:otherwise" tag in "c:choose" tag.

 

3、choose标签中至少包含一个when标签,最多只有一个otherwise标签

 

没有when标签异常示例:

Illegal "choose" without child "when" tag

 

4、所有的when标签必须设置在otherwise标签之前

 

when标签设置在otherwise之后异常示例:

Illegal "c:when" after "c:otherwise" tag in "c:choose" tag.

 

5、所有的when标签不执行的情况下才会执行otherwise标签

 

EX:

<%

request.setAttribute("score", 10);

%>

 

<c:choose>

<c:when test="${score>=60}">

<h2>可以</h2>

</c:when>

<c:when test="${score>30&&score<60}">

<h2>垃圾</h2>

</c:when>

<c:otherwise>

<h2>DIE</h2>

</c:otherwise>

</c:choose>

2. forEach迭代标签 ★★★

循环遍历

1).语法:

<c:forEach begin="1" end="9" var="i" step="1">

  </c:forEach>

 

begin="开始循环的数"

end="结束循环的饿数"

var="当前成员的限域变量名"

step="循环的间隔数"

items="被迭代的容器对象"

varStatus="用来存放当前成员信息"(不常用)

 

2).可迭代内容:

1.主体内容

2.Collection实现

3.Map实现

4.Iterator

5.Enumeration

 

forEach 是将一个主体内容迭代多次,或者迭代一个对象集合。可以迭代的

对象包括所有的 java.util.Collection 和 java.util.Map 接口的实现,以及对象或者基本类型的数组。他还可以迭代java.util.Iterator 和 java.util.Enumeration,但不能在多个动作指令中使用 Iterator 或者 Enumeration,因为 Iterator 或者Enumeration 都不能重置(reset)。 各属性含义如下:

 

varStatus 属性的使用:

 

3).forEach语法两种形式:

1.将 主语内容 重复一定的次数:

<c:forEach var="sleep" begin="1" end="9" step="1">

${sleep} <br>

</c:forEach>

结果: 1~9 并换行

 

2.用于迭代一个对象容器:

1).List == ArrayList

<%

List<String> list = new ArrayList<String>();

list.add("zhangsan");

list.add("lisi");

list.add("wangwu");

request.setAttribute("list", list);

%>

 

<c:forEach items="${list}" var="item">

${item}

</c:forEach>

 

结果:zhangsan lisi wangwu

**************************************************************

2).测试:varStatus并打印到表格中:

 

<%

List list = new ArrayList();

for (int i = 0; i < 10; i++) {

list.add("A:" + i);

}

pageContext.setAttribute("li", list);

%>

<table>

<tr>

<td>List内容</td>

<td>当前下标</td>

<td>成员总数</td>

<td>是/否first成员</td>

<td>是/否为last成员</td>

</tr>

<c:forEach items="${li}" var="item" begin="0" end="9" varStatus="idx">

<tr>

<td><b>${item}</b></td>

<td>${idx.index}</td>

<td>${idx.count }</td>

<td>${idx.first }</td>

<td>${idx.last}<br /></td>

</tr>

</c:forEach>

</table>

 

结果打印:

**************************************************************

3).Map 遍历:

内容主体为 JSP,对于每一次迭代,forEach 标签都会创建一个限域变量,

其名称通过 var 属性设置。利用 forEach 迭代一个 Map,分别利用 key 和

value 属性引用一个 Map 键和一个 Map 值。

<%

Map<String,Object> map = new HashMap<>();

map.put("name", "zhangsan");

map.put("age", 18);

map.put("sex", "男");

request.setAttribute("map", map);

%>

 

<c:forEach items="${map}" var="item">

${item.key} --- ${item.value} <br>

</c:forEach>

 

结果:

sex --- 男 
name --- zhangsan 
age --- 18 

 

**************************************************************

3. 格式化动作指令 <fmt:...> ☆

JSTL 提供了格式化和解析数字和日期的标签,我们讨论里面有:

formatNumber、formatDate、parseNumber 及 parseDate。

 

1) formatNumber 标签

用指定的格式或精度来格式化数字 (数值 ==> 字符串)

 

1.没有主体内容

 

<fmt:formatNumber  type="" var="" value="" />

 

2.有主体内容

 

<fmt:formatNumber  type="" var="" >

  主体内容

</fmt:formatNumber>

 

3.常用属性

 

type:要格式化成的类型

number数值型,默认值

percent百分比类型

currency货币型

var:限域变量名:

用来接收格化式后的结果,如果不设置该属性,则结果会直接输出;如 果设置了,则需要通过el表达式输出限域变量名的值

value:要格式化的数据,与有主体内容的格式主体相同

2). formatDate 标签

使用指定的风格或模式格式化日期和时间(日期 ==> 字符串)

只有单标签

 

<fmt:formatDate ...>

常用属性:

 

value:要格式化的数据

type:要格式化成的类型 日期型(默认)、时间型、日期+时间型

dateStyle:日期型的格式

timeStyle:时间型的格式

pattern:具体的格式(自定义格式)

 

pattern 属性指定更精确的处理日期:

3). parseNumber 标签

利用 parseNumber 标签可以将数字、货币或百分比的字符串表示法解析成

指定语言环 境的数字。即解析一个代表着数字,货币或百分比的字符串。

(字符串 ==> 数值)

 

1.没有主体内容

 

<fmt:parseNumber  type="" var="" value="" />

 

2.使用主体内容

 

<fmt:formatNumber  type="" var="" >

主体内容

</fmt:formatNumber>

 

3.<fmt:parseNumber>标签有如下属性:

 

type:当前字符串的格式

number数值型,默认值

percent百分比类型

currency货币型

...

4) parseDate 标签

此标签为指定区域解析日期和时间的字符串表示法。即解析一个代表着日期

或时间的字符串

 

1.没有主体内容

 

<fmt:parseDate value="${now}" var="" pattern="">

 

2.使用主体内容

 

<fmt:parseDate value="${now}" var="" pattern="">

主体内容

<fmt:parseDate>

 

3.<fmt:parseDate>标签有如下属性:

 

type:当前字符串的格式

date、time、both

 

pattern:与当前字符串对应的格式

 

5).其他标签

查阅即可

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值