JSP中JSTL标签与指令使用详解

【1】c:foreach

<c:forEach>标签用于通用数据循环,它有以下属性。

属 性描 述是否必须缺省值
items进行循环的项目
begin开始条件0
end结束条件集合中的最后一个项目
step步长1
var代表当前项目的变量名
varStatus显示循环状态的变量

<c:forEach>标签的items属性支持Java平台所提供的所有标准集合类型。

此外,您可以使用该操作来迭代数组(包括基本类型数组)中的元素。它所支持的集合类型以及迭代的元素如下所示:

java.util.Collection:调用iterator()来获得的元素。

java.util.Map:通过java.util.Map.Entry所获得的实例。

java.util.Iterator:迭代器元素。

java.util.Enumeration:枚举元素。

Object实例数组:数组元素。

基本类型值数组:经过包装的数组元素。

用逗号定界的String:分割后的子字符串。

javax.servlet.jsp.jstl.sql.Result:SQL查询所获得的行。


不论是对整数还是对集合进行迭代,<c:forEach>的varStatus属性所起的作用相同。
和var属性一样,varStatus用于创建限定了作用域的变量(改变量只在当前标签体内起作用)。
不过,由varStatus属性命名的变量并不存储当前索引值或当前元素,而是赋予javax.servlet.jsp.jstl.core.LoopTagStatus类的实例。
该类包含了一系列的特性,它们描述了迭代的当前状态,如下这些属性的含义如下所示:


current:当前这次迭代的(集合中的)项。

index:当前这次迭代从0开始的迭代索引。

count:当前这次迭代从1开始的迭代计数。

first:用来表明当前这轮迭代是否为第一次迭代,该属性为boolean类型。

last:用来表明当前这轮迭代是否为最后一次迭代,该属性为boolean类型。

begin:begin属性的值。

end:end属性的值

step:step属性的值

遍历输出表格:

	<%
		List<Customer> custs2 = new ArrayList<Customer>();
		custs2.add(new Customer(1,"AAA",11));//index:0
		//custs2.add(new Customer(2,"AAA",11));//index:0
		request.setAttribute("custs2",custs2);
	 %>
	 <!-- 遍历数据 collection -->
	 <table border="1">
	 <c:forEach items="${requestScope.custs2}" var="cust"  varStatus="status">
	 	<tr>
	 		<td>${cust.id}</td>
	 		<td>${cust.name}</td>
	 		<td>${cust.age}</td>
	 		<td>${status.index}</td>
	 		<td>${status.count}</td>
	 		<td>${cust.id}</td>
	 		<td>${cust.id}</td>
	 	</tr>
	 </c:forEach>
	 </table>

子元素为radio时:

后台是根据标签的name属性获取标签值,当遍历时,应保证每次循环的name属性不同!

 <%
  	request.setCharacterEncoding("UTF-8");
  	
	List<Customer> custs = new ArrayList<Customer>();
	custs.add(new Customer(1,"AAA",11));//index:0
	custs.add(new Customer(2,"BBB",12));
	custs.add(new Customer(3,"CCC",13));
	custs.add(new Customer(4,"DDD",14));
	request.setAttribute("custs",custs);
   %>
  	<form action="testServlet1" method="post">
  		<br><br>
  		<c:forEach items="${custs}" var="cust" varStatus="status">
  		<input type="radio" name="cust${cust.id}" value="${cust.name}"/> ${cust.name}
  		<input type="radio" name="cust${cust.id}" value="${cust.id}"/> ${cust.id}
  		<input type="radio" name="cust${cust.id}" value="${cust.age}"/> ${cust.age}
  		<br/><br/>
  		</c:forEach>
  		<br><br>
  		<input type="submit" value="Submit">
  		
  	</form>

测试结果如下:

这里写图片描述


【2】c:if

<c:if>标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。语法格式如下:

<c:if test="<boolean>" var="<string>" scope="<string>">
   ...
</c:if>

<c:if>标签有如下属性:

属性描述是否必要默认值
test条件
var用于存储条件结果的变量
scopevar属性的作用域page

实例如下:

<c:set var="salary" scope="session" value="${2000*2}"/>
<c:if test="${salary > 2000}">
   <p>我的工资为: <c:out value="${salary}"/><p>
</c:if>

【3】JSP指令

JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。

指令可以有很多个属性,它们以键值对的形式存在,并用逗号隔开。

JSP中的三种指令标签:

指令描述
<%@ page … %>定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include … %>包含其他文件
<%@ taglib … %>引入标签库的定义

① Page指令

Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。

Page指令的语法格式:

<%@ page attribute="value" %>

<%@ include与jsp:include指令

JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。

Include指令的语法格式如下:

<%@ include file="文件的绝对路径或者相对路径"%>

include 指令中的文件名实际上是一个相对的 URL 地址。

如果没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。

jsp:include

<jsp:include page="被包含文件的路径" flush="true/false">
    <jsp:param name="参数名称" value="参数值"/>
</jsp:inclue>

flush属性含义

如果是false就意味着当这个网页完全被读进来以后才输出,如果是true,内部会有一个buffer,当buffer满了就输出,这样如果是true的时候内容是一点一点输出的。
一般只有网页很大的时候才能看出差别,不过网页输出完毕所用的总时间应该是没有什么差别的。这个东西的主要作用是做个缓冲,一点一点的呈现是有过程的,如果网页很大用户等了很久都没结果很显然是很郁闷的一件事

二者的区别

  • 执行时间上的区别:

<%@ include file=”relativeURI”%> 是在翻译阶段执行(将JSP页面转换成servlet的阶段)。
<jsp:include page=”relativeURI” flush=”true” /> 在请求处理阶段执行。

  • 引入内容的方式区别:

<%@ include file=”relativeURI”%>适用于引入静态文本,也可以这么理解:它是纯粹的把部分代码写到了另一页面(或者说是共享),而那另一页面中不能有相同的变量名,但可以借用主页面的内容。
<jsp:include page=”relativeURI” flush=”true” />引入执行页面或servlet所生成的应答文本。

<%@ include为静态包含, <%@include不论包含的是txt文本还是jsp文件,被包含的页面都不会从新编译。
<jsp:include 为动态包含, <jsp:include 如包含jsp文件,这每次加载主页面的时候,被包含的页面都要重新编译。


③ Taglib指令

JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。

Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。

Taglib指令的语法:

<%@ taglib uri="uri" prefix="prefixOfTag" %>

uri属性确定标签库的位置,prefix属性指定标签库的前缀。


④ 通常使用到的指令实例

实例如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"  
											pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%>

⑤ jsp:forward

将当前请求转发到可以处理这个请求的文件上,这个文件可以是jsp文件,也可以是一个可以处理该请求的方法。

语法格式

<jsp:forward page={"相对路径 " | " java程序段"}>

<jsp:forward>
	<jsp:param name="parameterName"  value="{parameterValue | Java程序段}"/>
</jsp:forward>

【4】c:set

<c:set>标签用于设置变量值和对象属性。<c:set>标签就是<jsp:setProperty>行为标签的孪生兄弟。

这个标签之所以很有用呢,是因为它会计算表达式的值,然后使用计算结果来设置 JavaBean 对象或 java.util.Map 对象的值。

语法格式

<c:set
   var="<string>"
   value="<string>"
   target="<string>"
   property="<string>"
   scope="<string>"/>
属性描述是否必要默认值
value要存储的值主体的内容
target要修改的属性所属的对象
property要修改的属性
var存储信息的变量
scopevar属性的作用域Page

如果指定了target属性,那么property属性也需要被指定。

实例如下:

<c:set var="salary" scope="session" value="${2000*2}"/>

【5】c:if在页面比较当前时间与后台传输时间

需求:在页面上比较后台传输过来的时间与当前时间。

① 首先这里需要引入标签,并获取当前时间:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>   
 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
 <jsp:useBean id="now" class="java.util.Date" scope="page"></jsp:useBean>

② 将上一步获取的时间对象转换为字符串

<fmt:formatDate var="nowDate" value='${now}'  pattern='yyyy-MM-dd HH:mm:ss'/>

③ 然后使用c:if进行比较

<c:if test="${startTime> nowDate||endTime<nowDate}">不在时间范围内!</c:if>

【6】c:choose

<c:choose>标签与Java switch语句的功能一样,用于在众多选项中做出选择。

switch语句中有case,而<c:choose>标签中对应有<c:when>,switch语句中有default,而<c:choose>标签中有<c:otherwise>

语法格式

<c:choose>
    <c:when test="<boolean>">
        ...
    </c:when>
    <c:when test="<boolean>">
        ...
    </c:when>
    ...
    ...
    <c:otherwise>
        ...
    </c:otherwise>
</c:choose>

属性

  • <c:choose>标签没有属性。
  • <c:when>标签只有一个属性,test。
  • <c:otherwise>标签没有属性。

测试实例如下

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
<%--     <jsp:forward page="user/login"></jsp:forward> --%>
<c:set var="counter" value="100"/>
<c:choose>
    <c:when test="${counter%2==1}">
       	<% out.println("it's odd"); %>
    </c:when>
   
    <c:otherwise>
        <% out.println("it's even"); %>
    </c:otherwise>
</c:choose>
  </body>
</html>

输出结果为:it's even(它是偶数)

这里需要说明的是,c:choose c:when c:otherwise是非正即负,即时counter属性不存在,也不会报错,而是会输出it’s even。


【7】fmt日期格式化

先在页面引入:

<%@ taglib prefix="fmt" uri="/WEB-INF/tlds/fmt.tld"  %>

使用实例如下:

 <td ><fmt:formatDate value="${data.updateTime}" pattern="yyyy-MM-dd HH:mm:ss"/> </td>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流烟默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值