JSP标准模板库(JSTL)是SUN公司发布的一个针对JSP开发的新组件。
JSTL允许你使用标签(tags)来进行JSP页面开发,而不是使用多数 JSP程序员已经习惯了的scriptlet代码方式开发。JSTL几乎能够做到传统JSP scriptlet代码能做的任何事情。
当这个计数器页面的例子是用JSP scriptlet来编写时,JSP页面如下所示:
<html>
<head>
<title>Count to 10 in JSP scriptlet</title>
</head>
<body>
<%
for(int i=1;i<=10;i++)
{%>
<%=i%><br/>
<%
}
%>
</body>
</html>
使用scriptlet代码产生的页面源代码会包含混合的HTML标签和JAVA语句。-->可读性差-->开发效率低
<%@ taglib uri=" http://java.sun.com/jstl/core" prefix="c" %>
<html>
<head>
<title>Count to 10 Example (using JSTL)</title>
</head>
<body>
<c:forEach var="i" begin="1" end="10" step="1">
<c:out value="${i}" />
<br />
</c:forEach>
</body>
</html>
JSP2.0的一个主要的组件就是这个新的叫做EL的表达式语言。EL被广泛用在JSTL中。然而,重要的是记住,EL是JSP的功能而不是JSTL的。
JSTL标签用法:
<c:set>设置变量:
<c:set var=" name" scope=" scope" value=" expression"/>
scope 属性是可选的,其缺省值是 page 。
也可把值这样放: <c:set var="timezone" scope="session">CST</c:set>
<c:remove>删除变量:
<c:remove> 操作示例 <c:remove var="timezone" scope="session"/>
<c:out>输出内容:
<c:out value=" expression" default=" expression" escapeXml="boolean"/>
escapeXml 属性也是可选的。它控制当用 <c:out> 标记输出诸如“<”、“>”和“&”之类的字符(在
HTML 和 XML 中具有特殊意义)时是否应该进行转义。
Hello <c:out value="${user.username}" default=="Guest"/>! --->结合EL用
条件标签包括 <c:if><c:choose><c:when><c:otherwise>
(1)
<c:if test=”${user.visitCount==1}”>
This is your first visit .
</c:if>
(2)
<c:choose>
<c:choose> 和 <c:when> 、 <c:otherwise> 一起实现互斥条件执行,类似于 java 中的 if else.
<c:choose><c:when test="${user.role == 'member'}">
<p>Welcome, member!</p>
</c:when><c:otherwise>
<p>Welcome, guest!</p>
</c:otherwise></c:choose>
迭代标签有 <c:forEach> 和 </c:forEach>
<c:forEach var="i" begin="1" end="10" step="1">
<c:out value="${i}" />
<br />
</c:forEach>
<c:forEach items="${finalResult.rows}" var="row">
<td align="center"><span ><c:out value="${row.player_name}"/></span> </td>
<td align="center"><span > ¥ <c:out value="${row.money}"/></span></td>
</c:forEach>
<c:redirect>:
<c:redirect url="a.jsp">
<c:redirect url="/max.jsp" context="/ch16">
<c:param name="name1" value="665"/>
<c:param name="name3" value=" 斯蒂芬 "/>
</c:redirect>
三. sql 标签
设置数据源:
<sql:setDataSource dataSource="proxool.breadTycoon" />
// 将数据库某查询的结果声明为一个变量
<sql:query var="finalResult" >
select player_name,money from tb_player order by money DESC LIMIT 10
</sql:query>
然后可以:
<c:forEach items="${ finalResult.rows}" var="row" varStatus="s">
advCosts[${s.index}]=${row.adv_cost};
</c:forEach>
数据更新标签:
<sql:update>
call proc_set_role_salespro(?,?,?,?,?);
<sql:param value="30"/>
<sql:param value="39"/>
<sql:param value="<%=spID%>"/>
<sql:param value="<%=productID%>"/>
<sql:param value="1"/>
</sql:update>
<sql:query var="queryAllChannelCount">
SELECT COUNT(*) as total FROM tb_channel WHERE game_id=? AND begin_round<func_cur_round(?)
AND player_id=? AND channel_flag=0
<sql:param value="${gameID}"/>
<sql:param value="${gameID}"/>
<sql:param value="${playerID}"/>
</sql:query>
<c:forEach items="${queryAllChannelCount.rowsByIndex}" var="channelCN">
<c:set value="${channelCN[0]}" var="channelTotal"/>
</c:forEach>
调用存储过程更新数据库:
<c:if test="${param.changsubmit!=null}" >
<c:forEach items="${paramValues.pro_id}" var="getpro_id" varStatus="getparamsta">
<sql:update>
call proc_set_role_product(?,?,?,?,?,?,?,?);
<sql:param value="${gameID}"/>
<sql:param value="${playerID}"/>
<sql:param value="${getpro_id}"/>
<sql:param value="${getpro_id}"/>
<sql:param value="${paramValues.pro_sort[getparamsta.index]}"/>
<sql:param value="${paramValues.price[getparamsta.index]}"/>
<sql:param value="${paramValues.output[getparamsta.index]}"/>
<sql:param value="0"/>
</sql:update>
</c:forEach>
</c:if>
四. 格式化标签
<fmt: formatNumber value =”12.3” pattern=”.000”/>
将输出 12.300. 应用样式 ”.000”, 将使格式化后的小数部分有 3 位。不足 3 位将以 0 补齐。
<fmt:formatDate value=”<%=new java.util.Date() %>” type=”date” />
格式化的结果是: 2007-5-27 .
<fmt:formatDate value=”<%=new java.util.Date() %>” type=”time” />
格式化的结果是: 9:25:11
<fmt:formatDate value=”<%=new java.util.Date() %>” type=”both” />
格式化的结果是: 2007-5-27 9:25:11