常用的JSTL标签(详解)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36537546/article/details/84610369

相比起来JS、JQuery页面实现,我更倾向于JSTL标签,简单易懂,重点是不繁琐(仅代表个人意见)

简单介绍一下JSTL标签:

JSTL是一个JSP标签集合,它封装了JSP应用的通用核心功能,主要结构由五部分组成

1.核心标签    2.格式化标签    3.SQL标签    4.XML标签    5.JSTL函数

标准的JSTL库安装:

从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip)。

下载 jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下。

注意:

JSTL 1.1 与 JSTL 1.2 之间的区别?

JSTL 1.2 中不要求 standard.jar 包。

您可以在 Maven 中央仓库中找到它们。

http://repo2.maven.org/maven2/javax/servlet/jstl/

http://repo2.maven.org/maven2/taglibs/standard/

由于JSTL 1.1已经过时,Apache已将其置于存档中。选择jakarta-taglibs-standard-current.zip文件。但是,如果您正在运行Servlet 2.5兼容容器并且web.xml声明为至少Servlet 2.5,那么您应该能够使用新的JSTL 1.2。需要注意的是JSTL 1.2并没有要求standard.jar

将 tld 下的需要引入的 tld 文件复制到 WEB-INF 目录下。

接下来我们在 web.xml 文件中添加以下配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <jsp-config>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/fmt</taglib-uri>
    <taglib-location>/WEB-INF/fmt.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/fmt-rt</taglib-uri>
    <taglib-location>/WEB-INF/fmt-rt.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
    <taglib-location>/WEB-INF/c.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/core-rt</taglib-uri>
    <taglib-location>/WEB-INF/c-rt.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/sql</taglib-uri>
    <taglib-location>/WEB-INF/sql.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/sql-rt</taglib-uri>
    <taglib-location>/WEB-INF/sql-rt.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/x</taglib-uri>
    <taglib-location>/WEB-INF/x.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/x-rt</taglib-uri>
    <taglib-location>/WEB-INF/x-rt.tld</taglib-location>
    </taglib>
    </jsp-config>
</web-app>

(中间的介绍就不多说了,感觉像是在说废话)

(注意:在任何JSP 页面中使用任何标签,你必须在每个页面的头部写上 <taglib> 标签。)

一、核心标签:

核心标签是最常用的 JSTL标签也就是最常见的“C”标签,首先引用头文件,这个要注意,千万别引错:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

  标签                             描述

(顺序是按常用来排的,当然要先写自己熟悉的啦,常用的标蓝了,附上用法)

<c:forEach>                   基础迭代标签,接受多种集合类型(简单来说就是循环遍历集合的,用来输出集合里的值)

  <body>
  	<!-- 语法格式 -->
  	<c:forEach items="要被循环的信息<--存放值-->" begin="开始的元素" 
  			   end="最后一个元素" step="每一次迭代的步长" var="变量名称" 
  			   varStatus="循环状态的变量名称">
  	
  	</c:forEach>
  	
  	<!-- 定义循环 -->
  	<c:forEach var="i" begin="1" end="5">
  	   <!-- 输出循环 -->
	   Item <c:out value="${i}"/><p>
	</c:forEach>
  </body>

输出结果:

Item 1
Item 2
Item 3
Item 4
Item 5

<c:if>                              与我们在一般程序中用的if一样,没啥区别

  <body>
  	<!-- 语法格式 -->
  	<c:if test="条件" var="变量名" scope="属性的作用域(可加可不加)">
	   ...
	</c:if>
  	
  	<!-- 定义一个if判断 -->
  	<c:set var="salary" scope="session" value="${2000*2}"/>
        <!-- 如果我的工资大于2000就进入判断 -->
	<c:if test="${salary > 2000}">
	   <p>我的工资为: <c:out value="${salary}"/><p>
	</c:if>
  </body>

输出结果:

我的工资为: 4000

<c:choose>                    本身只当做<c:when>和<c:otherwise>的父标签(感觉和 while 一样用)

<c:when>                       <c:choose>的子标签,用来判断条件是否成立

<c:otherwise>                <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行

	<body>
		<!-- 语法格式 -->
		<!-- 其实这个东西感觉和IF差不多 -->
		<c:choose>
		    <c:when test="条件">
		        ...
		    </c:when>
		    <c:when test="条件">
		        ...
		    </c:when>
		    ...
		    ...
		    <c:otherwise>
		        ...
		    </c:otherwise>
		</c:choose>
		
		<c:set var="salary" scope="session" value="${2000*2}"/>
		<p>你的工资为 : <c:out value="${salary}"/></p>
		<c:choose>
		    <c:when test="${salary <= 0}">
		      	 太惨了
		    </c:when>
		    <c:when test="${salary > 1000}">
		      	 不错的薪水,还能生活。
		    </c:when>
		    <c:otherwise>
		                 什么都没有。
		    </c:otherwise>
		</c:choose>
	</body>

<c:out>                          用于在JSP中显示数据,就像<%= ... >(额,就是输出语句)

  <body>
  	<!-- 语法格式 -->
  	<c:out value="&lt要显示的数据对象(未使用转义字符)&gt" escapeXml="true" default="默认值"></c:out><br/>
        <c:out value="&lt要显示的数据对象(使用转义字符)&gt" escapeXml="false" default="默认值"></c:out><br/>
  	
  	<!-- 定义一个if判断 -->
  	<h1>&lt;c:out&gt; 实例</h1>
        <c:out value="${null}" escapeXml="false">使用的表达式结果为null,则输出该默认值</c:out><br/>
  </body>

输出结果

&lt要显示的数据对象(未使用转义字符)&gt
<要显示的数据对象(使用转义字符)>
使用的表达式结果为null,则输出该默认值

<c:set>                          用于保存数据(作用和out差不多)

<c:remove>                   用于删除数据

<c:catch>                      用来处理产生错误的异常状况,并且将错误信息储存起来

<c:import>                    检索一个绝对或相对 URL,然后将其内容暴露给页面

<c:forTokens>               根据指定的分隔符来分隔内容并迭代输出(相比而言,<c:forEach>标签是更加通用的标签)

<c:param>                    用来给包含或重定向的页面传递参数

<c:redirect>                  重定向至一个新的URL.

<c:url>                          使用可选的查询参数来创造一个URL

二、格式化标签:

格式化标签用来格式化并输出文本、日期、时间、数字:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

  标签                                描述

(顺序是按常用来排的,当然要先写自己熟悉的啦,常用的标蓝了)

<fmt:formatNumber>        使用指定的格式或精度格式化数字

	<body>
		<!-- 语法格式 -->
		<fmt:formatNumber
		  value="要显示的值 ----- 1 "   
		  type="选择输出的类型  -----number  currency  percent "
		  pattern="指定自定义格式 ------ 0.0 || 0.00 "
		  currencyCode="货币码"
		  currencySymbol="货币符号"
		  groupingUsed="是否对数字分组"
		  maxIntegerDigits="整型数最大的位数"
		  minIntegerDigits="整型数最小的位数"
		  maxFractionDigits="小数点后最大的位数"
		  minFractionDigits="小数点后最小的位数"
		  var="变量名"
		  scope="var属性的作用域"/>
		
		<c:set var="balance" value="120000.2309" />
		<p>格式化数字 (1): <fmt:formatNumber value="${balance}" 
		            type="currency"/></p>
		<p>格式化数字 (2): <fmt:formatNumber type="number" 
		            maxIntegerDigits="3" value="${balance}" /></p>
		<p>格式化数字 (3): <fmt:formatNumber type="number" 
		            maxFractionDigits="3" value="${balance}" /></p>
		<p>格式化数字 (4): <fmt:formatNumber type="number" 
		            groupingUsed="false" value="${balance}" /></p>
		<p>格式化数字 (5): <fmt:formatNumber type="percent" 
		            maxIntegerDigits="3" value="${balance}" /></p>
		<p>格式化数字 (6): <fmt:formatNumber type="percent" 
		            minFractionDigits="10" value="${balance}" /></p>
		<p>格式化数字 (7): <fmt:formatNumber type="percent" 
		            maxIntegerDigits="3" value="${balance}" /></p>
		<p>格式化数字 (8): <fmt:formatNumber type="number" 
		            pattern="###.###E0" value="${balance}" /></p>
		<p>美元 :
		<fmt:setLocale value="en_US"/>
		<fmt:formatNumber value="${balance}" type="currency"/></p>
	</body>

输出结果

数字格式化:
格式化数字 (1): ¥120,000.23
格式化数字 (2): 000.231
格式化数字 (3): 120,000.231
格式化数字 (4): 120000.231
格式化数字 (5): 023%
格式化数字 (6): 12,000,023.0900000000%
格式化数字 (7): 023%
格式化数字 (8): 120E3
美元 : $120,000.23

<fmt:formatDate>             使用指定的风格或模式格式化日期和时间(yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss)

	<body>
		<!-- 语法格式 -->
		<fmt:formatDate
		  value="要显示的值 "
		  type="要输出的类型 ------ date || time || both"
		  pattern="自定义格式模式"
		  timeZone="显示日期的时区"
		  var="变量名"
		  scope="存储格式化日志变量的范围"/>
		
		<h3>日期格式化:</h3>
		<c:set var="now" value="<%=new java.util.Date()%>" />
		<p>日期格式化 (1): <fmt:formatDate type="time" value="${now}" /></p>
		<p>日期格式化 (2): <fmt:formatDate type="date" value="${now}" /></p>
		<p>日期格式化 (3): <fmt:formatDate type="both" value="${now}" /></p>
		<p>日期格式化 (4): <fmt:formatDate type="both" dateStyle="short" timeStyle="short" value="${now}" /></p>
		<p>日期格式化 (5): <fmt:formatDate type="both" dateStyle="medium" timeStyle="medium" value="${now}" /></p>
		<p>日期格式化 (6): <fmt:formatDate type="both" dateStyle="long" timeStyle="long" value="${now}" /></p>
		<p>日期格式化 (7): <fmt:formatDate pattern="yyyy-MM-dd" value="${now}" /></p>
	</body>

输出结果

日期格式化:
日期格式化 (1): 11:19:43
日期格式化 (2): 2016-6-26
日期格式化 (3): 2016-6-26 11:19:43
日期格式化 (4): 16-6-26 上午11:19
日期格式化 (5): 2016-6-26 11:19:43
日期格式化 (6): 2016年6月26日 上午11时19分43秒
日期格式化 (7): 2016-06-26

<fmt:parseNumber>         标签用来解析数字,百分数,货币

<fmt:parseDate>              标签用于解析日期。

<fmt:bundle>                    绑定资源

<fmt:setLocale>               指定地区

<fmt:setBundle>              绑定资源

<fmt:timeZone>               指定时区

<fmt:setTimeZone>         指定时区

<fmt:message>               显示资源配置文件信息

<fmt:requestEncoding>   设置request的字符编码

三、SQL标签:

(额,其实这标签我也怎么用过,咳咳,那个啥就不标注了)

SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签:

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

  标签                                描述

<sql:setDataSource>       指定数据源

<sql:query>                      运行SQL查询语句

<sql:update>                    运行SQL更新语句

<sql:param>                     将SQL语句中的参数设为指定值

<sql:dateParam>              将SQL语句中的日期参数设为指定的java.util.Date 对象值

<sql:transaction>              在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行

四、XML标签:

(本来不想写这两个标签的,因为不经常使用,但是,哎emmmmm,想了一下还是写吧,最主要的还是最后的JSTL函数

XML标签库提供了创建和操作XML文档的标签:

<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

注意:在使用xml标签前,你必须将XML 和 XPath 的相关包拷贝至你的<Tomcat 安装目录>\lib下:

  标签                                描述

<x:out>                             与<%= ... >,类似,不过只用于XPath表达式(其实感觉和"C"标签没多大区别)

<x:parse>                         解析 XML 数据

<x:set>                             设置XPath表达式

<x:if>                                判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体

<x:forEach>                     迭代XML文档中的节点

<x:choose>                      <x:when>和<x:otherwise>的父标签

<x:when>                         <x:choose>的子标签,用来进行条件判断

<x:otherwise>                  <x:choose>的子标签,当<x:when>判断为false时被执行

<x:transform>                  将XSL转换应用在XML文档中

<x:param>                       与<x:transform>共同使用,用于设置XSL样式表

五、JSTL函数

(终于到介绍的重点了。。。咳咳,感觉这玩意比"js"和"jquery"好用,虽然他的功能性比不上他俩,但是处理数据的话,个人觉得“没毛病”,重点是方便!!,还是老规矩常用的在上边)

JSTL包含一系列标准函数,大部分是通用的字符串处理函数:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

  函数                                描述

fn:contains()                     测试输入的字符串是否包含指定的子串

  <body>
    <!-- 语法 -->
    <c:if test="${fn:contains(原始字符串, '要查找的子字符串')}">
         ...
    </c:if>

    <!-- 测试 -->
    <!-- 输出字符串 "I am from runoob" 给他起一个变量名 "theString" -->
    <c:set var="theString" value="I am from runoob"/>
    <!-- 判断当前字符串是否有 "runoob"  -->
    <!-- 判断是否区分大小写 -->
    <c:if test="${fn:contains(theString, 'runoob')}">
       <p>找到 runoob<p>
    </c:if>
    <c:if test="${fn:contains(theString, 'RUNOOB')}">
       <p>找到 RUNOOB<p>
    </c:if>
  </body>

输出结果为:

找到 runoob

fn:split()                            将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回(截取字符串)

fn:join()                             将数组中的元素合成一个字符串然后输出

  <body>
        <!-- 语法格式 -->
  	${fn:split(待分隔的字符串, '分隔符')}

  	<!-- 输出字符串 "www hello word com" 给他起一个变量名 "theString" -->
        <c:set var="theString1" value="www hello word com"/>
        <!-- 以空格为分割符,截取成数组 -->
	<c:set var="theString2" value="${fn:split(theString1, ' ')}" />
	<!-- 在数组后面拼接"-" -->
	<c:set var="theString3" value="${fn:join(theString2, '-')}" />
	<!-- 输出结果 -->
	<p>theString3 字符串 : ${theString3}</p>
	<!-- 以下同理 -->
	<c:set var="theString4" value="${fn:split(theString3, '-')}" />
	<c:set var="theString5" value="${fn:join(theString4, ' ')}" />
	<p>theString5 字符串: ${theString5}</p>
  </body>

输出结果:

theString3 字符串 : www-hello-word-com

theString5 字符串: www hello word com

fn:length()                         返回字符串长度

  <body>
  	<!-- 语法格式 -->
  	${fn:length(要获取的变量)}
  	
  	<!-- 示例 -->
  	<c:set var="string1" value="This is first String."/>
	<c:set var="string2" value="This is second String." />
	<!-- 返回字符串长度 -->
	<p>字符串长度 (1) : ${fn:length(string1)}</p>
	<p>字符串长度 (2) : ${fn:length(string2)}</p>
  </body>

输出结果:

字符串长度 (1) : 21

字符串长度 (2) : 22

fn:indexOf()                      返回指定字符串在输入字符串中出现的位置

  <body>
  	<!-- 语法格式 -->
  	${fn:indexOf(原始字符串,子字符串)}
  	
  	<!-- 示例 -->
  	<c:set var="string1" value="This is first String."/>
	<c:set var="string2" value="This <abc>is second String.</abc>"/>
	<!-- 下标 0 开始 ,指定字符串在输入字符串中出现的位置-->
	<p>Index (1) : ${fn:indexOf(string1, "first")}</p>
	<p>Index (2) : ${fn:indexOf(string2, "second")}</p>
  </body>

输出结果:

Index (1) : 8

Index (2) : 13

fn:substring()                    返回字符串的子集

  <body>
  	<!-- 语法格式 -->
  	${fn:substring('要获取的对象', '开始位置', '结束位置')}
  	
  	<!-- 示例 -->
  	<c:set var="string1" value="This is first String."/>
	<!-- 下标 0 开始 ,指定字符串在输入字符串中出现的位置 !!!不包含结束位置 -->
	<c:set var="string2" value="${fn:substring(string1, 1, 5)}" />
	<p>生成的子字符串为 : ${string2}</p>
  </body>

输出结果:

生成的子字符串为 : his

fn:substringAfter()            返回字符串在指定子串之后的子集

fn:substringBefore()         返回字符串在指定子串之前的子集

  <body>
  	<!-- 语法格式 -->
  	${fn:substringBefore('要获取的对象或者变量', '指定字符串')}
  	${fn:substringBefore('要获取的对象或者变量', '指定字符串')}
  	
  	<!-- 示例 -->
  	<c:set var="string1" value="This is first String."/>
  	<!-- 截取指定指定字符串   不包含指定字符串 -->
  	<!-- fn:substringAfter  : 截取指定字符串之后的值 -->
  	<!-- fn:substringBefore : 截取指定字符串之前的值 -->
	<c:set var="string2" value="${fn:substringAfter(string1, 'is')}" />
	<c:set var="string3" value="${fn:substringBefore(string1, 'first')}" />
	<p>生成的子字符串 : ${string2}</p>
	<p>生成的子字符串 : ${string3}</p>
  </body>

输出结果:

生成的子字符串 : is first String.

生成的子字符串 : This is

fn:toLowerCase()             将字符串中的字符转为小写

fn:toUpperCase()             将字符串中的字符转为大写

  <body>
  	<!-- 语法格式 -->
	${fn.toUpperCase('要存放的对象')}
	${fn.toLowerCase('要存放的对象')}
	
  	<!-- 示例 -->
  	<!-- 定义的输出语句 -->
  	<c:set var="string1" value="I am from RUNOOB"/>
	<c:set var="string2" value="${fn:toLowerCase(string1)}" />
	<c:set var="string3" value="${fn:toUpperCase(string1)}" />
	<p>字符串为 : ${string2}</p>
	<p>字符串为 : ${string3}</p>
  </body>

输出结果:

字符串为 : i am from runoob
字符串为 : I AM FROM RUNOOB

fn:startsWith()                  测试输入字符串是否以指定的前缀开始

fn:endsWith()                   测试输入的字符串是否以指定的后缀结尾

  <body>
  	<!-- 语法格式 -->
	<c:if test="${fn:startsWith('获取的对象', '搜索的前缀')}">
            ...
	</c:if>
	<c:if test="${fn:endsWith('获取的对象', '搜索的后缀')}">
            ...
	</c:if>

  	<!-- 示例 -->
  	<!-- 定义的输出语句 -->
  	<c:set var="string" value="Runoob: I am from Runoob."/>
  	
  	<!-- fn:startsWith -->
	<c:if test="${fn:startsWith(string, 'Google')}">
	   <p>字符串以 Google 开头</p>
	</c:if>
	<br />
	<c:if test="${fn:startsWith(string, 'Runoob')}">
	   <p>字符串以 Runoob 开头</p>
	</c:if>
	
	<!-- fn:endsWith -->
	<c:set var="theString" value="I am from runoob 123"/>
	<c:if test="${fn:endsWith(theString, '123')}">
	   <p>字符串以 123 结尾<p>
	</c:if>
	<c:if test="${fn:endsWith(theString, 'unoob')}">
	   <p>字符串以 runoob 结尾<p>
	</c:if>
	
  </body>

fn:replace()                      将输入字符串中指定的位置替换为指定的字符串然后返回

  <body>
  	<!-- 语法格式 -->
	${fn:replace(<原始字符串>, <被替换的字符串>, <要替换的字符串>)}

  	<!-- 示例 -->
  	<!-- 定义的输出语句 -->
  	<c:set var="string1" value="I am from google"/>
	<c:set var="string2" value="${fn:replace(string1, 'google', 'runoob')}" />
	<p>替换后的字符串 : ${string2}</p>
	
  </body>

fn:trim()                            移除首位的空白符(去空格的)

  <body>
    <!-- 语法格式 -->
    ${fn:trim("要输出的字符串")}
  	
    <!-- 定义输出字符串 -->
    <c:set var="string1" value="I am from runoob         "/>
    <!-- 原字符串长度 -->
    <p>string1 长度 : ${fn:length(string1)}</p>
    <c:set var="string2" value="${fn:trim(string1)}" />
    <!-- 移除后字符串长度 -->
    <p>string2 长度 : ${fn:length(string2)}</p>
    <p>字符串为 : ${string2}</p>
  </body>

输出结果:

string1 长度 : 25
string2 长度 : 16

fn:containsIgnoreCase()  测试输入的字符串是否包含指定的子串,大小写不敏感

  <body>
  	<!-- 语法格式 -->
	<c:if test="${fn:containsIgnoreCase('要获取的对象或者变量', '要查询的字段')}">
	...
	</c:if>
	
  	<!-- 示例 -->
  	<!-- 定义的输出语句 -->
        <!-- 查询不区分大小写 -->
  	<c:set var="theString" value="I am from runoob"/>
	<c:if test="${fn:containsIgnoreCase(theString, 'runoob')}">
	   <p>找到 runoob<p>
	</c:if>
	<c:if test="${fn:containsIgnoreCase(theString, 'RUNOOB')}">
	     <p>找到 RUNOOB<p>
	</c:if>
  </body>

输出结果:

找到 runoob
找到 RUNOOB

fn:escapeXml()                 跳过可以作为XML标记的字符

  <body>
  	<c:set var="string1" value="This is first String."/>
	<c:set var="string2" value="This <abc>is second String.</abc>"/>
	
	<p>使用 escapeXml() 函数:</p>
	<p>string (1) : ${fn:escapeXml(string1)}</p>
	<p>string (2) : ${fn:escapeXml(string2)}</p>
	
	<p>不使用 escapeXml() 函数:</p>
	<p>string (1) : ${string1}</p>
	<p>string (2) : ${string2}</p>
  </body>

输出结果

使用 escapeXml() 函数:
string (1) : This is first String.
string (2) : This <abc>is second String.</abc>

不使用 escapeXml() 函数:
string (1) : This is first String.
string (2) : This is second String.

猜你喜欢

转载自blog.csdn.net/qq_36537546/article/details/84610369
今日推荐