|
目前大多数使用j2ee开发B/S结构的方案,在显示层大多使用的是jsp,具体点就就是java代码内嵌html页面的实现!对于这里的jsp,他的主要功能还是为了在页面显示后台生成的有用数据,这样做最大的问题就是页面和代码的混乱,致使美工无从下手,程序员维护起来也是苦不堪言,做jsp的兄弟一定很清楚!
目前解决此方法的手段最主要就是靠jsp的taglibs(jsp扩展标记库),它的主要功能就是把jsp中的java代码结构条理的放到指定的java类中去解决掉,这样非常明显的减少了java代码在jsp页面中的使用量,就像现在比较流行的“减少代码量,增加脚本配置”这个模式,最明显的例子就是struts的自定义标记库,例如使用struts-html.tld文件中给出的很多已经实现好的方法,可以很好的解决jsp中经常使用到的一些功能,在jsp中也是简简单单的在需要调用的地方加入相应的taglibs调用语句就可以了!这样做是减轻了jsp中的混乱性,但是并没有真正实现页面和程序的分离,程序员不仅要有高超的结构组织技能,而且同样还要面对代码和html标记混杂的程序!
目前xml的出现提供了新的有效的方式,在这里xml就是一种有结构的存放数据的数据源,就像是一个中间联系人一样,xsl也是xml的一种特定实现技术,它的实现就是让html融入自己的机体内,然后把html有按结构合理的分开,每一部分实现特定的功能,每个部分可以互相的调用,对于html中需要从后台得到数据就可以从xml取出,因为xsl本质就是xml,所以它才可以按照xml的结构从xml中取出数据!
xsl文件中的示例
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!--开始必须的标志,声明它是xsl>
<xsl:template match="/"> <!--这里主要定义了此处需要从xml中的跟节点开始取值-->
<html>
<head>
<title>test</title>
</head>
<body>
<xsl:apply-templates select="root/node"/> <!--这里调用了底下的template,相当于函数调用一样,它们是通过xml结构的匹配来调用其他模板的 -->
</body>
</xsl:template>
<xsl:template match="root/node">
<input type="text" name="ID" value="{ID}" /> <!--这里就把ID节点里面存的值取了出来,在页面显示中也就是输入框中有了默认的一个值 -->
</xsl:template>
</xsl:stylesheet>
xml文件示例
<root>
<node>
<ID>001</ID> <!--页面的输入框就会显示001>
</node>
</root>
怎么在web中显示这些呢,需要一个xsl解析器,一般比较流行的是xalan,它已经集成在了jboss中,可以使用sun制定的JAXP通用接口来实现xml和xsl的结合,在web方式使用中xsl是以一个文件的性质存在,而xml是通过taglibs中定义的具体java类在内存中生成一颗xml结构树来实现。使用的方式是jsp取出具体的xsl文件,放到taglibs中通过JAXP接口把内存中的xml一起解析出来,形成jsp流,让jsp文件显示在页面,这里的jsp只是一句话而已
<%@page contentType="text/html; charset=gb2312"%>
<%@ taglib uri="/WEB-INF/coal.tld" prefix="testXsl" %>
<coal:testXsl xslUri="test.xsl" xslCache="true"/>
所有的操作都由taglibs和xsl还解决了
taglibs中调用的java类输出具体的xml结构,可以参考jdom,它就是专门提供java接口来输入xml格式的Document对象!使用很方便,可以去它的网站看看!
www.jdom.org
具体xml和xsl怎么转换成jsp流可以参考使用下面的方法
TransformerFactory tf = TransformerFactory.newInstance();//生成解析器的工厂类实例
URL url = context.getResource(xslUri);//把xsl的地址转换成URL对象
templates = tf.newTemplates(new StreamSource(url.toExternalForm()));
Transformer transformer = templates.newTransformer();//生成具有xsl指向,可以转换的Transformer对象,
Document doc = 解析过来的XML结构的Document对象
JDOMSource xmlSource = new JDOMSource(doc) //taglibs生成的Document对象放入解析源
JspWriter jw = pageContext.getOut(); //从jsp中得到jsp流对象,
StreamResult xmlResult = new StreamResult(new BufferedWriter(jw));//生成解析的结果对象,主要是把结果给jspWriter
transformer.transform(xmlSource, xmlResult); //进行解析,边解析,边输出jsp流,那么jsp流就自动显示在了页面!
具体怎么做需要兄弟们自己动手了,可以参考ibm的一些文章,不过首先要搞清楚结构,一般servlet使用struts架构比较合适,建议之谈!
这样做就可以让xsl做数据显示位置的工作,taglibs具体做这么取数据的工作,程序员主要维护java代码和配置教本,美工可以发挥自己的想像,xsl+xml程序员也可以轻松的对程序和页面进行维护!
这些只是我的一点拙见,希望大家能给出更好的方法,解决当前的技术问题,不过在国外xsl+xml+stuts+。。。已经很流行了,呵呵,希望国内早些走到这一部! |
|