JSTL与Struts的结合(三)

在企业级应用越来越依赖 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>
由于该组标签库专注于对某一特定领域的实现,因此本书将只选择其中常见的一些标签和属性进行介绍。
9.4.1 用于解析XML文件的<x:parse>标签
<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}"/>
示例 读取 XML 文件得到了 <c:import> 标签的帮助, <c:import> 标签将源 XML 文件的内容保存在“ xmlFile ”变量中, <x:parse> 标签根据“ xmlFile ”变量的值 解析 SampleXml.xml ”。

9.4.2 用于显示XML内容的<x:out>标签
<x:out> 标签从 <x:parse> 标签解析后保存的变量中取得需要的 XML 文件内容,并显示在页面上。该标签是通过 XPath 技术(定位 XML 元素的一种技术)来实现的。要使用 <x:out> 标签必须将 xalan-j jar 包保存在“ WEB-INF/lib ”下。它的属性和描述如表 9.13 所示:
表9.13 <x:out>标签属性和说明
属性
描述
select
XPath表达式
escape
当特殊字符如:“<,>,&,’,””出现在取得的结果字符串中时,将以转义字符来替换
<x:out> 标签需要与 <x:parse> 标签协同工作,下面看一个示例。
<c:import var="xmlFile" url="http://localhost:8080/booksamplejstl/SampleXml.xml"/>
<x:parse var="xmlFileValue" doc="${xmlFile}"/>
name:<x:out select="$xmlFileValue/xml-body/name"/><br>
passWord:<x:out select="$xmlFileValue/xml-body/passWord"/><br>
age:<x:out select="$xmlFileValue/xml-body/age"/><br>
读取 XML 文件并解析后的变量 xmlFileValue 将加上“ $ ”作为 XPath 表达式的开头, select 中的表达式将从 xml-body 根元素下的各个子元素中取得实体内容,最后将结果显示在页面上。根据“ SampleXml.xml ”文件的内容,将显示。
name:RW
passWord:123456
age:28
9.4.3 用于保存XML内容的<x:set>标签
<x:set> 标签允许将某个源 XML 中元素的实体内容或属性,保存到一个变量中去,它的实现也依靠 XPath 技术。它的属性和描述如表 9.14 所示:
表9.14 <x:set>标签属性和说明
属性
描述
select
XPath表达式
var
保存结果的变量名
scope
变量的作用范围(可选)
<x:set> 标签的 var 保存的变量由 XPath 的结果决定该变量的类型,下面看一个示例。
<c:import var="xmlFile" url="http://localhost:8080/booksamplejstl/SampleXml.xml"/>
<x:parse var="xmlFileValue" doc="${xmlFile}"/>
<x:set select="$xmlFileValue/xml-body/name" var="thisName"/>
这里将保存 XML name 元素内容到变量“ thisName ”中。
9.4.4 用于判断的<x:if>标签
<x:if> 标签允许由 XPath boolean() 函数得到的判断结果,来判断是否显示其标签所包含的内容。 <x:if> 标签的属性与 <x:set> 标签相同,但是 var 的结果只能是 boolean 类型。
9.4.5 用于复杂判断的<x:choose><x:when><x:otherwise>标签
这组标签将一起使用,来提供“ if elseif ”语句的功能。
<x:choose> 标签没有属性,可以被认为是父标签, <x:when> <x:otherwise> 将作为其子标签来使用。
<x:when> 标签等价于“ if ”语句,它包含一个 select 属性,该属性为 XPath 判断表达式。
<x: otherwise> 标签没有属性,它等价于“ else 语句
9.4.6 用于对XML元素循环的 <x:forEach>标签
<x:forEach> 为对 XML 文件中同一名称元素的循环控制标签。它的属性和描述如表 9.15 所示:
表9.15 <x:set>标签属性和说明
属性
描述
select
XPath表达式,结果是一个集合,将对该集合进行循环(可选)
begin
开始条件(可选)
end
结束条件(可选)
step
循环的 步长 ,默认为1(可选)
var
做循环的对象变量名,表示XPath 表达式 结果 集合 中的一个对象(可选)
varStatus
显示循环状态的变量(可选)
下面看一个示例。
<x:forEach select="$xmlFileValue/xml-body/books/book" var="book">
${book}
</x:forEach>
该示例将使用循环读取 XML 中多个同存于 books 元素下的 book 子元素。
9.4.7 格式化XML显示数据的<x:transform>标签
<x:transform> 标签允许使用 XSLT (转换 XML 格式的语言)为页面的显示数据做格式化的处理。它的属性和描述如表 9.16 所示:
表9.16 <x:transform>标签属性和说明
属性
描述
doc
源XML的内容,该属性的内容应该为String、java.io.Reader、javax.xml.transform.Source、org.w3c.dom.Document的实例,或者从<x:parse>、<x:set>两个标签得到。可以用xml属性来替代,但是不被推荐(可选)
xslt
源XSLT的内容,该属性的内容应该为String、java.io.Reader、javax.xml.transform.Source的实例(可选)
docSystemId
定义一个URI,该URI将被使用到XML文件中以接入其他资源文件。可以用xml SystemId属性来替代,但是不被推荐(可选)
xsltSystemId
定义一个URI,该URI将被使用到XSLT文件中以接入其他资源文件(可选)
var
将格式化后的XML文件保存在该属性所指定的变量中,保存的变量为org.w3c.dom.Document接口类型(可选)
scope
变量的作用范围(可选)
result
保存转化结果的变量,保存的变量为javax.xml.transform.Result类型的 实例 (可选)
下面看一个示例:
<c:import var="xmlFile" url="http://localhost:8080/booksamplejstl/SampleXml.xml" />
<c:set var="xsltdoc">
         <?xml version="1.0"?>
         <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
                   <xsl:template match="/">
                            <xsl:apply-templates />
                   </xsl:template>
                   <xsl:template match="xml-body">
                            <html>
                                     <head></head>
                                     <body marginheight="0" marginwidth="0" topmargin="0" leftmargin="0">
                                               <h2>
                                                        UserName:
                                                        <xsl:value-of select="name" />
                                               </h2>
                                               <h2>
                                                        PassWord:
                                                        <xsl:value-of select="passWord" />
                                               </h2>
                                               <h2>
                                                        age:
                                                        <xsl:value-of select="age" />
                                               </h2>
                                     </body>
                            </html>
                   </xsl:template>
         </xsl:stylesheet>
</c:set>
<x:transform xslt="${xsltdoc}" doc="${xmlFile}" />
这个 示例 XML 文件保存的数据信息利用 <c:import> 保存在“ xmlFile ”中,然后使用 <c:set> 标签保存一个 XSLT 的源到“ xsltdoc ”,最后通过 <x:transform> 格式化 XML 文件的数据显示在 页面 上。

9.4.8 用于参数传递的<x:param>标签
<x:param> 标签用于在格式化 XML 时传递所需要的参数。它的属性和描述与 <c:param> 标签相同,这里不再赘述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值