相比起来JS、JQuery页面实现,我更倾向于JSTL标签,简单易懂,重点是不繁琐(仅代表个人意见)
简单介绍一下JSTL标签:
JSTL是一个JSP标签集合,它封装了JSP应用的通用核心功能,主要结构由五部分组成
1.核心标签 2.格式化标签 3.SQL标签 4.XML标签 5.JSTL函数
标准的JSTL库安装:
从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip)。
- 官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
- 本站下载地址:jakarta-taglibs-standard-1.1.2.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="<要显示的数据对象(未使用转义字符)>" escapeXml="true" default="默认值"></c:out><br/>
<c:out value="<要显示的数据对象(使用转义字符)>" escapeXml="false" default="默认值"></c:out><br/>
<!-- 定义一个if判断 -->
<h1><c:out> 实例</h1>
<c:out value="${null}" escapeXml="false">使用的表达式结果为null,则输出该默认值</c:out><br/>
</body>
输出结果
<要显示的数据对象(未使用转义字符)>
<要显示的数据对象(使用转义字符)>
使用的表达式结果为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下:
- XercesImpl.jar
- xalan.jar
)
标签 描述
<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.