0
点赞
收藏
分享

微信扫一扫

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>

测试结果如下:

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

【2】c:if

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

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

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

属性

描述

是否必要

默认值

test

条件



var

用于存储条件结果的变量



scope

var属性的作用域


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

存储信息的变量



scope

var属性的作用域


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>


举报

相关推荐

0 条评论