jstl标签库常用的关键字有:
<c:if>、<c:else>、<c:choose>、<c:when>、<c:otherwise>、<c:foreEach>、<c:set>、<c:out>、<c:param>、<c:url>、<c:remove>、<c:redirect>、<c:import>.
jsp标准标记库(Java Standard Tag Library , JSTL)是由一组以标准化格式是现在许多通用的Web站点功能的定制标记。
JSTL的目标是为了简化JSP页面的设计,对于页面设计人员来说,使用脚本语言(默认是Java语言)操作动态数据是比较困难的,而采用标签和表达式语言相对容易一些,JSTL的使用为页面设计人员和程序开发人员的分工协作提供了便利。
一:配置JSTL
首先应该下载导入两个jar文件,分别是 jstl.jar 和 standard.jar .
配置代码引入:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
二:core标签库
core标签库主要包括了一般用途的标签,条件标签、迭代标签和URL相关的标签,在JSP页面使用Core标签,必须要使用taglib指令,指定引用的标签库,例如:
<%@ taglib rui=”http://java.sun.com/jsp/jstl/core” prefix=”c” %>
一般用途的标签有:<c:out>、<c:set>、<c:remove>、<c:catch>
1.<c:out>
用于计算一个表达式并将结果输出。类似于JSP中的<%=%>表达式,或者是EL中的${el-expression}.
2:<c:set>
用于设置范围变量的值或者JavaBean对象的属性。
实例:
<c:set var="username" value="tom" scope="session"/>
这就相当于设置了session
3:<c:remove>
相对于<c:set>来说,它的的作用是移除范围变量。比如:
<c:remove var="username" scope="session"/>
4:<c:catch>
用于捕获在其中嵌套的操作所抛出的异常对象,并将异常信息保存到变量中。
一般来说,我们将有可能抛出异常的代码放置到开始标签<c:catch>和结束标签</c:catch>之间。如果其中代码出现异常,异常对象将被捕获,保存在申明的变量中,该变量总是有page范围。如果没有发生异常,而var所标识的范围变量将被移除。
如果没有指定var属性,异常只是简单的被捕获,异常信息并不会被保存。
例子:
<c:catch var="exception">
<%
int i = 5;
int j = 0;
int k =i/j;
%>
</c:catch>
<c:out value="${exception}"/><br>
<c:out value="${exception.massage}"/>
后一句相当于:exception.getMessage()
条件标签包括:<c:if><c:choose><c:when><c:otherwise>
1:<c:if>
用于实现Java中的if语句功能。
<c:if test="${user.visitCount==1}">
This is your first visit;
</c:if>
若为true,会打印中间部分。也可以声明var,方便下一步判断。
<c:if test="${param.name=='admin' value=""result}"/>
<c:out value="${result}"/>
2:<c:choose>
<c:choose>和<c:when>、<c:otherwise>一起实现互斥条件执行,类似于java中的if else
<c:choose>一般作为<c:when>、<c:otherwise>的父标签。
例如:
<c:choose>
<c:when test="${row.value<100}">
初级
</c:when>
<c:when test="${row.value>=100&&row.value<1000}">
中级
</c:when>
<c:otherwise">
高级
</c:otherwise>
</c:choose>
迭代标签:
迭代标签有<c:forEach></forEach>
<c:forEach items="${yearList }" var="year">
<option value="${year.culitBatchId}"
<c:if test="${year.culitBatchId == yearId}">selected</c:if>>${year.cultivateBatchName}
</option>
</c:forEach>
还可以设定固定次数:
<c:forEach var="i" begin="100" end="200" step="2">
${ i }
</c:forEach>
step="2" 表示每次增长数为2
三. 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>