LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2055|回复: 12

何不试试使用xsl+jsp+xml+taglibs来实现web显示层!

[复制链接]
发表于 2004-7-30 20:04:49 | 显示全部楼层 |阅读模式
目前大多数使用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+。。。已经很流行了,呵呵,希望国内早些走到这一部!
发表于 2004-7-30 20:35:34 | 显示全部楼层
说得容易。。
这种能和struts结合吗???jsp taglib本来就是xml一种表现形式。。。
再者用xml,xsl转换效率太低。。。目前的转换器,dom,sax都不能进行高效的转换。。。
 楼主| 发表于 2004-8-1 13:23:18 | 显示全部楼层
我想你了解的还是少了,dom,sax主要的作用是java和xml之间的转换,xsl和xml之间使用的是xalan,strus是否能结合?这在两年前,已经开始使用了,再者strus的使用和taglibs没有任何关系,taglibs属于mvc中的显示层,struts中的action,stuts自身的taglibs是不需要使用的!主要作用于控制层。struts调用jsp,jsp调用taglibs,taglibs生成xml,xml和xsl再被taglibs转换称jsp流作用于jsp!
发表于 2004-8-1 13:33:52 | 显示全部楼层
再者strus的使用和taglibs没有任何关系
=============================
struts的 ActionForm和页面form(struts taglib)进行数据绑定,,,如果没有这一功能,估计没有多少人会用struts....居然说没有关系。。。
发表于 2004-8-1 13:36:26 | 显示全部楼层
struts调用jsp,jsp调用taglibs,taglibs生成xml...
=================================
这是你编出来的吧。。。呵呵。。。
发表于 2004-8-1 13:42:52 | 显示全部楼层
你喜欢用xml这种形式来表示页面,,,可以好好去看下struts-ce,,,不要老在这里吹,,,要不提供个完整的例子,让我也学习一下。。。
发表于 2004-8-1 13:46:56 | 显示全部楼层
gentoo.org是用xml建站的

我觉得还不错。
 楼主| 发表于 2004-8-1 13:59:30 | 显示全部楼层
最初由 hantsy 发表
struts的 ActionForm和页面form(struts taglib)进行数据绑定,,,如果没有这一功能,估计没有多少人会用struts....居然说没有关系。。。

是谁告诉你ActionForm一定要和struts taglib绑定就是struts的本钱,struts的特点是实现了mvc这中设计模式,它其中一个优势就是你不需要使用它所有的功能,可以取出其中自己需要的东西,ActionForm的目的是从页面方便的提取数据,你知道吗,现在已经可以动态取出数据了,不需要再struts-conf里面定义过多的from-bean,如果你的工程中页面的数据不多,就算不用action-from,也是完全可以的,何谈没有actionFrom就不行的道理!
 楼主| 发表于 2004-8-1 14:01:41 | 显示全部楼层
最初由 hantsy 发表
你喜欢用xml这种形式来表示页面,,,可以好好去看下struts-ce,,,不要老在这里吹,,,要不提供个完整的例子,让我也学习一下。。。


我上面的例子是不全,只是给个借鉴,如果你想要知道最终怎么实现,就自己动手,如果有问题,我可以帮助!
发表于 2004-8-1 20:15:19 | 显示全部楼层
最初由 fangshun 发表
是谁告诉你ActionForm一定要和struts taglib绑定就是struts的本钱,struts的特点是实现了mvc这中设计模式,它其中一个优势就是你不需要使用它所有的功能,可以取出其中自己需要的东西,ActionForm的目的是从页面方便的提取数据,你知道吗,现在已经可以动态取出数据了,不需要再struts-conf里面定义过多的from-bean,如果你的工程中页面的数据不多,就算不用action-from,也是完全可以的,何谈没有actionFrom就不行的道理!

何谈没有actionFrom就不行的道理
===================================
我从来没有说过不行啊,,,
没有ActionForm,Validator也不能用了,ActionError,Message也不能很好结合。。。把这些去掉不用的话,,,struts和servlets比没有什么优势。。。
mvc是一种框架,struts只是它一种实现,servlet,jsp也很容易实现mvc...struts 完全是从servlet继承的。。。抛开struts的一些优点,为什么还要用它呢。。。用servlet效率更高。。。何况,用struts,还会受到它一些束缚。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表