Jstl之核心标签库与格式标签库使用.docx
《Jstl之核心标签库与格式标签库使用.docx》由会员分享,可在线阅读,更多相关《Jstl之核心标签库与格式标签库使用.docx(27页珍藏版)》请在冰豆网上搜索。
![Jstl之核心标签库与格式标签库使用.docx](https://file1.bdocx.com/fileroot1/2023-5/16/17f1747c-afa6-4ccd-b904-b21a6f74a970/17f1747c-afa6-4ccd-b904-b21a6f74a9701.gif)
Jstl之核心标签库与格式标签库使用
Jstl之核心标签库与格式标签库使用
JSTL(JSPStandardTagLibrary,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。
JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat4.x。
在JSP2.0中也是作为标准支持的。
JSTL1.0发布于2002年6月,由四个定制标记库(core、format、xml和sql)和一对通用标记库验证器(ScriptFreeTLV和PermittedTaglibsTLV)组成。
core标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。
它还提供了用来生成和操作URL的标记。
顾名思义,format标记库定义了用来格式化数据(尤其是数字和日期)的操作。
它还支持使用本地化资源束进行JSP页面的国际化。
xml库包含一些标记,这些标记用来操作通过XML表示的数据,而sql库定义了用来查询关系数据库的操作。
一、JSTL库安装
如果要使用JSTL,则必须将jstl.jar和standard.jar文件放到classpath中,如果你还需要使用XMLprocessing及Databaseaccess(SQL)标签,还要将相关JAR文件放到classpath中,这些JAR文件全部存在于下载回来的zip文件中。
ApacheTomcat安装JSTL库步骤如下:
下载standard.jar和jstl.jar,这里可以下
standard.jar和jstl.jar文件拷贝到/WEB-INF/lib/下。
使用任何库,你必须在每个JSP文件中的头部包含标签。
standard.jar的作用
JSP标准标签库,和jstl.jar一起使用,在1.0的版本中,但在jstl-1.2.jar就不在需要了。
如果你想在项目中使用JSTL和EL表达式,那么你必须要引入这个standard.jar文件。
即使你没有引入,那MyEclipse工具自带的类库也会帮你倒入。
其他工具不会。
jstl.jar下载地址:
http:
//repo2.maven.org/maven2/javax/servlet/jstl/
standard.jar下载地址:
http:
//repo2.maven.org/maven2/taglibs/standard/
如果是在Maven中可以这么写:
[html]viewplaincopy
--standard.jar-->
taglibs
standard
1.1.2
--JSTL-->
javax.servlet
jstl
1.1.2
二、核心标签
核心标签是最常用的JSTL标签。
引用核心标签库的语法如下:
[html]viewplaincopy
<%@taglibprefix="c"uri="%>
标签描述
out>用于在JSP中显示数据,就像<%=...>
set>用于保存数据
remove>用于删除数据
catch>用来处理产生错误的异常状况,并且将错误信息储存起来
if>与我们在一般程序中用的if一样
choose>本身只当做when>和otherwise>的父标签
when>choose>的子标签,用来判断条件是否成立
otherwise>choose>的子标签,接在when>标签后,当when>标签判断为false时被执行
import>检索一个绝对或相对URL,然后将其内容暴露给页面
forEach>基础迭代标签,接受多种集合类型
forTokens>根据指定的分隔符来分隔内容并迭代输出
param>用来给包含或重定向的页面传递参数
redirect>重定向至一个新的URL.
url>使用可选的查询参数来创造一个URL
if>使用
if>标签必须要有test属性,当test中的表达式结果为true时,则会执行本体内容;如果为false,则不会执行。
例如:
${requestScope.username=='admin'},如果requestScope.username等admin时,结果为true;若它的内容不等于admin时,则为false。
接下来看下列的范例:
iftest="${requestScope.username=='admin'}">
ADMIN您好!
!
//body部分
if> 如果名称等于admin,则会显示"ADMIN您好!
!
"的动作,如果相反,则不会执行if>的body部分,所以不会显示"ADMIN您好!
!
//body部分"。
另外if>的本体内容除了能放纯文字,还可以放任何JSP程序代码(Scriptlet)、JSP标签或者HTML码。
除了test属性之外,if>还有另外两个属性var和scope。
当我们执行if>的时候,可以将这次判断后的结果存放到属性var里;scope则是设定var的属性范围。
哪些情况才会用到var和scope这两个属性呢?
例如:
当表达式过长时,我们会希望拆开处理,或是之后还须使用此结果时,也可以用它先将结果暂时保留,以便日后使用。
例子:
[html]viewplaincopy
<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
<%@taglibprefix="c"uri="
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<%
Stringamind="Admin";
request.setAttribute("amind",amind);
%>
iftest="${requestScope.amind=='Admin'}"var="condition"
scope="request">
您好Admin先生
if>
运行结果:
choose>使用
choose>用于条件选择,他和when>otherwise>一起使用,他们只能组合在一起使用when>代表了choose>的一个条件分支,他必须以choose>作为他的父标签
他必须在otherwise>之前出现,只要遵寻这两个规则,使用起来很简单,下面给出代码:
[html]viewplaincopy
choose>
whentest="expression">
bodycontent
when>
whentest="expression">
bodycontent
when>
...
otherwise>
bodycontent
otherwise>
choose>
如:
[html]viewplaincopy
<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
<%@taglibprefix="c"uri="
useBeanid="user"class="com.mucfc.User"/>
setPropertyproperty="name"name="user"value="arthur"/>
setPropertyproperty="age"name="user"value="12"/>
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
choose>
whentest="${user.name=='arthur'}">
欢迎朋友:
${user.name}
when>
otherwise>
登录失败
otherwise>
choose>
运行结果:
forEach>
foreach>类似于for和foreach循环
forEach>标签用于通用数据循环,它有以下属性
属性描述是否必须缺省值
items进行循环的项目否无
begin开始条件否0
end结束条件否集合中的最后一个项目
step步长否1
var代表当前项目的变量名否无
varStatus显示循环状态的变量否无
forEach>标签的语法定义如下所示。
[html]viewplaincopy
forEachvar="name"items="expression"varStatus="name"begin="expression"end="expression"step="expression">
bodycontent
forEach>
forEach>标签的items属性支持Java平台所提供的所有标准集合类型。
此外,您可以使用该操作来迭代数组(包括基本类型数组)中的元素。
它所支持的集合类型以及迭代的元素如下所示:
Java.util.Collection:
调用iterator()来获得的元素。
ava.util.Map:
通过java.util.Map.Entry所获得的实例。
java.util.Iterator:
迭代器元素。
java.util.Enumeration:
枚举元素。
Object实例数组:
数组元素。
基本类型值数组:
经过包装的数组元素。
用逗号定界的String:
分割后的子字符串。
javax.servlet.jsp.jstl.sql.Result:
SQL查询所获得的行。
如可以写:
[html]viewplaincopy
<%Listlist=newArrayList();
list.add("nqwe");
list.add("ftyu");
list.add("vfg");
request.setAttribute("list",list);
%>
forEachvar="str"items="${list}"varStatus="status">
${status.count}:
outvalue="${str}"/>
forEach>
整数
[html]viewplaincopy
forEachvar="i"begin="1"end="10"step="1">
outvalue="${i}"/>,
forEach>
计算x的平方
[html]viewplaincopy
Value | Square |
---|
forEachvar="x"begin="0"end="10"step="2">
outvalue="${x}"/> | outvalue="${x*x}"/> |
forEach>
字符串"47,52,53,55,46,22,16,2"分隔.
[html]viewplaincopy
forTokensitems="47,52,53,55,46,22,16,2"delims=","var="dailyPrice">
outvalue="${dailyPrice}"/> |
forTokens>
使用步长
[html]viewplaincopy
second | second |
---|
forEachvar="seconds"begin="0"end="${pageContext.session.maxInactiveInterval}"step="60">
outvalue="${seconds}"/> | outvalue="${seconds}"/> |
forEach>
对数组进行循环
[html]viewplaincopy
<%intai[]={10,20,30,40,50};
pageContext.setAttribute("ary",ai);
%>
forEachvar="i"items="${ary}">
outvalue="${i}"/>*
forEach>
<%
Cookiec=newCookie("cookie1","one");
response.addCookie(c);
%>
<%
Cookiecookies[]=request.getCookies();
CookiesCookie=null;
Stringsname=null;
Stringname=null;
if(cookies==null)//如果没有任何cookie
out.print("noneanycookie");
else
{
//out.print(cookies.length+"
");
for(inti=0;i{
sCookie=cookies[i];
sname=sCookie.getName();
name=sCookie.getValue();
out.println(sname+"->"+name+"
");
}
}
%>
CookieName | CookieValue |
---|
forEachvar="cook"items="${pageContext.request.cookies}">
outvalue="${cook.name}"/> | outvalue="${cook.value}"/> |
forEach>
字符串数组循环
[html]viewplaincopy
<%Stringas[]={
"Afirststring","Ladeuxiemestring","Ellatroisiemostringo"
};
request.setAttribute("stringArray",as);
%>
forEachvar="string"items="${stringArray}">
outvalue="${string}"/>
forEach>
枚举
[html]viewplaincopy
<%
Hashtablehashtable1=newHashtable();
pageContext.setAttribute("numberMap",hashtable1);
hashtable1.put(newInteger
(1),"uno");
hashtable1.put(newInteger
(2),"dos");
hashtable1.put(newInteger(3),"tres");
hashtable1.put(newInteger(4),"cuatro");
hashtable1.put(newInteger(5),"cinco");
hashtable1.put(newInteger(6),"seis");
hashtable1.put(newInteger(7),"siete");
hashtable1.put(newInteger(8),"ocho");
hashtable1.put(newInteger(9),"nueve");
hashtable1.put(newInteger(10),"diez");
java.util.Enumerationenumeration=hashtable1.keys();
pageContext.setAttribute("enumeration",enumeration);
%>
forEachvar="item"items="${enumeration}"begin="2"end="10"step="2">
outvalue="${item}"/>
forEach>
map
[html]viewplaincopy
forEachvar="prop"items="${numberMap}"begin="1"end="5">
outvalue="${prop.key}"/>=outvalue="${prop.value}"/>
outvalue="${prop[key]}"/>
forEach>
set>使用
set>标记是JSTL的setProperty动作的友好版本。
标签是有用的,因为它的表达式求值,并使用结果的JavaBean或java.util.Map对象设置一个值。
将value的值储存至范围为scope的varName变量之中
[html]viewplaincopy
setvalue="value"var="varName"[scope="{page|request|session|application}"]/>
将本体内容的数据储存至范围为scope的varName变量之中:
[html]viewplaincopy
setvar="varName"[scope="{page|request|session|application}"]>
…本体内容
set>
将value的值储存至target对象的属性中:
[html]viewplaincopy
setvalue="value"target="target"property="propertyName"/>
将本体内容的数据储存至target对象的属性中:
[html]viewplaincopy
settarget="target"property="propertyName">
…本体内容
set>
它有如下属性属性描述是否必须缺省值:
名称
说明
EL
类型
必须
默认值
value
要被储存的值
Y
Object
否
无
var
欲存入的变量名称
N
String
否
无
scope
var变量的JSP范围
N
String
否
pagescope
target
为一JavaBean或java.util.Map对象
Y
Object
否
无
property
指定target对象的属性
Y
String
否
无
如果指定了target属性,那么property属性也必须指定。
可以看个例子:
[html]viewplaincopy
setvar="num"scope="session"value="${4000*2}"/>
outvalue="${num}"/>
settarget="${user}"property="name"value="linbingwen"/>
outvalue="${user.name}"/>
结果:
remove>使用
remove标签一般和set标签配套使用,两者是相对应的,remove标签用于删除某个变量或者属性,使用格式如下:
[html]viewplaincopy
removevar=”varName”[scope=”page|request|session|application”]/>
Remove标签中使用的各属性说明如下:
1.scope:
设定这个需要删除的变量的所在范围.
2.var:
需要删除的变量或者对象属性的名称.
如果没有scope属性,即采用默认值,就相当于调用PageContext.remove