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

    xiaoxiao2021-03-25  29

    【1】c:foreach

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

    属 性描 述是否必须缺省值items进行循环的项目否无begin开始条件否0end结束条件否集合中的最后一个项目step步长否1var代表当前项目的变量名否无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。

    转载请注明原文地址: https://ju.6miu.com/read-300056.html

    最新回复(0)