下载地址:http: / / archive.apache.org/dist/jakarta/taglibs/standard/binaries/ 去掉空格。
1.JSTL标签可与HTML元素相互嵌套
2.JSTL可出现于HTML元素的内容区中
相同,HTML元素也可出现于JSTL标签的内容区中.
但是,两者都不会出现于对方的属性之中,仅仅出现在对方的内容区之中.
出现于两者属性区中的内容可以有两种可能:
1.EL表达式(属性区+内容区)
2.JSP元素
示例1:
<%
List lst=new ArrayList();
lst.add("abc");
lst.add("123");
pageContext.setAttrbute("list",lst);
%>
<1>JSP元素嵌入JSTL属性区
<c:forEach items="<%= pageContext.getAttribute(\"list\")%>" var="l">
<%= pageContext.getAttribute("L")%>
</c:forEach>
<2>EL嵌入JSTL属性区
<c:forEach items="${list}" var="L">
${L}
</c:forEach>
通常EL表达式与JSTL进行结合而不会与JSP元素结合使用,EL也可出现于HTML元素之中.类似于"<%= ... %>"的功能.
示例2:EL出现于HTML元素的属性区中.
<c:url value="/HelloServlet" var="nextURL">
<c:param name="name" value="username" />
</c:url>
<a href="${nextURL}">下一步</a>
EL是一个表达式,它是有返回值的.表达式是由操作数+操作符构成
示例3:对比字符串与EL表达式的意义区别.
即.如果中间的代码是要求进行运算的代码,而不是字面量,则必须使用EL表达式
<c:set var="number" scope="page">
${1+1}
</c:set>
这样变量存储的值就是2.
<c:set var="number" scope="page">
1+1
</c:set>
这样number中存储的是1+1的字符串,而不是2
示例4:
<c:choose>
<c:when test="${gender=='male'}">
男
</c:when>
<c:when test="${gender='female'}">
女
</c:when>
<c:otherwise>
未知
</c:otherwise>
</c:choose>
JSTL标签库的是由以下的五个标签库组成:
1.核心标签库(core) URI:http://java.sun.com/jsp/jstl/core prefix="c"
2.数据库相关标签库(SQL) URI:http://java.sun.com/jsp/jstl/sql prefix="sql"
3.XML相关标签库(XML) URI:http://java.sun.com/jsp/jstl/xml prefix="xml"
4.函数标签库(functions) URI:http://java.sun.com/jsp/jstl/functions prefix="fn"
5.国际化标签库(il8n) URI:http://java.sun.com/jsp/jstl/fmt prefix="fmt"
JSP标签库可以使用<%@ taglib ...%> JSP指令元素进行导入,这样就可以在JSP页面中使用相关的第三方标签了.
JSTL就是Apache组织开发的标准标签库.
例:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSTL最大的有点就是把某种特定的功能进行封装,需要使用这种功能的地方可以直接调用,而不必重复写类似的代码,尤其是对Web开发常见的功能非常有帮助,这就相当于使用简介的语法来替代原先JSP页面中的脚本元素.
下面的例子可以看到使用JSP脚本元素和使用JSTL的形式上的差别.
JSP:
<%
List list=new ArrayList();
list.add("abc");
list.add("123");
pageContext.setAttribute("list",list);
%>
<%--下面的var参数是将items集合类中的元素一一取出来并作为属性放置于pageContext作用域中--%>
<c:forEach items="<%=pageContext.getAttribute(\"list\")%>" var="l">
<%=pageContext.getAttribute("l")%>
</c:forEach>
EL具有获取数据更直接和简介的特点,所以EL出现以后,JSTL在传参和展示数据方面经常会使用El,这样使得JSP代码更简明.因此上面的JSTL代码可以这样使用EL进行改写:
<c:forEach item="${list}" var="l">
<c:out value="${l}" escapeXML="true" />
</c:forEach>
重点:
JSTL的主要用处也是为了简化JSP页面的代码量,使得整个页面的代码结构更加清晰,便于维护.主要方式就是利用JSTL标签替代原有的常用JSP脚本元素的脚本段,换句话说就是利用JSTL对JSP的脚本元素的脚本段进行了封装.
而EL则是替代了JSP脚本元素中的表达段.
=================================================================================================
下面介绍JSTL的各个标签库
一>JSTL核心标签库(Core):
一般用途的标签包括:<c:out> <c:set> 和 <c:remove>,他们在JSP里使用的相对频繁一些,操作的是页面上的各类变量.
-------------------------------------------------------------------------------------------------
1><c:out>
<c:out>用于想JSP的输出流打印一个表达式结果.
1.语法:
语法1: 没有标签体.
<c:out value="表达式" [default="默认值" escapeXML="true|false"] />
语法2: 有标签体.
<c:out value="表达式" [escapeXML="true|false"]>
默认值
</c:out>
2.实例:
示例1:
<c:out value="${book.name}" default="暂无" />
示例2:
<c:out value="&{book.name}">
暂无
</c:out>
--------------------------------------------------------------------------------------------------
2> <c:set>
用于想特定的作用范围设置一个属性对象或者设置一个JavaBean的属性值.
1.语法:
语法1: 用value向特定作用范围设置属性值.
<c:set value="对象" var="变量名称" [scope="作用范围"] />
语法2: 用标签体向特定作用范围设置属性值.
<c:set var="变量名称" [scope="作用范围"]>
内容
</c:set>
语法3: 用value 向target指定的JavaBean设置属性值
<c:set value="值" target="目标JavaBean" property="属性名" />
语法4: 用标签体向target指定的JavaBean设置属性值.
<c:set target="目标JavaBean" property="属性名">
内容
</c:set>
2.示例:
示例1:
<c:set value="helloWorld" var="greeting" scope="page" />
示例2:
<c:set var="greeting" scope="page">
hello world
</c:set>
示例3:
<c:set value="hello world" target="${greetBean}" property="text" />
示例4:
<c:set target="${greetBean}" property="text">
hello world
</c:set>
3.说明:
<c:set>标签一般有两种作用.
(1)向四作用域范围对象(page,request,session,application)设置属性,相当于
setAttribute("var指定的名称",value或标签体内容);
(2)向某个JavaBean设置属性的值,类似于<jsp:setProperty>
(在本质上上JavaBean也是属于四作用域范围中的属性)
--------------------------------------------------------------------------------------------------
3><c:remove>
用于删除特定作用域里变量.
1.语法:
<c:remove var="变量名" scope="作用范围">
2.示例:
<c:remove var="greet" />
3.说明:
如果scope属性指定了作用范围,则相当于调用了
pageContext.removeAttribute("变量名","作用范围");
pageContext.removeAttribute("变量名");
--------------------------------------------------------------------------------------------------
4><c:forEach>循环显示数据
该标记支持两种不同样式的迭代:
1)整数范围上的迭代(类似于Java语言的for循环语句)
2)集合类对象上的迭代(类似于Java语言的Iterator,Enumeration类)
1.语法:
语法1: 使用begin和end属性进行整数范围迭代.
<c:forEach begin="开始数子" end="结束数子" [var="循环过程中的变量"] step="每次迭代的增量">
每次循环体内容
</c:forEach>
语法2: 使用items和var属性进行集合迭代.
<c:forEach items="集合类变量(EL)" var="循环过程中的变量" [varStatus="status"]>
每次循环体内容
</c:forEach>
2.示例1:打印20~50之间的偶数.
<c:forEach begin="20" end="50" var="i" step="2">
<c:out value="${i}" />
</c:forEach>
示例2:用表格展示用户列表里所有用户的数据.
<table>
<tr>
<th>编号</th>
<th>用户名</th>
<th>年龄</th>
<th>性别</th>