大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> JSP专区 -> JSP与XML的结合

JSP与XML的结合

时间: 2021-07-31 作者:daque

综述:可扩充标明谈话(extensible markup language,xml)正被赶快的应用于技术界,它已动作与平台、谈话和和议无干的方法刻画和调换数据的普遍运用规范。xml和它的扶助典型可用来刻画数据的文书档案展现,刻画xml文书档案典型的控制,刻画xml文书档案和资源之间的链接,刻画xml文书档案的机动变换和方法化。  怎样开拓自设置标签库?  我运用javascript/" target="_blank">jsp和asp编制程序仍旧有一段颇长的功夫了,在两种效劳器端的编制程序办法中,我越来越感触javascript/" target="_blank">jsp的功效要宏大得多。不提其余,个中javascript/" target="_blank">jsp的标签库即是我采用javascript/" target="_blank">jsp动作首要选择效劳器端web运用开拓东西的因为。干什么?由于:保护和开拓的速率。在一个简单的效劳器页面中,你不妨搀和运用百般各别的剧本本领和东西。就?quot;混凝土"一律,这种搀和可令效劳器端的剧本变得宏大,而且让效劳器端的编制程序者安排出特殊精巧和动静的web页面。然而这种自在的搀和也有其缺陷,那即是保护起来特殊烦恼,更加是当名目渐渐变大时。因为最后的产物是经过一个保守的web安排者来保护的,所以会带来题目。更蹩脚的是,跟着代码的搀杂性减少,开拓的速率就会变慢,倒霉于开拓平淡和巨型的web运用,一旦开拓完,站点还要找及格的编制程序者来保护那些颇为搀杂的代码。好在,javascript/" target="_blank">jsp供给了一个很好处置的方法。标签库供给了一个大略的本领来创造一个可重用的代码块。一旦标签库安排好,它就不妨在很多名目中再次运用。更简单的是,与com和j2ee各别,你无需进修任何其它的本领就不妨创造一个标签库!只有你领会写javascript/" target="_blank">jsp,你就不妨创造一个标签库。标签库还不妨革新web运用的保护。这个是成绩于javascript/" target="_blank">jsp页面自设置标签的大略xml接口。如许,web安排者以至不妨做到无需领会任何javascript/" target="_blank">jsp的常识,就不妨创造javascript/" target="_blank">jsp的web运用。这个盛开式的web开拓对于共青团和少先队运作利害常灵验的。javascript/" target="_blank">jsp编制程序者不妨创造自设置的标签和后盾的代码模块,而web安排者不妨运用自设置的标签来创造web运用,而且将精神会合在web安排上。   1. 标签库的设置  javascript/" target="_blank">jsp标签库(也称自设置库)可看成是一套爆发鉴于xml剧本的本领,它经过javabeans来扶助。在观念上说,标签库利害常大略和不妨重用的代码结构。  实行xml/xsl变换的标签典型和html页面<%@ taglib uri="http://www.jspinsider.com/jspkit/jaxp" prefix="jaxp"%>c:/xml/example.xmlc:/xml/example.xsl

  在这个例子中,经过运用大略的标签来考察后盾更为宏大的代码,一个xml被承载,而且经过一个xsl文献来爆发一个截止,并发送给存户端,十足经过运用一个大略的标签挪用就做到了。  自设置标签为在javascript/" target="_blank">jsp名目中创造容易重用的代码翻开了一扇大门。你所须要的不过标签库和它的文书档案证明。   2. 标签的组件  固然标签库特殊容易运用,然而要创造一个里面的安排来扶助标签库是颇搀杂的,最少要比创造一个大略的javabean搀杂。这个搀杂是来自于标签库是由几局部形成的。然而,你只须要领会java和javascript/" target="_blank">jsp的常识就够了。一个大略的标签由底下的元素形成:  ⑴ javabeans:为特出到java与生具来的面向东西的长处,可重用的代码该当放到一个独力的代码容器中。那些javabeans并不是标签库的一局部。然而它是你的代码库用来实行关系工作的基础代码块。  ⑵ 标签处置:这是标签库的真实中心。一个标签处置器将援用它须要的任何资源(你的javabeans)和考察你的javascript/" target="_blank">jsp页面包车型的士十足消息(pagecontext东西)。javascript/" target="_blank">jsp页面也会将一切仍旧被树立的标签属性和javascript/" target="_blank">jsp页面上的标签体中的实质传递给标签处置器。在标签处置器处置结束后,它将发回输入到你的javascript/" target="_blank">jsp页面举行处置。  ⑶ 标签库的刻画(tld文献):这是一个大略的xml文献,它记载着标签处置器的属性、消息和场所。javascript/" target="_blank">jsp容器经过这个文献来得悉从何处及怎样挪用一个标签库。  ⑷ 网站的web.xml文献:这是你网站的初始化文献,在这个文献中,你设置了网站顶用到的自设置标签,以及哪个tld文献用来刻画每个自设置的标签。  ⑸ 散发文献(一个war大概jar文献):即使你想重用自设置标签的话,你须要一个本领来将它由一个名目变化到另一个名目中。将标签库打包为一个jar文献是一个大略并且灵验的办法。  ⑹ 在你的javascript/" target="_blank">jsp文献中作标签库证明:很大略,即使要用到该标签的话,只有在页面证明一下就不妨,后来,你就不妨在该javascript/" target="_blank">jsp页面包车型的士任何场合运用它。  可见要做的处事很多,然而本来并不是很难。它的重心并不在乎源代码,而是在乎怎样将各局部精确地构造起来。然而,如许的分层是很要害的,它可令标签的运用精巧和更简单变化。更要害的是,那些层的生存可让处置创造标签的工程经过一个javascript/" target="_blank">jsp ide(javascript/" target="_blank">jsp的集成开拓情况)机动实行。憧憬未来的javascript/" target="_blank">jsp ide可机动实行创造一个自设置标签的大局部处事,如许你只须要写代码和标签处置就不妨了。  提防:一个标签处置仅设置一个自设置标签;一个标签库是几个处置沟通工作的标签处置器的汇合。  3. 创造本人的标签  以次将一步一步地教你怎样创造自设置的标签,简直的例子是扩充javascript/" target="_blank">jsp,令它具有本人的html源代码功效。这个功效将一切的<和>字符用html代码来包办。它不妨很简单地扩充为做其它的源代码处置。为了简化,这个例子只证明了创造自设置标签的基础因素。  ⑴ 创造一个javabean  你代码中任何可从新运用的局部都该当放到一个javabean中。这个很要害,由于你要常常在项手段其它场合用到那些代码。放在标签处置器中的任何代码在标签外都是不不妨从新运用的,所以将可重用的代码局部独力飞来是很要害的。在这个例子总,为html源代码的论理是常用的,所以放到javabean中。  ⑵ html源代码javabean /* html_format.java */public class html_format extends object implements java.io.serializable {/** 创造新的html_format */public html_format() {}/** 将一个字符串中一切的一切 < 和 > 字符用相应的html源代码包办 */public string html_encode(string as_data){int li_len = as_data.length();/*string buffer的长度要比从来的字符串长*/stringbuffer lsb_encode = new stringbuffer(li_len + (li_len/10));/* 轮回替代十足的< 和 > 字符 */for( int li_count = 0 ; li_count < li_len ; li_count++){ string ls_next = string.valueof(as_data.charat(li_count));if (ls_next.equals("<")) ls_next = "<";if (ls_next.equals(">")) ls_next = ">";lsb_encode.append( ls_next );}return( lsb_encode.tostring() );}}

  ⑶ 创造一个标签处置器  标签处置器运用以次的代码:html源代码标签处置器 import java.io.ioexception;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class html_formattag extends bodytagsupport{/* 1} 在标签末将会挪用这个因变量 */public int doendtag() throws jsptagexception{ try{ /* 2}获得标签中的文本 */bodycontent l_tagbody = getbodycontent();string ls_output = "";/* 3}即使标签体有文本,就处置它 */if(l_tagbody != null){ html_format l_format = new html_format();/* 3a} 将标签体的实质变换为一个字符串 */string ls_html_text = l_tagbody.getstring();ls_output = l_format.html_encode(ls_html_text);}/* 4}将截止写回到数据流中 */pagecontext.getout().write(ls_output.trim());}catch (ioexception e){ throw new jsptagexception("tag error:" + e.tostring());}/* 让javascript/" target="_blank">jsp连接处置以次页面包车型的士实质 */return eval_page;}}

  这个处置很大略,它囊括有:  o 读入标签发端和中断间的文本  o 挪用html源代码因变量  o 归来截止到javascript/" target="_blank">jsp页面。  ⑷ 创造一个标签刻画器  须要刻画自设置标签以让体例领会怎样处置。该刻画文献的后缀为.tld,常常它的名字和标签处置器沟通,共存放在"/web-inf/"目次。html源代码标签刻画器<?xml version="1.0" encoding="utf-8" ?><!doctype taglibpublic "-//sun microsystems, inc.//dtd javascript/" target="_blank">jsp tag library 1.1//en""http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"><taglib><tlibversion>1.0</tlibversion><javascript/" target="_blank">jspversion>1.1</javascript/" target="_blank">jspversion><shortname>html_formattag</shortname><uri></uri><info>html encoding tag </info><tag><name>htmlencode</name><tagclass>html_formattag</tagclass><info>encode html</info></tag></taglib>

[page_break]  ⑸ 革新web xml文献  此刻可报告javascript/" target="_blank">jsp容器运用标签库。为此要窜改web.xml文献,简直说来是要在个中介入一个taglib的名目来备案该标签库。最要害的是,要为tag调配一个uri。uri是一个独一的援用,只运用在该网站的这个更加的标签上。运用全长的url大概包名是一个好的风气,它不妨保证独一性,由于该标签不妨在各别的网站运用。这个例子是简化了。窜改web.xml文献<?xml version="1.0" encoding="iso-8859-1"?> <!doctype web-apppublic "-//sun microsystems, inc.//dtd web application 2.2//en""http://java.sun.com/j2ee/dtds/web-app_2.2.dtd"><web-app><taglib><taglib-uri>htmlencode</taglib-uri><taglib-location>/web-inf/html_formattag.tld</taglib-location></taglib></web-app>

  ⑹ 运用新的标签  自设置的标签仍旧树立好,不妨用在一个javascript/" target="_blank">jsp页面上。要做到这一点,只需在该页面运用taglib引导吩咐证明一下该标签就不妨了,该标签经过它独一的uri被援用,而且会被调配一个名字空间前缀。前缀不妨大肆,只有它不与其它的名字空间辩论便可。  在一个javascript/" target="_blank">jsp页面上运用html源代码标签:<%@ taglib uri="htmlencode" prefix="examples" %><pre><?xml:namespace prefix = examples /><examples:htmlencode>< hello , simple sample ></examples:htmlencode></pre>典型代码的输入< hello , simple sample >which displays as:< hello , simple sample >

  经过这个标签,我就将该页面包车型的士一切代码源代码了。风趣的是一切的自设置标签都是在效劳器上处置的。这表示着你将不会在输入的页面上看到自设置的标签。  创造一个标签不是很难吧。最艰巨的局部是要进修标签处置的一切详细。这是一个很宏大的功效,咱们不过提到了最基础的场合。因为这个处置须要几步,新的javascript/" target="_blank">jsp编制程序者在创造标签时将会感触迷惘。  怎样运用javascript/" target="_blank">jsp开拓dom运用?  dom是document object model的缩写,即文书档案东西模子。xml将数据构造为一颗树,以是dom即是对这颗树的一个东西描叙。肤浅的说,即是经过领会xml文书档案,为xml文书档案在论理上创造一个树模子,树的节点是一个个东西。咱们经过存取那些东西就不妨存取xml文书档案的实质。  底下咱们来看一个大略的例子,看看在dom中,咱们是怎样来操纵一个xml文书档案的。这是一个xml文书档案,也是咱们要操纵的东西:<?xml version="1.0" encoding="utf-8"?> <messages> <message>good-bye serialization, hello java!</message> </messages>

  底下,咱们须要把这个文书档案的实质领会到一个个的java东西中去供步调运用,运用jaxp,咱们只需几行代码就能做到这一点。开始,咱们须要创造一个领会器工场,以运用这个工场来赢得一个简直的领会器东西:  documentbuilderfactory dbf = documentbuilderfactory.newinstance();   咱们在这边运用documentbuilderfacotry的手段是为了创造与简直领会器无干的步调,当documentbuilderfactory类的静态本领newinstance()被挪用时,它按照一个体例变量来确定简直运用哪一个领会器。又由于一切的领会器都按照于jaxp所设置的接口,以是不管简直运用哪一个领会器,代码都是一律的。以是当在各别的领会器之间举行切换时,只须要变动体例变量的值,而不必变动任何代码。这即是工场所带来的长处。  documentbuilder db = dbf.newdocumentbuilder();  当赢得一个工场东西后,运用它的静态本领newdocumentbuilder()本领不妨赢得一个documentbuilder东西,这个东西代办了简直的dom领会器。但简直是哪一种领会器,微软的大概ibm的,对于步调而言并不要害。   而后,咱们就不妨运用这个领会器来对xml文书档案举行领会了:  document doc = db.parse("c:/xml/message.xml");   documentbuilder的parse()本领接收一个xml文书档案名动作输出参数,归来一个document东西,这个document东西就代办了一个xml文书档案的树模子。此后一切的对xml文书档案的操纵,都与领会器无干,径直在这个document东西长进行操纵就不妨了。而简直对document操纵的本领,即是由dom所设置的了。  从获得的document东西发端,咱们就不妨发端咱们的dom之旅了。运用document东西的getelementsbytagname()本领,咱们不妨获得一个nodelist东西,一个node东西代办了一个xml文书档案中的一个标签元素,而nodelist东西,观其名而知其意,所代办的是一个node东西的列表:  nodelist nl = doc.getelementsbytagname("message");   咱们经过如许一条语句所获得的是xml文书档案中一切<message>标签对应的node东西的  一个列表。而后,咱们不妨运用nodelist东西的item()本领来获得列表中的每一个node东西:  node my_node = nl.item(0);   当一个node东西被创造之后,生存在xml文书档案中的数据就被索取出来并封装在这个node中了。在这个例子中,要索取message标签内的实质,咱们常常会运用node东西的getnodevalue()本领:string message = my_node.getfirstchild().getnodevalue();   请提防,这边还运用了一个getfirstchild()本领来赢得message底下的第一个子node东西。固然在message标签底下除去文本外并没有其它子标签大概属性,然而咱们维持在这边运用getfirsechild()本领,这重要和w3c对dom的设置相关。w3c把标签内的文本局部也设置成一个node,以是先要获得代办文本的谁人node,咱们才不妨运用getnodevalue()来获得文本的实质。此刻,既是咱们仍旧不妨从xml文献中索取出数据了,咱们就不妨把那些数据用在符合的场合,来修建运用步调。  dom范例  先说说这个例子究竟要做的是什么吧,咱们在一个名为link.xml文献中生存了少许url地方,咱们蓄意不妨经过dom把那些url读出并表露出来,也不妨反过来向这个xml文献中写入介入的url地方。很大略,却很适用,也充满来例示dom的绝大局部用法了。  第一个步调咱们称为xmldisplay.java,重要的功效即是读取这个xml文献中各个节点的实质,而后在方法化输入在system.out上,咱们来看看这个步调:import javax.xml.parsers.*;import org.w3c.dom.*;

  这是引入需要的类,由于在这边运用的是sun所供给的xml领会器,所以须要引入java.xml.parsers包,个中包括了有dom领会器和sax领会器的简直实行。org.w3c.dom包中设置了w3c所拟订的dom接口。documentbuilderfactory factory = documentbuilderfactory.newinstance();documentbuilder builder=factory.newdocumentbuilder();document doc=builder.parse("links.xml");doc.normalize();  

  除去上头讲到的,再有一个小本领,对document东西挪用normalize(),不妨去掉xml文书档案中动作方法化实质的空缺而映照在dom树中的不需要的text node东西。要不你获得的dom树大概并不如你所设想的那么。更加是在输入的功夫,这个normalize()更为有效。  nodelist links =doc.getelementsbytagname("link");

  方才说过,xml文书档案中的空缺符也会被动作东西映照在dom树中。所以,径直挪用node本领的getchildnodes本领有功夫会有些题目,偶尔不不妨归来所憧憬的nodelist东西。处置的方法是运用element的getelementbytagname(string),归来的nodelise即是所憧憬的东西了。而后,不妨用item()本领索取想要的元素。for (int i=0;i<links.getlength();i++){element link=(element) links.item(i);system.out.print("content: "); system.out.println(link.getelementsbytagname("text").item(0).getfirstchild();.getnodevalue());……

  上头的代码片断就实行了对xml文书档案实质的方法化输入。只有提防到少许详细的题目,比方getfirstchile()本领和getelementsbytagname()本领的运用,那些仍旧比拟简单的。  底下的实质,即是在窜改了dom树后从新写入到xml文书档案中去的题目了。这个步调名为xmlwrite.java。在jaxp1.0本子中,并没有径直的类和本领不妨处置xml文书档案的写入题目,须要借助其它包中的少许扶助类。而在jaxp1.1本子中,引入了对xslt的扶助,所谓xslt,即是对xml文书档案举行变幻(translation)后,获得一个新的文书档案构造。运用这个新介入的功效,咱们就不妨很简单的把新天生大概窜改后的dom树从新写回到xml文献中去了,底下咱们来看看代码的实行,这段代码的重要功效是向links.xml文献中介入一个新的link节点:import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.domsource; import javax.xml.transform.stream.streamresult; import org.w3c.dom.*;

  新引入的java.xml.transform包中的几个类,即是用来处置xslt变幻的。 咱们蓄意在上头的xml文献中介入一个新的link节点,所以开始仍旧要读入links.xml文献,建立一个dom树,而后再对这个dom树举行窜改(增添节点),结果把窜改后的dom写回到links.xml文献中:documentbuilderfactory factory = documentbuilderfactory.newinstance(); documentbuilder builder=factory.newdocumentbuilder(); document doc=builder.parse("links.xml"); doc.normalize(); //---博得变量---- string text="hanzhong's homepage"; string url="www.hzliu.com"; string author="hzliu liu"; string discription="a site from hanzhong liu, give u lots of suprise!!!";

  为了看清中心,简化步调,咱们把要介入的实质硬源代码到回顾string东西中,而本质操纵中,常常运用一个界面来索取用户输出,大概经过jdbc从数据库中索取想要的实质。text textseg; element link=doc.createelement("link");

  开始该当领会的是,不管什么典型的node,text型的也罢,attr型的也罢,element型的也罢,它们的创造都是经过document东西中的createxxx()本领来创造的(xxx代办简直要创造的典型),所以,咱们要向xml文书档案中增添一个link名目,开始要创造一个link东西: element linktext=doc.createelement("text"); textseg=doc.createtextnode(text); linktext.appendchild(textseg); link.appendchild(linktext); ……

  创造节点的进程大概有些老生常谈,但须要提防的场合是,对element中所包括的text(在dom中,那些text也是代办了一个node的,所以也必需为它们创造相映的node),不许径直用element东西的setnodevalue()本领来树立那些text的实质,而须要用创造的text东西的setnodevalue()本领来树立文本,如许才不妨把创造的element和其文本实质增添到dom树中。看看前方的代码,你会更好的领会这一点: doc.getdocumentelement().appendchild(link);   结果,不要忘怀把创造好的节点增添到dom树中。document类的getdocumentelement()本领,归来代办文书档案根节点的element东西。在xml文书档案中,根节点确定是独一的。 transformerfactory tfactory =transformerfactory.newinstance(); transformer transformer = tfactory.newtransformer(); domsource source = new domsource(doc); streamresult result = new streamresult(new java.io.file("links.xml")); transformer.transform(source, result);

  而后即是用xslt把dom树输入了。这边的transformerfactory也同样运用了工场形式,使得简直的代码同简直的变幻器无干。实行的本领和documentbuilderfactory沟通,这边就不赘述了。transformer类的transfrom本领接收两个参数、一个数据源source和一个输入目的result。这边辨别运用的是domsource和streamresult,如许就不妨把dom的实质输入到一个输入流中,当这个输入流是一个文献的功夫,dom的实质就被写入到文献中去了。[page_break]  怎样运用javascript/" target="_blank">jsp开拓sax运用?  sax是simple api for xml的缩写,它并不是由w3c官方所提出的规范,不妨说是"民间"的究竟规范。本质上,它是一种社区本质的计划产品。固然如许,在xml中对sax的运用涓滴不比dom少,简直一切的xml领会器城市扶助它。  与dom比拟而言,sax是一种轻量型的本领。咱们领会,在处置dom的功夫,咱们须要读入所有的xml文书档案,而后在外存中创造dom树,天生dom树上的每个node东西。当文书档案比拟小的功夫,这不会形成什么题目,然而一旦文书档案大起来,处置dom就会变得十分费时劳累。更加是其对于外存的需要,也将是成倍的延长,及至于在某些运用中运用dom是一件很不合算的事(比方在applet中)。这功夫,一个较好的代替处置本领即是sax。  sax在观念上与dom实足各别。开始,各别于dom的文书档案启动,它是事变启动的,也即是说,它并不须要读入所有文书档案,而文书档案的读入进程也即是sax的领会进程。所谓事变启动,是指一种鉴于回调(callback)体制的步调运转本领。(即使你对java新的代劳事变模子比拟领会的话,就会很简单领会这种体制了)在xmlreader接收xml文书档案,在读入xml文书档案的进程中就举行领会,也即是说读入文书档案的进程妥协析的进程是同声举行的,这和dom辨别很大。领会发端之前,须要向xmlreader备案一个contenthandler,也即是十分于一个事变监听器,在contenthandler中设置了很多本领,比方startdocument(),它定制了当在领会进程中,遇到文书档案发端时该当处置的工作。当xmlreader读到符合的实质,就会抛出相映的事变,并把这个事变的处置权代劳给contenthandler,挪用其相映的本领举行相应。   如许平常的说来大概有些不简单领会,别急,反面的例子会让你领会sax的领会进程。看看这个大略xml文献: <poem> <author>ogden nash</author> <title>fleas</title> <line>adam</line> </poem>

  当xmlreader读到<poem>标签时,就会挪用contenthandler.startelement()本领,并把标出面poem动作参数传播往日。在你实行的startelement()本领中须要做相映的举措,以处该当<poem>出当前该当做的工作。各个事变跟着领会的进程(也即是文书档案读入的进程)一个个程序的被抛出,相映的本领也会被程序的挪用,结果,当领会实行,本领都被挪用后,对文书档案的处置也就实行了。底下的这个表,列出了在领会上头的谁人xml文献的功夫,程序被挪用的本领:  遇到的名目 本领回调 {文书档案发端} startdocument() <poem> startelement(null,"poem",null,{attributes}) "\n" characters("<poem>\n...", 6, 1) <author> startelement(null,"author",null,{attributes}) "ogden nash" characters("<poem>\n...", 15, 10) </author> endelement(null,"author",null) "\n" characters("<poem>\n...", 34, 1) <title> startelement(null,"title",null,{attributes}) "fleas" characters("<poem>\n...", 42, 5) </title> endelement(null,"title",null) "\n" characters("<poem>\n...", 55, 1) <line> startelement(null,"line",null,{attributes}) "adam" characters("<poem>\n...", 62, 4) </line> endelement(null,"line",null) "\n" characters("<poem>\n...", 67, 1) </poem> endelement(null,"poem",null) {文书档案中断} enddocument()

  contenthandler本质上是一个接口,当处置一定的xml文献的功夫,就须要为其创造一个实行了contenthandler的类来处置一定的事变,不妨说,这个本质上即是sax处置xml文献的中心。底下咱们来看看设置在个中的少许本领:  void characters(char[] ch, int start, int length):这个本领用来处置在xml文献中读到字符串,它的参数是一个字符数组,以及读到的这个字符串在这个数组中的开始场所和长度,咱们不妨很简单的用string类的一个结构本领来赢得这个字符串的string类:string charencontered=new string(ch,start,length)。  void startdocument():当遇到文书档案的发端的功夫,挪用这个本领,不妨在个中做少许预处置的处事。  void enddocument():和上头的本领对立应,当文书档案中断的功夫,挪用这个本领,不妨在个中做少许善后的处事。   void startelement(string namespaceuri, string localname, string qname, attributes atts):当读到一个发端标签的功夫,会触发这个本领。在sax1.0本子中并不扶助名域,而在新的2.0本子中供给了对名域的扶助,这边参数中的namespaceuri即是名域,localname是标出面,qname是标签的化装前缀,当没有运用名域的功夫,这两个参数都未null。而atts是这个标签所包括的属性列表。经过atts,不妨获得一切的属性名和相映的值。要提防的是sax中一个要害的特性即是它的流式处置,在遇到一个标签的功夫,它并不会记录下往日所碰到的标签,也即是说,在startelement()本领中,一切你所领会的消息,即是标签的名字和属性,至于标签的嵌套构造,表层标签的名字,能否有子元属之类其它与构造关系的消息,都是不得而知的,都须要你的步调来实行。这使得sax在编制程序处置上没有dom来得那么简单。  void endelement(string namespaceuri, string localname, string qname):这个本领和上头的本领对立应,在遇到中断标签的功夫,挪用这个本领。  咱们仍旧采用讲dom的功夫运用的谁人文书档案例子,但开始,咱们先看一个大略少许的运用,咱们蓄意不妨统计一下xml文献中各个标签展示的度数。这个例子很大略,然而足以阐明sax编制程序的基础思绪了。一发端固然仍旧import语句了: import org.xml.sax.helpers.defaulthandler; import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; import java.util.*; import java.io.*;

  而后,咱们创造一个接受于defaulthandler的类,简直的步调论理在这边不妨姑且放在一面,要提防的是步调的构造:public class saxcounter extends defaulthandler { private hashtable tags; //这个hashtable用来记载tag展示的度数 // 处置文书档案前的处事 public void startdocument() throws saxexception { tags = new hashtable();//初始化hashtable } //对每一个发端元属举行处置 public void startelement(string namespaceuri, string localname, string rawname, attributes atts) throws saxexception { string key = localname; ……

  咱们来看看这段步调作了些什么。在main()本领中,重要做的即是创造领会器,而后领会文书档案。本质上,在这边创造saxparser东西的功夫,为了使步调代码于简直的领会器无干,运用了同dom中一律的安排本领:经过一个saxparserfactory类来创造简直的saxparser东西,如许,当须要运用各别的领会器的功夫,要变换的,不过一个情况变量的值,而步调的代码不妨维持静止。这即是factorymethod形式的思维。在这边不复简直讲了,即使再有不领会的,不妨参看上头dom中的证明,道理是一律的。   然而在这边再有一点点要提防的场合,即是saxparser类和xmlreader类之间的联系。你大概有些含糊了吧,本质上saxparser是jaxp中对xmlreader的一个封装类,而xmlreader是设置在sax2.0种的一个用来领会文书档案的接口。你不妨同样的挪用saxparser大概xmlreader中的parser()本领来领会文书档案,功效是实足一律的。然而在saxparser中的parser()本领接收更多的参数,不妨对各别的xml文书档案数据源举行领会,所以运用起来要比xmlreader要简单少许。  这个例子只是波及了sax的一点外相,而底下的这个,可就要高档少许了。底下咱们要实行的功效,在dom的例子中仍旧有实行了,即是从xml文书档案中读出实质并方法化输入,固然步调论理看上去仍旧很大略,然而sax可不比dom哦,看着吧。   前方说过,当遇到一个发端标签的功夫,在startelement()本领中,咱们并不不妨获得这个标签在xml文书档案中所处的场所。这在处置xml文书档案的功夫是个大烦恼,由于在xml中标签的语义,有一局部是由其所处的场所所确定的。并且在少许须要考证文书档案构造的步调中,这更是一个题目。固然,没有处置不了的题目了,咱们不妨运用一个栈来实行对文书档案构造的记录。   栈的特性是进步先出,咱们此刻的办法是,在startelemnt()本领顶用push将这个标签的名字增添到栈中,在endelement()本领中在把它pop出来。咱们领会对一个构造杰出的xml而言,其嵌套构造是完美的,每一个发端标签总会对应一个中断标签,并且不会展示标签嵌套之间的错位。所以,每一次startelement()本领的挪用,必定会对应一个endelement()本领的挪用,如许push和pop也是成对展示的,咱们只须要领会栈的构造,就不妨很简单的领会暂时标签所处在文书档案构造中的场所了。public class saxreader extends defaulthandler { java.util.stack tags=new java.util.stack(); ……

  在这边固然没有运用到栈的领会,但本质上栈的领会是一件很简单的工作,应为java.util.stack接受了java.util.vector类,并且stack中的元素是按栈的构造由底至上陈设的,因个,咱们不妨运用vector类的size()本领来获得stack的元素个数,还不妨运用vector的get(int)本领来获得简直的每一个元属。本质上,即使把stack的元素从底进取逐个陈设出来,咱们就获得了从xml根节点到暂时节点的一条独一的路途,有了这条路途的消息,文书档案的构造就在领会然而了。   到暂时为止,咱们仍旧控制了对于xml编制程序的两大凶器:dom和sax,也领会了该怎样在一个java步调中运用它们。dom编制程序对立大略,然而速率比拟慢,占用外存多,而s ax编制程序搀杂少许,然而速率快,占用外存少。以是,咱们该当按照各别的情况采用运用各别的本领。大局部的xml运用基础都不妨用它们来处置。须要更加证明的是,dom和sax本来都是谈话无干的,并非java所独占,也即是说,只有有相映的谈话实行,dom和sax不妨运用在任何面向东西的谈话中。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.