9.7 Functions标签库
称呼Functions标签库为标签库,倒不如称呼其为函数库来得更容易理解些。因为Functions标签库并没有提供传统的标签来为JSP页面的工作服务,而是被用于EL表达式语句中。在JSP2.0规范下出现的Functions标签库为EL表达式语句提供了许多更为有用的功能。Functions标签库分为两大类,共16个函数。
q 长度函数:fn:length
q 字符串处理函数:fn:contains、fn:containsIgnoreCase、fn:endsWith、fn:escapeXml、fn:indexOf、fn:join、fn:replace、fn:split、fn:startsWith、fn:substring、fn:substringAfter、fn:substringBefore、fn:toLowerCase、fn:toUpperCase、fn:trim
以下是各个函数的用途和属性以及简单示例。
长度函数fn:length的出现有重要的意义。在JSTL1.0中,有一个功能被忽略了,那就是对集合的长度取值。虽然java.util.Collection接口定义了size方法,但是该方法不是一个标准的JavaBean属性方法(没有get,set方法),因此,无法通过EL表达式“${collection.size} ”来轻松取得。
fn:length函数正是为了解决这个问题而被设计出来的。它的参数为input,将计算通过该属性传入的对象长度。该对象应该为集合类型或String类型。其返回结果是一个int类型的值。下面看一个示例。
<%ArrayList arrayList1 = new ArrayList();
arrayList1.add("aa");
arrayList1.add("bb");
arrayList1.add("cc");
%>
<%request.getSession().setAttribute("arrayList1",arrayList1);%>
${fn:length(sessionScope.arrayList1)}
假设一个ArrayList类型的实例“arrayList1 ”,并为其添加三个字符串对象,使用fn:length函数后就可以取得返回结果为“3 ”。
fn:contains函数用来判断源字符串是否包含子字符串。它包括string和substring两个参数,它们都是String类型,分布表示源字符串和子字符串。其返回结果为一个boolean类型的值。下面看一个示例。
${fn:contains("ABC", "a")}<br>
${fn:contains("ABC", "A")}<br>
前者返回“false ”,后者返回“true ”。
fn:containsIgnoreCase函数与fn:contains函数的功能差不多,唯一的区别是fn:containsIgnoreCase函数对于子字符串的包含比较将忽略大小写。它与fn:contains函数相同,包括string和substring两个参数,并返回一个boolean类型的值。下面看一个示例。
${fn:containsIgnoreCase("ABC","a")}<br>
${fn:containsIgnoreCase("ABC","A")}<br>
前者和后者都会返回“true ”。
fn:startsWith函数用来判断源字符串是否符合一连串的特定词头。它除了包含一个string参数外,还包含一个subffx参数,表示词头字符串,同样是String类型。该函数返回一个boolean类型的值。下面看一个示例。
${fn:startsWith ("ABC", "ab")}<br>
${fn:startsWith ("ABC", "AB")}<br>
前者返回“false ”,后者返回“true ”。
fn:endsWith函数用来判断源字符串是否符合一连串的特定词尾。它与fn:startsWith函数相同,包括string和subffx两个参数,并返回一个boolean类型的值。下面看一个示例。
${fn:endsWith("ABC", "bc")}<br>
${fn:endsWith("ABC", "BC")}<br>
前者返回“false ”,后者返回“true ”。
fn:escapeXml函数用于将所有特殊字符转化为字符实体码。它只包含一个string参数,返回一个String类型的值。
fn:indexOf函数用于取得子字符串与源字符串匹配的开始位置,若子字符串与源字符串中的内容没有匹配成功将返回“-1 ”。它包括string和substring两个参数,返回结果为int类型。下面看一个示例。
${fn:indexOf("ABCD","aBC")}<br>
${fn:indexOf("ABCD","BC")}<br>
前者由于没有匹配成功,所以返回-1,后者匹配成功将返回位置的下标,为1。
fn:join函数允许为一个字符串数组中的每一个字符串加上分隔符,并连接起来。它的参数、返回结果和描述如表9.25所示:
表9.25 fn:join函数
参数 | 描述 |
array | 字符串数组。其类型必须为String[]类型 |
separator | 分隔符。其类型必须为String类型 |
返回结果 | 返回一个String类型的值 |
下面看一个示例。
<% String[] stringArray ={"a","b","c"}; %>
<%request.getSession().setAttribute("stringArray",stringArray);%>
${fn:join(sessionScope.stringArray,"")}<br>
定义数组并放置到Session中,然后通过Session得到该字符串数组,使用fn:join函数并传入分隔符“; ”,得到的结果为“a;b;c ”。
fn:replace函数允许为源字符串做替换的工作。它的参数、返回结果和描述如表9.26所示:
表9.26 fn:replace函数
参数 | 描述 |
inputString | 源字符串。其类型必须为String类型 |
beforeSubstring | 指定被替换字符串。其类型必须为String类型 |
afterSubstring | 指定替换字符串。其类型必须为String类型 |
返回结果 | 返回一个String类型的值 |
下面看一个示例。
${fn:replace("ABC","A","B")}<br>
将“ABC ”字符串替换为“BBC ”,在“ABC ”字符串中用“B ”替换了“A ”。
fn:split函数用于将一组由分隔符分隔的字符串转换成字符串数组。它的参数、返回结果和描述如表9.27所示:
表9.27 fn:split函数
参数 | 描述 |
string | 源字符串。其类型必须为String类型 |
delimiters | 指定分隔符。其类型必须为String类型 |
返回结果 | 返回一个String[]类型的值 |
下面看一个示例。
${fn:split("A,B,C",",")}<br>
将“A,B,C ”字符串转换为数组{A,B,C}。
fn:substring函数用于截取字符串。它的参数、返回结果和描述如表9.28所示:
表9.28 fn:substring函数
参数 | 描述 |
string | 源字符串。其类型必须为String类型 |
beginIndex | 指定起始下标(值从0开始)。其类型必须为int类型 |
endIndex | 指定结束下标(值从0开始)。其类型必须为int类型 |
返回结果 | 返回一个String类型的值 |
下面看一个示例。
${fn:substring("ABC","1","2")}<br>
截取结果为“B ”。
9.7.14 起始到定位截取字符串函数fn:substringBefore函数
fn:substringBefore函数允许截取源字符从开始到某个字符串。它的参数和fn:substringAfter函数相同,不同的是substring表示的是结束字符串。下面看一个示例。
${fn:substringBefore("ABCD","BC")}<br>
截取的结果为“A ”。
fn:toLowerCase函数允许将源字符串中的字符全部转换成小写字符。它只有一个表示源字符串的参数string,函数返回一个String类型的值。下面看一个示例。
${fn:toLowerCase("ABCD")}<br>
转换的结果为“abcd ”。
fn:toUpperCase函数允许将源字符串中的字符全部转换成大写字符。它与fn:toLowerCase函数相同,也只有一个String参数,并返回一个String类型的值。下面看一个示例。
${fn:toUpperCase("abcd")}<br>
转换的结果为“ABCD ”。
fn:trim函数将删除源字符串中结尾部分的“空格”以产生一个新的字符串。它与fn:toLowerCase函数相同,只有一个String参数,并返回一个String类型的值。下面看一个示例。
${fn:trim("AB C ")}D<br>
转换的结果为“AB CD ”,注意,它将只删除词尾的空格而不是全部,因此“B ”和“C ”之间仍然留有一个空格。
在企业级应用越来越依赖XML的今天,XML格式的数据被作为信息交换的优先选择。XML processing标签库为程序设计者提供了基本的对XML格式文件的操作。在该标签库中的标签一共有10个,被分为了三类,分别是:
q XML核心标签:<x:parse>、<x:out>、<x:set>。
q XML流控制标签:<x:if>、<x:choose>、<x:when>、<x:otherwise>、<x:forEach>。
q XML转换标签:<x:transform>、<x:param>。
由于该组标签库专注于对某一特定领域的实现,因此本书将只选择其中常见的一些标签和属性进行介绍。
<x:parse>标签是该组标签库的核心,从其标签名就可以知道,它是作为解析XML文件而存在的。它的属性和描述如表9.12所示:
表9.12 <x:parse>标签属性和说明
属性 | 描述 |
doc | 源XML的内容,该属性的内容应该为String类型或者java.io.Reader的实例,可以用xml属性来替代,但是不被推荐 |
var | 将解析后的XML保存在该属性所指定的变量中,之后XML processing标签库中的其他标签若要取XML中的内容就可以从该变量中得到(可选) |
scope | 变量的作用范围(可选) |
varDom | 指定保存的变量为org.w3c.dom.Document接口类型(可选) |
scopeDom | org.w3c.dom.Document的接口类型变量作用范围(可选) |
systemId | 定义一个URI,该URI将被使用到XML文件中以接入其他资源文件(可选) |
filter | 该属性必须为org.xml.sax.XMLFilter类的一个实例,可以使用EL表达式传入,将对XML文件做过滤得到自身需要的部分(可选) |
其中,var、scope和varDom、scopeDom不应该同时出现,而应该被视为两个版本来使用,二者的变量都可以被XML processing标签库的其他标签来使用。
<x:parse>标签单独使用的情况很少,一般会结合XML processing标签库中的其他标签来一起工作。下面看一个示例。
首先给出一个简单的XML文件,将对该XML文件做解析,该XML文件名为SampleXml.xml。
<?xml version="1.0"encoding="UTF-8"?>
<xml-body>
<name>RW</name>
<passWord>123456</passWord>
<age>28</age>
<books>
<book>book1</book>
<book>book2</book>
<book>book3</book>
</books>
</xml-body>
标签库的工作:
<c:import var="xmlFile"url="http://localhost:8080/booksamplejstl/SampleXml.xml"/>
<x:parse var="xmlFileValue"doc="${xmlFile}"/>
看到I18N就应该想到知识“国际化”,I18N formatting标签库就是用于在JSP页面中做国际化的动作。在该标签库中的标签一共有12个,被分为了两类,分别是:
q 国际化核心标签:<fmt:setLocale>、<fmt:bundle>、<fmt:setBundle>、<fmt:message>、<fmt:param>、<fmt:requestEncoding>。
q 格式化标签:<fmt:timeZone>、<fmt:setTimeZone>、<fmt:formatNumber>、<fmt:parseNumber>、<fmt:formatDate>、<fmt:parseDate>。
下面只选择其中常见的一些标签和属性进行介绍。
9.5.1 用于设置本地化环境的<fmt:setLocale>标签
<fmt:setLocale>标签用于设置Locale环境。它的属性和描述如表9.17所示:
表9.17 <fmt:setLocale>标签属性和说明
属性 | 描述 |
value |