• XML和JSP交互技术_xml

    XML和JSP交互技术_xml

    XML和JSP都是近两年才出现的技术,目前已经成为了很多程序员的热点话题。XML(可扩展的标记语言)是用来定义文档标记语言的框架,主要用来存储和发送数据信息,以便各种基于WEB的应用之间能更方便的交换数据。而Jsp是服务器端程序动态设计语言,可以用来设计服务器端各种程序如B2B、B2C等各种系统,由于其面向对象、编译执行、健壮等特性,也得到了越来越多的应用。   一个很实用的技术就是如何将XML和JSP结合起来,所幸的是我们不用去写底支持层东西了,因为很多厂商如SUN、IBM等都发布了自己的支持XML的API,其中SUN公司提供了一个支持在Java下使用XML的API-JAXP(JAVATM API for XML Processing Optional Package),这部分API提供了基本的读写、操作XML文档的功能,通过它我们可以很方便的将XML集成到Java应用程序中来。   目前JAXP的版本是1.1,除了基本XML支持外还支持SAX 2.0 、DOM 2和XSL技术。SUN公司提供的JAXP可以在SUN公司的主页http://java.sun.com/xml 下载。    一、 JAXP的安装   1、安装前请确认您用的是JDK 1.1.8 以上版本的Java环境。   2、在http://java.sun.com/xml 下载JAXP1.1的zip版本,解压到硬盘中,假定解压目录为#JAXP11,解压后发现有三个jar文件jaxp.jar crimson.jar xalan.jar,这就是JAXP的核心了。   3、修改系统的CLASSPATH变量,在Windows平台下添加这样一行:    #JAXP11/jaxp.jar; #JAXP11/crimson.jar; #JAXP11/xalan.jar    在Unix/Linux系统下添加下面一行:    #JAXP11/jaxp.jar: #JAXP11/crimson.jar: #JAXP11/xalan.jar alan.jar  如果你使用的是Java2的话,有一种更简单的方法,将上面的三个文件直接拷贝到JDK的Lib扩展目录中去,如#JAVA_HOME/jre/lib/ext(#JAVA_HOME代表JDK目录),这样就不用修改CLASSPATH了。   4、好了,安装完成了,下一步就是编写程序然后运行了。   二、 简单的XML例子   XML (EXtensible Markup Language )是一种类似HTML的语言,和HTML不同,XML主要用来描述结构化数据,通过XML格式我们可以很方便的在各种应用程序之间交换数据,而这些都是传统技术需要花费很大精力才能做到的。   让我们来看一个简单的XML文档例子,这个例子保存了部分个人档案,请将它保存为personal.xml文件,因为后面我们的Jsp文件还会调用它中间的数据。       <个人档案>   <姓名>刘玉锋    <性别>男    <年龄>24    coolknight@263.net    <个人主页>http://www.21jsp.com    <介绍>欢迎大家访问我的主页!     是不是很类似于HTML文件,如HTML中的元素"你好"等等,因为XML和HTML一样都是标准SGML的子集合,所以有类似之处。但也有很多不同之处需要注意,比如XML文件必须有成对地标记而且大小写敏感,而这些在HTML中都是默认允许的。   第一行是必须的XML声明, 我们可以看到声明是在之间的,中间可以定义部分属性,version="1.0"表示文档将使用XML1.0的规范,encoding="gb2312"表示采用中文字符集,这样我们在下面对于数据就可以使用中文了。   接着就是<个人档案>标记了,这是XML文件中的根元素,也是不可缺少的,而且必须有一个对应的结束标记,在开始和结束标记之间我们就可以定义自己的数据描述了。   嵌套在<个人档案>标记如"<姓名>刘玉锋"就是具体的数据描述了,同根元素一样必须是成对的标记,在标记中间可以是标记对应具体的数值。这种表示方法有点类似于数据库中的记录了,字段名字为"姓名"、"性别"等,上面的XML文件就相当于一个只有一条记录的表"个人档案"。当然在XML文件中可以进行多层嵌套,但这就不在本文的讨论范围了。   当然,这里只是一个特别简单能代表XML的例子,XML的相关内容特别多,如果想更多了解XML的话建议还是看相关的书籍。 三、JSP和XML交互   前面已经说过了,Jsp通过SUN公司的API-JAXP可以实现和XML的交互,那么具体实现主要有两种方法,一种是采用DOM2 API,另外一种是采用SAX2 API。   在这里我们主要讨论JAXP中的SAX(Simple API for XML Parsing)技术,DOM2技术可以看SUN公司相关的文档。   1)关于SAX模型   SAX模型是一种处理XML文件的方法,它是事件驱动的,有些类似于AWT中的事件驱动机制,通过事件驱动来识别XML文档的内容。在API中关于SAX的主要有下面的几个包:   oorg.xml.sax   oorg.xml.sax.helpers   oorg.xml.sax.ext 在前台的Java程序或者是Jsp程序中通过调用这几个包中的API就可以很好地实现Java和XML的交互。   2)关于HandlerBase接口   我们知道在AWT中一般是通过实施ActionListener等接口实现事件的处理的,同样的在SAX中SUN也提供了一个类似的接口HandlerBase来处理XML解析的功能,通过将HandlerBase和XML文件关联可以很好的来处理XML文件。   在实施接口中我们主要重载三个HandlerBase的方法startElement(String tag, AttributeList attrs)、characters(char[] ch, int start, int length)、endElement(String name)。   startElement()在读取一行XML数据的开始标记时候触发,子类必须覆盖这个方法,这样就可以在处理XML节点前先进行自己的处理(比如开始读取或者写入XML文件中的节点时候)。   public void startElement (String name, AttributeList attributes)    throws SAXException    {     // no op     } 参数name代表XML节点名字,attributes代表默认或者特殊的属性,这个方法抛出一个违例org.xml.sax.SAXException。   characters()方法主要用来处理和之间具体的数据,在处理节点数据时候触发,我们可以覆盖这个方法来进行数据操作的处理,可以添加代码读取节点数据值或者是写入节点数据值。   public void characters (char ch[], int start, int length)    throws SAXException    {     // no op     } 参数ch[]代表一个字符数组,start代表字符数组的开始位置,length代表要取的字符数组中ch[]中的元素个数,同样的这个方法抛出一个违例org.xml.sax.SAXException。   endElement()方法在处理节点元素结束的时候触发,也就是碰到标记的时候,我们可以覆盖这个方法来进行数据的收尾工作,比如将节点数据写入到文件中。   public void endElement (String name)    throws SAXException     {      // no op     } 参数name代表XML节点名字,这个方法抛出一个违例org.xml.sax.SAXException   从上面我们也可以看出,三个方法在XML事件处理中的顺序依次为:    startElement()àcharacters()àendElement(String name) 也许还不好理解,不要紧在下面我们将会写一个类myHandler类实现HandlerBase接口,并且覆盖这三个主要的方法来实现我们的XML文件读取操作。   3)关于哈希表    由于程序用到了哈希表,所以在这里先简单的介绍一下哈希表的基本语法以便大家能更好的理解下面的程序。   哈希表HashTable是从Dictionary派生出来的,里面具有一系列的关键字和数值,一个关键字对应一个数值,识别主要是通过对象的哈希代码hashCode识别。   我们程序中用到的方法如下:   put(Object key,Object value)添加一对关键字/数值到哈希表中   get(Object key)根据关键字得到它的值   keys()取得所有关键字并返回一个集合Enumeration 此外,哈希表还具有其他很多有用的方法如长度size()、是否为空empty()、是否重复containsKey()等等,限于篇幅在这里就不进行介绍了。

  • XML卷之实战锦囊(5):结构树图_xml

    XML卷之实战锦囊(5):结构树图_xml

    动机: 最初想起做二叉树是因为需要做一个公司结构图。 以前的做法都是直接用图象软件画出来一个图片。很好看,但每次有变动后都需要重新画一个新的。 另一方面,网页上对线条的显示、布局相当局限。根据动态生成的数据进行排版、定位都相当困难, 而且在美观上也差强人意。 做了各种尝试以后,决定用XML+XSL作数据运算; 用VML来美化线条,用JAVASCRIPT来给对象定位。

  • XML与HTML的结合(下)_xml

    XML与HTML的结合(下)_xml

    一般情况下,我们从数据库中查询得到的结果集可能很大,所以从服务器返回到客户端时,数据会被分成若干个页面分别进行传递。此时,利用TABLE元素中的DATAPAGESIZE属性可以指定每个页面包含记录集条目的个数。

  • 使用javascript+xml实现分页_xml

    使用javascript+xml实现分页_xml

    基于web的技术中,分页是一个老的不能再老的,但大家津津乐道的问题,随着xml技术的日渐应用,把xml应用到分页当中,也是一种可能,当然网上的教程很多,当我都是看得稀里糊涂,索性自己写一个,与大家分享、指正。 共有两个文件tmh.htm & tt.xml 源代码如下: tmh.htm ___________________________________________________ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author" CONTENT=""> <META NAME="Keywords" CONTENT=""> <META NAME="Description" CONTENT=""> <link rel="stylesheet" href="../website.css" type="text/css"> </HEAD> <BODY> <script language="javascript"> //****************变量相关定义************** //*       author:海仔        * //*     Email:rautinee@21cn.com   * //*本程序可自由传播使用,但请务必保留此信息  * //**************************************** var pagenum=4; //每页显示几条信息 var page=0 ; var contpage ; var BodyText=""; var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); var mode="member"; var toolBar; xmlDoc.async="false" xmlDoc.load("tt.xml") //***************这个地方是你根据实际取得的字段名称来改了 header="<TABLE border=1><tr><td>姓名</td><td>图标</td><td>IP地址</td><td>email</td><td></td><td>日期</td><td></td><td></td></tr>"; //检索的记录数 maxNum = xmlDoc.getElementsByTagName(mode).length   //每条记录的列数   column=xmlDoc.getElementsByTagName(mode).item(0).childNodes   //每条记录的列数   colNum=column.length   //页数   pagesNumber=Math.ceil(maxNum/pagenum)-1;   pagesNumber2=Math.ceil(maxNum/pagenum); //上一个页面 function UpPage(page) {   thePage="前一页";   if(page+1>1) thePage="<A HREF='#' >前一页</A>";   return thePage; } function NextPage(page) {   thePage="后一页";   if(page<pagesNumber) thePage="<A HREF='#' >后一页</A>";   return thePage; } function UpPageGo(){ if(page>0) page--;   getContent();   BodyText=""; } //当前的页数 function currentPage() {   var cp;   cp="当前是第 "+(page+1)+" 页";   return cp; } //总共的页数 function allPage() {   var ap;   ap='总共 '+(pagesNumber+1)+' 页';   return ap } function NextPageGo() { if (page<pagesNumber) page++;   getContent();   BodyText=""; } //显示分页状态栏 function pageBar(page) {   var pb;   pb=UpPage(page)+" "+NextPage(page)+" "+currentPage()+" "+allPage()+selectPage();   return pb; } function changePage(tpage) {     page=tpage   if(page>=0) page--;   if (page<pagesNumber) page++;   getContent();   BodyText=""; } function selectPage() {   var sp;   sp="<select name='hehe' >";   //sp="<select name='hehe' >";   sp=sp+"<option value=''></option>";   for (t=0;t<=pagesNumber;t++)   {     sp=sp+"<option value='"+t+"'>"+(t+1)+"</option>";   }   sp=sp+"</select>"   return sp; } function getContent() {     if (!page) page=0;     n=page*pagenum;     endNum=(page+1)*pagenum;     if (endNum>maxNum) endNum=maxNum;     BodyText=header+BodyText;     for (;n<endNum;n++)     {              BodyText=BodyText+"<TR>";         for (m=0;m<=colNum-1;m++)         {             mName=column.item(m).tagName;           BodyText=BodyText+("<TD>"+xmlDoc.getElementsByTagName(mName).item(n).text+"</TD>");         }       BodyText=BodyText+"</TR>"       mm="";       }       showhtml.innerHTML=BodyText+"</table>"+pageBar(page); BodyText="" } </script> <div id="showhtml"></div> <script> if (maxNum==0)     {       document.write("没有检索到合适的人才信息")     }   else     {       getContent()     } </script> </BODY> </HTML> //下面是tt.xml的代码 <?xml version="1.0" encoding="GB2312"?> <rautinee> <member id='1'> <name>海仔</name> <loginName>rautinee</loginName> <email>rautinee@btamail.net.cn</email></member> <member id='2'> <name>刚强</name> <loginName>hehe</loginName> <email>rautinee@chinamanagers.com</email></member> <member id='3'> <name>金华刚</name> <loginName>nature_it</loginName> <email>rautinee_sea@hotmail.com</email></member> <member id='4'> <name>的简强</name> <loginName>tank</loginName> <email>tank@163.com</email></member> <member id='7'> <name>合资</name> <loginName>kaka</loginName> <email>kaka@eyou.com</email></member> <member id='6'> <name>加个人</name> <loginName>apple</loginName> <email>apple@163.com</email></member> <member id='8'> <name>null</name> <loginName>sunny</loginName> <email>rautinee@eyou.com</email></member> <member id='10'> <name>宝贝</name> <loginName>index</loginName> <email>rautinee@21cn.com</email></member> <member id='12'> <name>null</name> <loginName>login</loginName> <email>webmaster@chinamanagers.com</email></member> <member id='13'> <name>jiang</name> <loginName>123</loginName> <email>japing@chianmanagers.com</email></member> <member id='14'> <name>null</name> <loginName>world</loginName> <email>rautinee@21cn.com</email></member> <member id='15'> <name>null</name> <loginName>swallow</loginName> <email>swallow@chinamanagers.com</email></member> <member id='16'> <name>魏格</name> <loginName>hotmail</loginName> <email>rautinee_sea@hotmail.com</email></member> <member id='17'> <name>null</name> <loginName>wrong</loginName> <email>wrong@chinamanagers.com</email></member> <member id='18'> <name>null</name> <loginName>leah</loginName> <email>leah@chinamanagers.com</email></member> <member id='19'> <name>null</name> <loginName>ttth</loginName> <email>rautinee@21cn.com</email></member> </rautinee> 目前好像是只支持>IE5.0 如果你有什么好的方法和改进,请来信通知我,谢谢。 ok ,just enjoy it ,and good luck

  • 用XSLT生成网页菜单_xml

    用XSLT生成网页菜单_xml

    XML (eXtensible Markup Language,扩展标记语言) 是一种数据格式[1],它的特点是人们能非常容易读懂其中的含义,例如上面所示的菜单结构就一目了然。不仅仅是人能容易看懂 XML,计算机也能非常容易读懂其中的含义,这句话的含义是处理XML的程序已经非常普及,Windows下有MSXML[5],Java下有JAXP,即几乎所有平台上都有了XML处理程序[7][8]。并且处理XML有标准的办法,比如本文将用到的 XSLT (eXtensible Stylesheet Language Transformation, 扩展样式语言转换)就是将XML格式的数据转化到另外一种格式的标准方法[2][3][4]。 如果我们能用 XSLT 转化上述菜单的XML到网页上的菜单,那么制作网页菜单就比较简单了。因为编辑菜单的XML非常容易,普通的文本编辑器就可以了。 实现网页菜单的DHTML和JavaScript程序常常被制作成程序库的形式,称为网页菜单引擎。这些引擎都提供调用的接口,使得我们能够定制(customize)我们自己的菜单,但问题是定制菜单需要修改这些程序,比较麻烦也容易出错。 我们要解决的就是用XSLT根据菜单的XML,自动生成调用接口。 先让我们看看有哪些现成可用的网页菜单引擎。   三、 网页菜单引擎   因特网上有很多JavaScript资源网站,dynamicdrive.com 就是其中很优秀的一个。那里有许多很好的JavaScript程序可供下载使用,尤其是它的"Menus and Navigation Systems"分类中收集了不少网页菜单引擎。经过比较,我们选择使用"HV menu" (http://www.dynamicdrive.com/dynamicindex1/hvmenu/index.htm)。 HV menu 的优点是既可以做水平排列的菜单,又可以做垂直排列的菜单;可以包含多层子菜单结构;可以自定义菜单的字体、颜色、对齐方式;以及支持IE4+, NS4, NS6+等多种浏览器。 "HV menu"的程序库为 menu_com.js 文件。它的接口规范是: MenuX=new Array(Text to show, Link, background image (optional), number of sub elements, height, width);   因此在网页中使用这个菜单引擎的 JavaScript 函数调用为: <script> Menu1=new Array('论坛首页','http://www.delphibbs.com', '', 4, 20, 120); Menu2=new Array('论坛分类','', '', 8, 20, 120); Menu3=new Array('我的论坛','', '', 5, 20, 120); Menu4=new Array('富翁用户','', '', 3, 20, 120); Menu5=new Array('大富翁系列','', '', 3, 20, 120); Menu6=new Array('帮助','', '', 4, 20, 120); Menu6_1=new Array('使用说明','tutorial.htm', '', 0, 20, 120); Menu6_2=new Array('常见问题','faq.htm', '', 0, 20, 120); Menu6_3=new Array('关于我们','aboutus.htm', '', 0, 20, 120); Menu6_4=new Array('联系我们','contactus.htm', '', 0, 20, 120); </script>   下面我们将用XSLT把菜单的XML转换为上述函数调用。

更多...

加载中...