JSTL是一个不断完善的开放源码的JSP标签库,由apache的jakarta小组来维护的。它只能运行在支持JSP1.2和Servlet2.3规范的容器上。

它包含两部分:标签库表达式语言(Expression Language,EL)。标签库目前支持如下4种标签:
Core----支持JSP中的一些基本的操作。前缀是c,可以参照http://java.sun.com/jstl/core
XML processing----支持xml文档的处理。前缀是x,可以参照http://java.sun.com/jstl/xml
I18N capable formatting----支持对JSP页面的国际化。前缀是fmt,可以参照http://java.sun.com/jstl/fmt
Database access(SQL)----支持JSP对数据库的操作。前缀是sql,可以参照http://java.sun.com/jstl/sql

表达式语言
表达式语言(EL语言)是JSTL输出(输入)一个java表达式的表示形式。在JSTL中,EL语言只能在属性中使用,只能通过建
立表达式${exp1}来进行调用。一共有三种方式
1、value属性包含一个表达式

<some:tag value="${expr}" />
说明:此种情况表达式将被计算出来并且根据类型转换规则赋值给value属性。

例如:

<c:out value="${username}" />
这里的${username}就是一个EL,它就相当于JSP语句:
<%=request.getAttribute("username")%>
或者
<%=session.getAttribute("username")%>

2、value属性包含一个或多个属性,这些属性被文本分割或围绕。

<some:tag value="some${expr}${expr}text${expr}" />
说明:这种情况,表达式从左到右进行计算,并将结果转换为字符串型(根据类型转换规则),同时将结果赋值给value属
性。

3、value属性仅仅包含文本。

<some:tag value="some text" />
说明:这种情况,字符串型属性value将根据类型转换规则转换为标签所希望的类型。
EL 语言的运算符
有两种,第一种是使用“.”来获得有名字的属性。第二种是使用“[]”来获得有名字或者按数字排列的属性。
例子:

${user.username}或者${user["username"]},两种意义相同。
empty 运算符
用来检查对象、集合或字符串变量是否为空或者null。
例子:

${empty param.username}
说明:如果request的参数列表中的username的值为null,则表达式的值为true。EL语言也可以直接使用表较运算符与null
进行比较,
如,${param.firstname == null}。
比较运算符

==或eq-----相等检查
!=或ne-----不等检查
<或lt-----小于检查
>或gt-----大于检查
<=或le-----小于等于检查
>=或ge-----大于等于检查
数字运算符与逻辑运算符均与java语言相同。
Core 标签库
它提供用于条件逻辑、循环检查、输出、变量创建、文本导入以及URL处理的标签。
1、通用标签
c:out标签---用于显示数据
它共有三个属性:

value----输出信息,可以使EL表达式或常量,是个必须有的属性。
default----value为空时显示的信息
escapeXml----为true时避开特殊的xml字符集

实例如下:

<c:out value="${user.username}" default="guest" />
说明:显示用户的用户名,如果为空则显示guest。
<c:out value="${sessionScope.username}" />
说明:指定从session中获取username的值显示。
<c:out value="${username}" />
说明:显示username的值,默认是从request(page)中取,如果request中没有就从session中取,如果session中没有那么就

application(ServletContext)中取,如果都没有就不显示。
c:set标签---用于保存数据
它共有五个属性:

value----输出信息,可以使EL表达式或常量
target----需要修改属性的变量名,一般是JavaBean的实例
property----需要修改的JavaBean属性,如果target指定了,这个必须指定
var----需要保存信息的变量
scope----保存信息变量的范围

实例如下:

<c:set value="${test.testinfo}" var="test2" scope="session" />
说明:将test.testinfo的值保存到session的test2中。
<c:set target="${cust.address}" property="city" value="${newcity}" />
说明:将对象cust.address的city属性保存到newcity中。
c:remove标签---用于删除数据
它共有两个属性:

var----需要保存信息的变量,这个是必须指定的
scope----保存信息变量的范围

实例如下:

<c:remove var="test2" scope="session" />
说明:从session中删除test2变量。
2、流程控制标签
c:if标签---用于条件控制
它共有三个属性:

test----需要评价的条件,相当于if中的条件,是个必须指定的
var----需要保存结果的变量名
scope----保存条件结果的变量范围

c:choose标签
没有属性
c:when标签---也是用于条件控制的
它就一个属性:

test----需要评价的条件,是个必须指定的

c:otherwise标签
也没有属性
实例如下:

<c:if test="${user.wealthy}">
user.wealthy is true.
</c:if>
说明:如果user.wealthy的值为true,则显示“user.wealthy is true.”。
<c:choose>
    <c:when test="${user.generous}">
      user.generous is true.
    </c:when>
    <c:when test="${user.stringy}">
      user.stringy is true.
    </c:when>
    <c:otherwise>
      user.generous and user.stringy are false.
    </c:otherwise>
</c:choose>
说明:如果user.generous的值为true,则显示“user.generous is true.”;
如果user.stringy的值为true,则显示“user.stringy is true.”;
其他所有情况(即user.generous的值跟user.stringy的值都不为true)全部显示“user.generous and user.stringy are
false.”。

注意:JSTL中没有形如if...else...的条件语句,所以只能用,和标签来共同完成。

3、循环控制标签
c:forEach标签---用于通用数据
它共有六个属性:

items----进行循环的项目
begin----开始条件,默认值是0
end----结束条件,默认值是集合中的最后一个项目
step----步长,默认值是1
var----代表当前项目的变量名
varStatus----显示循环状态的变量

实例如下:

<c:forEach items="${vectors}" var="vector">
<c:out value="${vector}"/>
</c:forEach>

上面的等价于:

for(int i=0;i<vectors.size();i++){
    out.println(vectors.get(i));
}
说明:上面的vectors是个java.util.Vector对象,里面存放的是String数据,vector是当前循环条件下的String对象。
vectors可以替换
成任意的实现了java.util.Collection接口的对象。
<c:forEach begin="1" end="10" step="1" var="i">
count=<c:out value="${i}"/><br>
</c:forEach>
输出结果:
count=0
count=1
.....
count=10

c:forTokens标签
它的属性就比forEach多了一个,而且items也是必须的属性:

delims---分割符,是个必须的属性

实例如下:

<c:forTokens items="a:b:c:d" delims=":" var="token">
<c:out value="${token}"/>
</forTokens>
说明:这个标签的作用相当于java.util.StringTokenizer类。上例是将字串以":"分割循环4次,token是循环到当前分割到
的字符串。
4、导入文件和URL
JSTL核心标签库支持使用来包含文件,使用来打印和格式化URL,使用来重定向URL。
c:import标签---将另一个页面的代码包含到当前页面中。
它共有七个属性:

url----需要导入页面的url,是个必须的属性
context----/后跟本地Web应用程序的名字,默认是当前应用程序
charEncoding----用于导入数据的字符集,默认是ISO-8859-1
var----接受导入文本的变量名,默认是page
scope----接受导入文本的变量的范围
varReader----接受导入文本的java.io.Reader变量名
varStatus----显示循环状态的变量

c:url标签---输出一个url地址
它共有五个属性:

url----url地址,是个必须的属性
context----/后跟本地Web应用程序的名字,默认是当前应用程序
charEncoding----用于导入数据的字符集,默认是ISO-8859-1
var----接受处理过的url变量名,该变量存储url,默认是输出到页
scope----存储url的变量名的范围,默认是page

实例如下:

<c:import url="http://www.abc.com/abc.js" var="newsfeed" />
说明:将url为http://www.abc.com/abc.js的文件包含到当前页的当前位置,并将url保存在newsfeed中。
<c:url url="/index.jsp" />
说明:在当前页的当前位置输出http://www.abc.com/index.jsp,http://www.abc.com是当前页所在的位置。

c:redirect标签---将请求重定向到另一个页面
它共有两个属性:

url----url地址,是个必须的属性
context----/后跟本地Web应用程序的名字,默认是当前应用程序

实例如下:

<c:redirect url="http://www.abc.com/login.jsp" />
说明:将请求重定向到http://www.abc.com/login.jsp页,相当于response.setRedirect

c:param标签---给一个重定向或包含页面传递参数。
它共有两个属性:

name----在request参数中设置的变量名,是个必须属性
value----在request参数中设置的变量值

实例如下:

<c:redirect url="login.jsp">
<c:param name="id" value="abc">
</c:redirect>
说明:将参数abc以id为名字传递到login.jsp页面,相当于login.jsp?id=abc的作用。
综上所述可总结出JSTL具有以下优点:
1、在应用服务器之间提供了一致的接口,最大程度地提高了Web应用在各应用服务器之间地可移植性。
2、简化了JSP和Web应用程序的开发。
3、以一种统一的方式减少了JSP中scriptlet的代码数量,可以达到没有任何scriptlet代码的程序。
4、允许JSP设计工具与Web应用程序开发的进一步集成。