JSP基础(二十一)——JSTL核心标签

本文详细介绍了JSTL标签库中的表达式控制标签、URL标签、条件控制标签和循环标签的功能、语法及其使用示例。



 一、 表达式控制标签

  1.1<c:out>标签

     1.1.1、<c:out>标签的功能

    <c:out>标签主要是用来输出数据对象(字符串、表达式)的内容或结果。

    在使用Java脚本输出时常使用的方式为:<% out.ptintln("字符串") %> 或者<% =表达式 %>,在Web开发中,为了避免暴露逻辑代码,会尽量减少页面中的Java脚本,使用<c:out>标签就可以实现以上功能。

<c:out value="字符串">

<c:out value="EL表达式">

    JSTL的使用是和EL表达式分不开的,EL表达式虽然可以直接将结果返回给页面,但有时得到的结果为空,<c:out>有特定的结果处理功能,EL的单独使用会降低程序的易读性,建议把EL的结果输入放入<c:out>标签中。


注:

     <c:out>标记可使用“.”访问对象的属性,而<%= %>必须使用对象的方法。如: <%request.setAttribute("customer",new Person()); %>

       表达式的${customer.address }的输出代码如下:<c:out value="${customer.address}"/>



     1.1.2、<c:out>标签的语法

<c:out>标签的使用有两种格式(两种方式没有本质区别,只是格式上的差别,[ ]属性表示不是必须的)

<c:out value="要显示的数据对象" [escapeXml="true|false"][default="默认值"]/>

<c:out value="要显示的数据对象" [escapeXml="true|false"]>默认值</c:out>



     1.1.3、<c:out>标签的属性

属性名是否支持EL属性类型属性描述
ValuetrueObject指定要输出的内容
escapeXmltrueBoolean指定是否将>、<、&、'、"等特殊字符进行HTML编码转换后再进行输出。默认值为true
defaulttrueObject指定如果value属性值为null时所输出的默认值

     

    1.1.4、<c:out>标签的使用范例
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSTL-c:out</title>
</head>
<body bgcolor="pink">
<c:out>
<%
    pageContext.setAttribute("myVar", "属性:页内有效");
    request.setAttribute("myVar", "属性:请求有效");
    session.setAttribute("myVar", "属性:会话有效");
    
    java.io.Reader reader1 = new java.io.StringReader("<font color='green'>含有特殊字符的文本</font>");
    pageContext.setAttribute("myReader1", reader1);
    java.io.Reader reader2 = new java.io.StringReader("<font color='green'>含有特殊字符的文本</font>");
    pageContext.setAttribute("myReader2", reader2);
%>
<c:out value="常量字符串输出;"/>  <c:out value="武汉    2017"/><br/><br>
<c:out value="表达书输出:"/>  <c:out value="${2017+1 }"/><br/><br>

<c:out value="默认值输出:"/>  <c:out value="${param.name }" default="value的值为null,所以输出我这个默认值" /><br/><br>
 
<c:out value="重名属性输出(输出范围最小的属性值):"/> <c:out value="${myVar }"/><br><br>

<c:out value="特殊字符输出:" /><br>
<!-- 将会输出特殊标记 -->
(escapeXml=true):<c:out value="${myReader1 }"/> <br/>
<!-- 将会按照规定格式输出 -->
(escapeXml=false):<c:out value="${myReader2 }" escapeXml="false"/>  <br/>
</body>
</html>

运行结果:




  1.2、<c:set>标签 和 <c:remove>标签

    1.2.1、<c:set>标签和<c:remove>标签的功能

      <c:set>标签主要用来将谋特定值设置给一个属于特定范围的变量或是目标对象的属性,这些值被设置之后存储在变量或是对象当中,并进一步被使用于其他的运算  。

      <c:remove>标签用于在特定范围中删除指定的变量。注:如果没有指定范围,则依次从pageContext、request、session、application范围中查找变量,在第一个找到范围内删除该变量。


    1.2.2、<c:set>标签的语法

   注:scope值取pageContext、request、session、application之一,且scope的值可以不指定

    ①将value的值存储至范围为 scope 的 varName 变量之中:

<c:set value="value" var="varName" scope="request"/>

    ②将本体内容的数据存储至范围为scope的varName变量之中:

<c:set var="varName" scope="request">
    本体内容
</c:set>

    ③将value的值存储至target对象的属性中:

<c:set target="target" property="propertyName" value="value" />


    ④将本体内容的数据存储至target对象的属性中:

<c:set target="target" property="propertyName" >
    本体内容
</c:set>

 

    1.2.3、<c:remove>标签的语法

  <c:remove var="varName" scope="pageContext"/>

    1.2.4、<c:set>标签和<c:remove>标签的使用范例

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSTL-c:set and c:remove</title>
</head>
<body bgcolor="pink">
<h2>c:set和c:remove的使用范例 </h2><br>

<c:set scope="page" var="number"><c:out value="${2017+1 }"/> </c:set>
<c:set scope="request" var="number"><%=2020 %></c:set>
<c:set scope="session" var="number">2025</c:set>

c:set初始设置的值:<br><hr>
pageScope.number : <c:out value="${pageScope.number }" default="No Data"/><br>
requestScope.number : <c:out value="${requestScope.number }" default="No Data"/><br>
sessionScope.number : <c:out value="${sessionScope.number }" default="No Data"/><br><br><br>

<c:out value="<c:remove var='number' scope='page'/>之后:" /><br><hr>
<c:remove var="number" scope="page"/>
pageScope.number : <c:out value="${pageScope.number }" default="No Data"/><br>
requestScope.number : <c:out value="${requestScope.number }" default="No Data"/><br>
sessionScope.number : <c:out value="${sessionScope.number }" default="No Data"/><br><br><br>

<c:out value="<c:remove var='number' />之后(未指定scope范围):" /><br><hr>
<c:remove var="number" />
pageScope.number : <c:out value="${pageScope.number }" default="No Data"/><br>
requestScope.number : <c:out value="${requestScope.number }" default="No Data"/><br>
sessionScope.number : <c:out value="${sessionScope.number }" default="No Data"/><br>

</body>
</html>

运行结果:



    1.3、<c:catch>标签

     <c:catch>标签可以用来取得网页发生错误时的错误信息,同时进行适当的处理,避免网页出现无法理解的内容。

    语法:

<c:catch var="exception">
     嵌入其他标记,可以多个
</c:catch>


    应用实例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSTL—c:catch</title>
</head>
<body>
    <c:catch var="exception">
    <%
        int[] a = {1,2,3};
        int b = 0;
        for(int i=0;i<4;i++) {
        	b += a[i];
        	out.print(b+"  ");
        }
    %>    
    </c:catch> 
    <br>
    <c:out value="${exception }"/>
</body>
</html>

运行结果:

 

 

 

 

二、URL标签

 JSTL核心标签中与URL标签相关的有4个:<c:import>、<c:url>、<c:redirect>和<c:param>,其中<c:param>作为其他三个标签的参数设置,主要功能是在URL后面附加参数。


  2.1、<c:param>标签

    <c:param>标签主要是将参数传递给所包含的文件,其语法:

    ①将属性值指定给value属性:

  <c:param name="name“ value="value"/>

    ②将属性值指定给本体内容:

<c:param name="name“ >
parameter value
</c:param>

    在<c:param>标签语法中,可以直接将值指定给value属性或是本体内容。设置好的标签值运用在<c:url>标签中,或用在说明网页重定向操作额标签<c:redirect>中。当用户在使用<c:param>标签时,必须指定name的属性,否则标签不会有任何操作。若是value指定为null,则会输出一个空值。


  2.2、<c:url>标签

   <c:url>标签将一个URL格式化为一个字符串,并可保存到一个变量中。用户可以通过它在JSP网页动态指定一个网址字符串。其 语法:

   注:scope值取pageContext、request、session、application之一,且scope的值可以不指定。context属性和var属性也可以不指定

    ①无本体内容:

  <c:url value="value" context="context" var="varName" scope="page"/>

    ②在本体内容指定数字符串
  <c:url value="value" context="context" var="varName" scope="page">
  <c:param>subtags
  </c:url>

<c:url>的属性:

value:带定向资源的URL(必须指定)

context:当使用相对路径访问外部context时,用来指定一个外部资源名字(可选)

var:参数名,若指定了,URL资源的内容将被输出至指定的变量(可选)

scope:var的参数范围,var变量只有在这个范围内有效(可选)

 


 <c:url>标签和<c:param>标签应用示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSTL-c:url and c:param</title>
</head>
<body>
    <h3><c:url></h3>
    <font size=1>在将鼠标移动到对应的超链接上,浏览器状态栏中可以看到结果。</font><br><br>
    
    <b>c:url嵌入HTML标记中:</b>
    <a href="<c:url value='cout.jsp'/>" > <c:uri>的用法</a><br>
    结果:http://localhost:8080/Demo_JSTL/Core/cout.jsp<br><br>
    
    <b>使用var属性保存URL:</b>
    <c:url var="url1" value="/cout.jsp"/>
    <a href="${url1 }"> <c:uri>的用法</a><br>
    结果:http://localhost:8080/Demo_JSTL/Core/cout.jsp <br><br>
    
    <b>使用其他Web应用的URL:</b>
    <c:url var="examples" value="/select.jsp" context="/Demo_JSTL" />
    <a href="${examples }" >Tomcat实例</a><br>
    结果:http://localhost:8080/Demo_JSTL/select.jsp <br><br>
    
    <b>使用参数:</b>
    <c:url value="/cout.jsp" var="url2">
        <c:param name="id" value="10010"/>
        <c:param name="type" value="String"/>
    </c:url>
    <a href="${url2 }" >带参数的URL</a><br>
    结果:http://localhost:8080/Demo_JSTL/Core/cout.jsp?id=10010&type=String <br><br>
    
    <b>使用绝对URL</b>
    <c:url var="baidu" value="http://www.baidu.com" />
    <a href="${baidu }" >绝对URL</a><br>
    结果:http://www.baidu.com
</body>
</html>

 运行结果:


 

 

 2.3、<c:import>标签

    其功能类似于<jsp:import>标记,但其功能更强大。<jsp:import>标记通常只能导入同一个JSP容器内的资源,而<c:import>标记用于导入一个外部或内部资源的内容,外部资源可以通过Web容器作支持的某种协议(如http、ftp等)进行访问。另外,<jsp:import>标记的作用是自动将导入的内容插入到JSP中,而<c:import>标记除了可以自动插入内容外,还可以将内容保存到String或Reader对象中。

  语法:

 ①载入数据内容直接嵌入标签或是输出成为String对象(除了URL属性,其他属性可选的):

<c:import url="url" var="varName" context="context" scope="session"  charEncoding="charEncoding">
...
</c:import>


②载入数据内容直接输出成Reader对象(处理URL属性和varReader属性,其他属性可选):

<c:import url="url" varReader="varReaderName" context="context" scope="session"  charEncoding="charEncoding">
...
</c:import>

 

 

 

 2.4、<c:redirect>标签

    该标签可以按照客户端的要求,重定向至一个指定的URL地址,这个地址可以是绝对地址也可以为相对地址。

    与response对象的sendRedirect()方法相比,<c:redirect>可以自动执行URL重写,并支持不同Web应用的相对URL,除此之外,还可以通过使用<c:param>标记支持URL参数。


语法:

 ①无主体内容:

<c:redirect url="value" context="context"/>


 ②指定搜索字符串参数的主体内容:

<c:redirect url="value" context="context">
<c:param>子标签
</c:redirect>

 




三、条件控制标签

3.1、<c:if>标签

    <c:if>标签用于进行条件判断,只有当其test属性指定的Boolean表达式值为true才会处理其本体的内容,否则不执行。语法格式:

①不包含本体内容(scope属性可选),程序只想取得判断结果时用

<c:if test="testCondition" var="varName" scope="request/..." />

②包含本体:

<c:if test="testCondition" var="varName" scope="request">
要运行的内容
</c:if>


3.2、<c:choose>标签、<c:when>标签和<c:otherwise>标签

    <c:choose>用来处理多个可选条件下的选择。需要和<c:when>、<c:otherwise>配套使用,且<c:when>和<c:otherwise>需要依附在<c:choose>标签下。

    在整个判断区块中,<c:when>标签必须写在<c:otherwise>之前,当test判断式成立的时候,将运行对应的程序区块;若所有<c:when>标签的条件式均不成立,<c:otherwise>标签的内容将被执行。

语法格式如下:

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



条件控制标签示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.Calendar"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSTL--if choose</title>
</head>
<body>
<h2>依据当前时间来输出不同的问候语</h2>
<%
    Calendar rightNow = Calendar.getInstance();
    Integer Hour = new Integer(rightNow.get(Calendar.HOUR_OF_DAY));
    request.setAttribute("hour", Hour);
%>
<br>

<c:if>使用:
<c:if test="${hour>=0&&hour<=11 }">
    <c:set var="sayHello" value="上午好!"/>
</c:if>
<c:if test="${hour>=12&&hour<=17 }">
    <c:set var="sayHello" value="下午好!"/>
</c:if>
<c:if test="${hour>=18&&hour<=23 }">
    <c:set var="sayHello" value="晚上好!"/>
</c:if><br>

<c:out value="现在的时间是:${hour }时,"/>
<c:out value="${sayHello }"/>


<br><br><c:choose>使用:
<c:choose>
    <c:when test="${hour>=0&&hour<=11 }">
        <c:set var="sayHello" value="上午好!"/>
    </c:when>
    <c:when test="${hour>=12&&hour<=17 }">
        <c:set var="sayHello" value="下午好!"/>
    </c:when>
    <c:otherwise>
        <c:set var="sayHello" value="晚上好!"/>
    </c:otherwise>
</c:choose><br>

<c:out value="现在的时间是:${hour }时,"/>
<c:out value="${sayHello }"/>

</body>
</html>

运行结果:




四、循环标签

4.1、<c:foreach>标签

    <c:foreach>标签是一个迭代器,可针对指定的对象集合内容循序浏览一遍。

    语法:

    ①迭代对象集合内容(直接列举指定的集合对象):

<c:forEach var="varName" items="collection" varStatus="varStatusName" begin="begin" end="end" step="step">
    ...
</c:forEach>

    ②迭代特定次数(针对特定的内容进行重复次数的运行操作):

<c:forEach var="varName" varStatus="varStatusName" begin="begin" end="end" step="step">
    ...
</c:forEach>
加粗部分是必须要有的!!!

    var用来保存当前的循环变量,如果是循环固定次数,循环变量就是循环的索引;如果是枚举集合的所有元素,循环变量的值就是集合的当前成员。在枚举集合元素时,使用items属性来指定集合对象。集合对象的类型可以是:Arrayjava.util.Collectionjava.util.Iteratorjava.util.Enumerationjava.util.Map逗号分隔的字符串

    varStatus为目前对象的相关内容信息,存储了迭代成员的状态值,例如索引(index)、计数(count)、是否为首笔(first)及是否为末笔(last)。


示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.Vector"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>forEach</title>
</head>
<body>
<h3><forEach></h3>
<h4>1.循环10次</h4>
参数为:var="item" begin="1" end="10"时:
<c:forEach var="item" begin="1" end="10">
    ${item }
</c:forEach>
<br>
参数为:var="item" begin="1" end="10" step="3"时:
<c:forEach var="item" begin="1" end="10" step="3">
    ${item }
</c:forEach>

<h4>2.枚举Vector元素</h4>
<%
    Vector v = new Vector();
    v.add("北京");
    v.add("上海");
    v.add("深圳");
    v.add("广州");
    v.add("杭州");
    pageContext.setAttribute("vector", v);
%>
<c:forEach items="${vector }" var="item">
    ${item }
</c:forEach>

<h4>3.逗号分隔的字符串</h4>
<c:forEach var="color" items="红,橙,黄,蓝,绿,紫" begin="2" step="3">
    <c:out value="${color }"/>
</c:forEach>

<h4>4.状态变量的使用</h4>
<c:forEach var="i" begin="5" end="50" step="5" varStatus="status">
    <c:if test="${status.first }">
        begin:<c:out value="${status.begin }"/>  
        end:<c:out value="${status.end }"/>  
        step:<c:out value="${status.step }"/><br>
        <c:out value="输出的元素:"></c:out>
    </c:if>
    <c:out value="${i }"/>
    <c:if test="${status.last }">
        <br>总共输出<c:out  value="${status.count }"/>个元素
    </c:if>
</c:forEach>

</body>
</html>

运行结果:



4.2、<c:forTokens>标签

    <c:forTakkens>标签用于浏览指定分隔符字符串中所有成员。语法:

<c:forTokens delims="delimiters" items="stringOfTokens" var="varName" varStatus="varStatusName" begin="begin" end="end" step="step">
    ...
</c:forTokens>
    比<c:forEach>多了一个用来设置字符串分隔标识符的delims属性,delims属性可以同时指定有多个分隔字符;由于<c:forTokens>专门用来处理字符串数据,因此items属性值必须为字符串类型。

示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>forTokens</title>
</head>
<body>
<c:set var="strs" value="红|橙,黄|绿,青|蓝,紫|白" scope="request"/>
<h4><c:out value="${strs }" /></h4>

<c:out value="使用'|'作为分隔字符:"/>
<c:forTokens var="str" items="${strs }" delims="|" varStatus="status" >
    <c:out value="${str }"/>
    <c:if test="${status.last }"> 
        <br>总共输出<c:out value="${status.count }"/>个元素。
    </c:if>
</c:forTokens><br><br>

<c:out value="使用'|'、','作为分隔字符:"/>
<c:forTokens var="str" items="${strs }" delims="|," varStatus="status" >
    <c:out value="${str }"/>
    <c:if test="${status.last }"> 
        <br>总共输出<c:out value="${status.count }"/>个元素。
    </c:if>
</c:forTokens>
</body>
</html>

运行结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值