专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » 网站构架:JSP+XML构架网站的实例 »正文

网站构架:JSP+XML构架网站的实例

来源: 发布时间:星期四, 2009年2月12日 浏览:131次 评论:0


XML(可扩展标记语言)看起来可能像某种W3C标准??现在没有什么实际影响即使以后能派上用场也是很久以后但实际上它现在已经得到了应用所以不要等到XML已被加进了你最喜爱HTML编辑器中才开始使用它它现在就可以解决各种内部问题和B2B系统问题

在Sparks.com我们使用XML来标准化从Java对象到HTML数据显示等区别系统的间数据表示

特别需要指出我们发现只要以非常基本XML结构来实现标准化就可以更容易地共享和操作数据在这过程中我们发现了使用XML很多有效思路方法下面详细介绍我们现在应用情况

标准化
在使用XML的前建立和你要使用信息区别XML数据格式

生成动态XML
从数据库中生成HTML并不新鲜但生成XML却很新鲜这里我们介绍具体生成步骤

用XSL作为模板语言
XSL(可扩展样式表语言)是定义XML数据显示格式好思路方法如果写成几个静态模板会更有效

生成HTML
XML加上XSL就等于HTML这听起来似乎不对但用户所见我们HTML页面其实就是XML和XSL共同产生效果


、标准化

XML能力来自于它灵活性但不幸它有时太灵活了以至于你会面对个空白页面发愁该如何解决问题

在任何XML项目中步工作都是创建标准数据格式为此你要作出以下决定:

&&&
确定数据:
没有标准XML格式开发者可以自由地开发自己格式然而如果你格式只能被个应用识别那么你只能运行这个来使用该格式如果还有其他也能读懂你XML格式那显然会更有帮助如果某个XML格式被修
则使用它系统可能也需要被修改所以你应该建立尽可能完整格式大多数系统忽略它们无法识别标签所以改变个XML格式最安全思路方法是添加标签而不是修改标签

单击此处查看XML数据格式例子

在Sparks.com我们查看了区别产品展示需要所有产品数据尽管并不是所有页面都使用全部数据但我们还是由此开发出适用于所有数据非常完整XML数据格式例如我们产品明细信息页面显示数据要比产品浏览页面多然而我们在这两种情况下仍然使用相同数据格式每个页面XSL模板都只使用它所需要字段

是否使用DTD
在Sparks.com我们使用组织良好XML而不使用仅仅是正确XML前者不需要DTDDTD在用户点击和看到页面的间加入了个处理层我们发现这层需要太多处理当然在以XML格式和其他公司通信时使用DTD还是很不错DTD能在发送和接受时能保证数据结构正确

选择解析引擎
现在可以使用解析引擎有好几个选择哪个几乎完全取决于你应用需要如果你决定使用DTD那么这个解析引擎必须能使你XML被DTD验证你可以将验证另放到个进程中但那样会影响性能

SAX和DOM是两个基本解析模型SAX基于事件所以在XML被解析时事件被发送给引擎接下来事件和输出文件同步DOM解析引擎为动态XML数据和XSL样式表建立层次树状结构通过随机访问DOM树可以提供XML数据就象由XSL样式表来决定SAX模型上争论主要集中于对DOM结构内存降低过度和加快XSL样式表解析时间缩短方面

然而我们发现使用SAX很多系统并没有充分发挥它能力这些系统用它来建立DOM结构并通过DOM结构来发送事件用这种思路方法在任何XML处理的前必须从样式表中建立DOM所以性能会下降

2、生成动态XML

旦建立了XML格式我们需要种能够将其从数据库中动态移植思路方法

生成XML文档相对来说比较简单它只需要个可以处理系统我们建立了个使用Java Servlet、Enterprise JavaBean server、JDBC和RDBMS(关系型数据库管理系统)系统

&&&&
(有关XSL应用其他信息请参阅用XSL作为模板语言)

生成XML例子
在Java中创建XML文档真正代码可以分成几个思路方法和类

启动XML生成过程代码放在EJB思路方法里例子会立即创建个StringBuffer以便存储生成XML

StringBuffer xml = StringBuffer;
xml.append(XmlUtils.beginDocument("/browse_find/browse.xsl", "browse", request));
xml.append(product.toXml);
xml.append(XmlUtils.endDocument("browse");
out.pr(xml.toString);


后面 3个xml.append变元本身就是对其他思路方法
产生文件头
个附加思路方法XmlUtils类来产生XML文件头我们Java Servlet中代码如下:

public String beginDocument(String stylesheet, String page)
{
StringBuffer xml = StringBuffer;
xml.append("<?xml version="1.0"?> ")
.append("<?xml-stylesheet href="")
.append(stylesheet).append(""")
.append(" type ="text/xsl"?> ");
xml.append("<").append(page).append("> ");
xml.toString;
}

这段代码生成了XML文件头<?xml>标签把本文件定义为支持1.0版本XML文件第 2行代码指向用以显示数据正确样式表位置最后包括进去是项级标签(本例子中为<browse>)在文件末尾只有<browse>标签需要被关闭

<?xml version="1.0"?> <?xml-stylesheet href="/browse_find/browse.xsl" type="text/xsl"?> <browse>

填入产品信息
完成了文件头后控制思路方法会Java对象来产生它XML本例中是product对象product对象使用两个思路方法来产生它XML表示个思路方法toXML通过产生<product>和</product>标签来建立product节点然后它会ernalXML这样就能提供产品XML所需内容ernalXML系列StringBuffer.appendStringBuffer也被转换成串并返回给控制思路方法


public String toXml
{
StringBuffer xml = StringBuffer("<product> ");
xml.append(ernalXml);
xml.append("</product> ");
xml.toString;
}

public String ernalXml
{
StringBuffer xml =
StringBuffer(" ")
.append(productType).append(" ");
xml.append(" ").append(idValue.trim)
.append(" ");
xml.append(" ").append(idName.trim)
.append(" ");
xml.append(" ").append(page.trim)
.append(" ");
??
xml.append(" ").append(amount).append(" ");
xml.append(" ").append(vendor).append(" ");
xml.append(" ");
xml.append(" ").append(pubDesc).append(" ");
xml.append(" ").append(venDesc).append(" ";
??
xml.toString;
}


关闭文件
最后XMLUtils.endDocument思路方法被这个关闭XML标签(本例中为)并最终完成架构好XML文件来自控制思路方法整个StringBuffer也转换成并返回给处理最初HTTP请求servlet

3、用XSL作为模板语言

为了得到HTML输出我们把生成XML文件和控制XML数据如何表示XSL模板相结合我们XSL模板由精心组织XSL和HTML标签组成

开始建模板
我们XSL模板开始部分和下面这段代码类似行代码为必需代码将本文件定义为XSL样式表xmlns:xsl=属性引用本文件所使用XML名称空间而version=属性则定义名称空间版本号在文件末尾我们关闭标签

由<xsl:template>开始第 2行代码确定了XSL模板模式Match属性是必需在这里指向XML标签<basketPage>在我们系统里<basketPage>标签里包含<product> 标签这使得XSL模板可以访问嵌在<product>标签内产品信息我们又次必须在文件末尾关闭<xsl:template>标签

接下来我们来看看组织良好HTML由于它将被XML解析引擎处理所以必须符合组织良好XML所有规则从本质上来讲这意味着所有开始标签必须有对应结束标签例如通常不被结束<P>标签必须用</P>关闭


<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="basketPage">
<html>
<head>
<title>Shopping Bag / Adjust Quantity</title>
</head>
<body bgcolor="


</xsl:template>
</xsl:stylesheet>


在模板主体内有很多XSL标签被用于为数据表示提供逻辑下面解释两个常用标签
Choose
<xsl:choose>标签类似于传统编程语言中-then-结构开始部分在XSL中choose标签表示在代码进入部分中赋值将触发动作发生拥有赋值属性<xsl:when>标签跟在choose标签后面如果赋值是正确位于<xsl:when>开始和结束标签的间内容将被使用如果赋值就使用<xsl:otherwise>开始和结束标签的间内容整个部分用</xsl:choose>来结束

在这个例子里when标签会为quantity标签检查XML如果quantity标签里含有值为真error属性quantity标签将会显示列在下面表格单元如果属性值不为真XSL将会显示otherwise标签间内容在下面例子里如果error属性不真则什么都不会被显示

<xsl:choose>
<xsl:when test="quantity[@error=\'true\']">
<td bgcolor="src=\"http://www./Files/BeyondPic/2007-6/8/076813492121510.g\""/></td>
<td valign="top" bgcolor="<font face="Verdana, Arial" size="1" color="<b>*Not enough in stock. Your quantity was adjusted accordingly.</b></font>
</td>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>


For-each
<xsl:for-each>标签可以用来对相似XML数据多种情况应用同个样式表对于我们来说可以从数据库中取出系列产品信息并在Web页上进行统格式化这里有个例子:
<xsl:for-each select="package">
<xsl:apply-templates select="product"/>
</xsl:for-each>


for-each 循环在遇到标签时开始这个循环将在遇到标签时结束旦这个循环运行每次标签出现时都会应用这个模板

4、生成HTML

将来时刻浏览器将会集成XML解析引擎到那时你可以直接向浏览器发送XML和XSL文件而浏览器则根据样式表中列出规则显示XML数据不过在此的前开发者们将不得不在他们服务器端系统里创建解析功能

在Sparks.com我们已经在Java servlet里集成了个XML解析器这个解析器使用种称为XSLT (XSL Transformation)机制按XSL标签介绍说明向XSL模板中添加XML数据

当我们Java servlet处理HTTP请求时servlet检索动态生成XML然后XML被传给解析引擎根据XML文件中指令解析引擎查找适当XSL样式表解析器通过DOM结构创建HTML文件然后这个文件再传送给发出HTTP请求用户

如果你选择使用SAX模型解析器会通读XML源为每个XML标签创建个事件事件和XML数据对应并最终按XSL标签向样式表中插入数据



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: