小妖女 发表于 2015-1-18 11:29:34

JAVA编程:JSP与XML的分离

认真的记,感觉很紧张根本就没有时间和能力,来对技术知识点进行思考。这样课下就只能对知识进行简单的理解,其实简单的理解就是记忆课堂上讲的知识点,js|xml综述:可扩大标注言语(eXtensibleMarkupLanguage,XML)正被敏捷的使用于业界,它已作为与平台、言语和协定有关的格局形貌和互换数据的普遍使用尺度。XML和它的帮助标准可用于形貌数据的文档体现,形貌XML文档范例的限定,形貌XML文档和资本之间的链接,形貌XML文档的主动转换和格局化。

  怎样开辟自界说标签库?

  我利用JSP和ASP编程已有一段颇长的工夫了,在两种服务器真个编程体例中,我愈来愈以为JSP的功效要壮大很多。不提其余,个中JSP的标签库就是我选择JSP作为首选服务器端Web使用开辟工具的缘故原由。为何?由于:保护和开辟的速率。在一个单一的服务器页面中,你能够夹杂利用各类分歧的剧本办法和对象。就?quot;混凝土"一样,这类夹杂可令服务器真个剧本变得壮大,而且让服务器真个编程者计划出十分天真和静态的Web页面。不外这类自在的夹杂也有其弱点,那就是保护起来十分贫苦,出格是当项目渐渐变年夜时。因为终极的产物是经过一个传统的Web计划者来保护的,因而会带来成绩。更糟的是,跟着代码的庞大性增添,开辟的速率就会变慢,倒霉于开辟中等和年夜型的Web使用,一旦开辟完,站点还要找及格的编程者来保护这些很是庞大的代码。
幸亏,JSP供应了一个很好办理的举措。标签库供应了一个复杂的办法来创建一个可重用的代码块。一旦标签库计划好,它就能够在很多项目中再次利用。更便利的是,与COM和J2EE分歧,你无需进修任何别的的技能就能够创建一个标签库!只需你明白写JSP,你就能够创建一个标签库。标签库还能够改良Web使用的保护。这个是得益于JSP页面自界说标签的复杂XML接口。如许,Web计划者乃至能够做到无需晓得任何JSP的常识,就能够创建JSP的Web使用。这个开放式的Web开辟关于团队运作长短常无效的。JSP编程者能够创建自界说的标签和背景的代码模块,而Web计划者可使用自界说的标签来创建Web使用,而且将精神会合在Web计划上。

  1.标签库的界说
  JSP标签库(也称自界说库)可当作是一套发生基于XML剧本的办法,它经过JavaBeans来撑持。在观点上说,标签库长短常复杂和能够重用的代码机关。
  实行XML/XSL转换的标签典范和HTML页面

<%@tagliburi="http://www.jspinsider.com/jspkit/JAXP"prefix="JAXP"%>
c:/xml/example.xml
c:/xml/example.xsl

  在这个例子中,经由过程利用复杂的标签来会见背景更加壮大的代码,一个XML被装载,而且经由过程一个XSL文件来发生一个了局,并发送给客户端,全体经由过程利用一个复杂的标签挪用就做到了。
  自界说标签为在JSP项目中创立易于重用的代码翻开了一扇年夜门。你所必要的只是标签库和它的文档申明。

  2.标签的组件
  固然标签库十分易于利用,不外要创建一个内中的计划来撑持标签库是颇庞大的,最少要比创建一个复杂的JavaBean庞大。这个庞大是来自于标签库是由几部分组成的。不外,你只必要晓得Java和JSP的常识就够了。
一个复杂的标签由上面的元素组成:
  ⑴JavaBeans:为了失掉Java与生具来的面向对象的优点,可重用的代码应当放到一个自力的代码容器中。这些JavaBeans并非标签库的一部分。不外它是你的代码库用来实行相干义务的基础代码块。
  ⑵标签处置:这是标签库的真正中心。一个标签处置器将援用它必要的任何资本(你的JavaBeans)和会见你的JSP页面的全体信息(pageContext对象)。JSP页面也会将一切已被设置的标签属性和JSP页面上的标签体中的内容传送给标签处置器。在标签处置器处置终了后,它将发还输入到你的JSP页面举行处置。
  ⑶标签库的形貌(tld文件):这是一个复杂的XML文件,它纪录着标签处置器的属性、信息和地位。JSP容器经由过程这个文件来得知从那里及怎样挪用一个标签库。
  ⑷网站的web.xml文件:这是你网站的初始化文件,在这个文件中,你界说了网站顶用到的自界说标签,和哪一个tld文件用来形貌每一个自界说的标签。
  ⑸分发文件(一个WAR大概JAR文件):假如你想重用自界说标签的话,你必要一个办法来将它由一个项目转移到另外一个项目中。将标签库打包为一个JAR文件是一个复杂并且无效的体例。
  ⑹在你的JSP文件中作标签库声明:很复杂,假如要用到该标签的话,只需在页面声明一下就能够,厥后,你就能够在该JSP页面的任何中央利用它。
  看来要做的事情良多,不外实在并非很难。它的要点其实不在于编码,而是在于怎样将各部分准确地构造起来。不外,如许的分层是很主要的,它可令标签的利用天真和更简单转移。更主要的是,这些层的存在可以让处置创建标签的工程经由过程一个JSPIDE(JSP的集成开辟情况)主动完成。希冀未来的JSPIDE可主动完成创立一个自界说标签的年夜部合作作,如许你只必要写代码和标签处置就能够了。
  注重:一个标签处置仅界说一个自界说标签;一个标签库是几个处置不异义务的标签处置器的汇合。

  3.创建本人的标签
  以下将一步一步地教你怎样创建自界说的标签,详细的例子是扩大JSP,令它具有本人的HTML编码功效。这个功效将一切的<和>字符用HTML代码来取代。它能够很简单地扩大为做别的的编码处置。为了简化,这个例子只注释了创建自界说标签的基础要素。
  ⑴创立一个JavaBean
  你代码中任何可从头利用的部分都应当放到一个JavaBean中。这个很主要,由于你要常常在项目标别的中央用到这些代码。放在标签处置器中的任何代码在标签外都是不成以从头利用的,因而将可重用的代码部分自力开来是很主要的。在这个例子总,为HTML编码的逻辑是经常使用的,因而放到JavaBean中。
  ⑵HTML编码JavaBean

/*HTML_Format.Java*/
publicclassHTML_FormatextendsObjectimplementsJava.io.Serializable{
/**创立新的HTML_Format*/
publicHTML_Format(){}
/**将一个字符串中一切的一切<和>字符用呼应的HTML编码取代*/
publicStringHTML_Encode(Stringas_data)
{
intli_len=as_data.length();
/*stringbuffer的长度要比本来的字符串长*/
StringBufferlsb_encode=newStringBuffer(li_len+(li_len/10));
/*轮回交换全体的<和>字符*/
for(intli_count=0;li_count<li_len;li_count++)
{Stringls_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编码标签处置器
importJava.io.IOException;
importJavax.servlet.jsp.*;
importJavax.servlet.jsp.tagext.*;
publicclassHTML_FormatTagextendsBodyTagSupport
{
/*1}在标签末将会挪用这个函数*/
publicintdoEndTag()throwsJspTagException
{
try
{/*2}失掉标签中的文本*/
BodyContentl_tagbody=getBodyContent();
Stringls_output="";
/*3}假如标签体有文本,就处置它*/
if(l_tagbody!=null)
{HTML_Formatl_format=newHTML_Format();
/*3a}将标签体的内容转换为一个字符串*/
Stringls_html_text=l_tagbody.getString();
ls_output=l_format.HTML_Encode(ls_html_text);
}
/*4}将了局写回到数据流中*/
pageContext.getOut().write(ls_output.trim());
}
catch(IOExceptione)
{thrownewJspTagException("TagError:"+e.toString());
}
/*让JSP持续处置以下页面的内容*/
returnEVAL_PAGE;
}
}

  这个处置很复杂,它包含有:
  o读进标签入手下手和停止间的文本
  o挪用html编码函数
  o前往了局到JSP页面。
  ⑷创立一个标签形貌器
  必要形貌自界说标签以让体系晓得怎样处置。该形貌文件的后缀为.tld,一般它的名字和标签处置器不异,并寄存在"/WEB-INF/"目次。

HTML编码标签形貌器
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEtaglib
PUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.1//EN"
"http://Java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<TAGLIB>
<TLIBVERSION>1.0</TLIBVERSION>
<JSPVERSION>1.1</JSPVERSION>
<SHORTNAME>HTML_FormatTag</SHORTNAME>
<URI></URI>
<INFO>HTMLEncodingTag</INFO>
<TAG>
<NAME>HTMLEncode</NAME>
<TAGCLASS>HTML_FormatTag</TAGCLASS>
<INFO>EncodeHTML</INFO>
</TAG>
</TAGLIB>

  ⑸更新WebXML文件
  如今可告知JSP容器利用标签库。为此要修正web.xml文件,详细说来是要在个中到场一个taglib的项目来注册该标签库。最主要的是,要为tag分派一个URI。URI是一个独一的援用,只使用在该网站的这个出格的标签上。利用全长的URL大概包名是一个好的习气,它能够确保独一性,由于该标签能够在分歧的网站利用。这个例子是简化了。

修正web.xml文件
<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEweb-app
PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.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>

  ⑹利用新的标签
  自界说的标签已设置好,能够用在一个JSP页面上。要做到这一点,只需在该页面利用taglib唆使命令声明一下该标签就能够了,该标签经由过程它独一的URI被援用,而且会被分派一个名字空间前缀。前缀能够恣意,只需它不与别的的名字空间抵触即可。
  在一个JSP页面上利用HTML编码标签:

<%@tagliburi="HTMLEncode"prefix="Examples"%>
<PRE>
<?XML:NAMESPACEPREFIX=Examples/><Examples:HTMLEncode>
<Hello,Simplesample>
</Examples:HTMLEncode>
</PRE>
典范代码的输入
<Hello,Simplesample>
whichdisplaysas:
<Hello,Simplesample>

  经由过程这个标签,我就将该页面的一切代码编码了。风趣的是一切的自界说标签都是在服务器上处置的。这意味着你将不会在输入的页面上看到自界说的标签。
  创建一个标签不是很难吧。最坚苦的部分是要进修标签处置的一切细节。这是一个很壮大的功效,我们只是提到了最基础的中央。因为这个处置必要几步,新的JSP编程者在创立标签时将会感应利诱。

  怎样使用JSP开辟DOM使用?

  DOM是DocumentObjectModel的缩写,即文档对象模子。XML将数据构造为一颗树,以是DOM就是对这颗树的一个对象描叙。普通的说,就是经由过程剖析XML文档,为XML文档在逻辑上创建一个树范型,树的节点是一个个对象。我们经由过程存取这些对象就可以够存取XML文档的内容。
  上面我们来看一个复杂的例子,看看在DOM中,我们是怎样来操纵一个XML文档的。这是一个XML文档,也是我们要操纵的对象:

<?xmlversion="1.0"encoding="UTF-8"?>
<messages>
<message>Good-byeserialization,helloJava!</message>
</messages>

  上面,我们必要把这个文档的内容剖析到一个个的Java对象中往供程序利用,使用JAXP,我们只需几行代码就可以做到这一点。起首,我们必要创建一个剖析器工场,以使用这个工场来取得一个详细的剖析器对象:
  DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
  我们在这里利用DocumentBuilderFacotry的目标是为了创立与详细剖析器有关的程序,当DocumentBuilderFactory类的静态办法newInstance()被挪用时,它依据一个体系变量来决意详细利用哪个剖析器。又由于一切的剖析器都从命于JAXP所界说的接口,以是不管详细利用哪个剖析器,代码都是一样的。以是当在分歧的剖析器之间举行切换时,只必要变动体系变量的值,而不必变动任何代码。这就是工场所带来的优点。
  DocumentBuilderdb=dbf.newDocumentBuilder();
  当取得一个工场对象后,利用它的静态办法newDocumentBuilder()办法能够取得一个DocumentBuilder对象,这个对象代表了详细的DOM剖析器。但详细是哪种剖析器,微软的大概IBM的,关于程序而言其实不主要。
  然后,我们就能够使用这个剖析器来对XML文档举行剖析了:
  Documentdoc=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对象的列表:
  NodeListnl=doc.getElementsByTagName("message");
  我们经由过程如许一条语句所失掉的是XML文档中一切<message>标签对应的Node对象的
  一个列表。然后,我们可使用NodeList对象的item()办法来失掉列表中的每个Node对象:
  Nodemy_node=nl.item(0);
  当一个Node对象被创建以后,保留在XML文档中的数据就被提掏出来并封装在这个Node中了。在这个例子中,要提取Message标签内的内容,我们一般会利用Node对象的getNodeValue()办法:
Stringmessage=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上,我们来看看这个程序:

importJavax.xml.parsers.*;
importorg.w3c.dom.*;

  这是引进需要的类,由于在这里利用的是Sun所供应的XML剖析器,因此必要引进Java.xml.parsers包,个中包括了有DOM剖析器和SAX剖析器的详细完成。org.w3c.dom包中界说了w3c所制订的DOM接口。

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
DocumentBuilderbuilder=factory.newDocumentBuilder();
Documentdoc=builder.parse("links.xml");
doc.normalize();

  除下面讲到的,另有一个小技能,对Document对象挪用normalize(),能够往失落XML文档中作为格局化内容的空缺而映照在DOM树中的不用要的TextNode对象。不然你失掉的DOM树大概其实不如你所设想的那样。出格是在输入的时分,这个normalize()更加有效。

  NodeListlinks=doc.getElementsByTagName("link");

  方才说过,XML文档中的空缺符也会被作为对象映照在DOM树中。因此,间接挪用Node办法的getChildNodes办法偶然候会有些成绩,偶然不克不及够前往所希冀的NodeList对象。办理的举措是利用Element的getElementByTagName(String),前往的NodeLise就是所等候的对象了。然后,能够用item()办法提取想要的元素。

for(inti=0;i<links.getLength();i++){
Elementlink=(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节点:

importJavax.xml.parsers.*;
importJavax.xml.transform.*;
importJavax.xml.transform.dom.DOMSource;
importJavax.xml.transform.stream.StreamResult;
importorg.w3c.dom.*;

  新引进的Java.xml.transform包中的几个类,就是用来处置XSLT变更的。
我们但愿在下面的XML文件中到场一个新的link节点,因此起首仍是要读进links.xml文件,构建一个DOM树,然后再对这个DOM树举行修正(增加节点),最初把修正后的DOM写回到links.xml文件中:

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
DocumentBuilderbuilder=factory.newDocumentBuilder();
Documentdoc=builder.parse("links.xml");
doc.normalize();
//---获得变量----
Stringtext="HanzhongsHomepage";
Stringurl="www.hzliu.com";
Stringauthor="HzliuLiu";
Stringdiscription="AsitefromHanzhongLiu,giveulotsofsuprise!!!";

  为了看清重点,简化程序,我们把要到场的内容硬编码到影象String对象中,而实践操纵中,常常使用一个界面来提取用户输出,大概经由过程JDBC从数据库中提取想要的内容。

Texttextseg;
Elementlink=doc.createElement("link");

  起首应当了然的是,不管甚么范例的Node,Text型的也好,Attr型的也好,Element型的也好,它们的创立都是经由过程Document对象中的createXXX()办法来创立的(XXX代表详细要创立的范例),因而,我们要向XML文档中增加一个link项目,起首要创立一个link对象:

Elementlinktext=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文档中,根节点必定是独一的。

TransformerFactorytFactory=TransformerFactory.newInstance();
Transformertransformer=tFactory.newTransformer();
DOMSourcesource=newDOMSource(doc);
StreamResultresult=newStreamResult(newJava.io.File("links.xml"));
transformer.transform(source,result);

  然后就是用XSLT把DOM树输入了。这里的TransformerFactory也一样使用了工场形式,使得详细的代码同详细的变更器有关。完成的办法和DocumentBuilderFactory不异,这儿就不赘述了。Transformer类的transfrom办法承受两个参数、一个数据源Source和一个输入方针Result。这里分离利用的是DOMSource和StreamResult,如许就可以够把DOM的内容输入到一个输入流中,当这个输入流是一个文件的时分,DOM的内容就被写进到文件中往了。

  怎样使用JSP开辟SAX使用?

  SAX是SimpleAPIforXML的缩写,它并非由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>OgdenNash</AUTHOR>
<TITLE>Fleas</TITLE>
<LINE>Adam</LINE>
</POEM>

  当XMLReader读到<POEM>标签时,就会挪用ContentHandler.startElement()办法,并把标署名POEM作为参数传送已往。在你完成的startElement()办法中必要做响应的举措,以处置当<POEM>呈现时应当做的事变。各个事务跟着剖析的历程(也就是文档读进的历程)一个个按次的被抛出,响应的办法也会被按次的挪用,最初,当剖析完成,办法都被挪用后,对文档的处置也就完成了。上面的这个表,列出了在剖析下面的谁人XML文件的时分,按次被挪用的办法:

  碰到的项目办法回调

{文档入手下手}startDocument()
<POEM>startElement(null,"POEM",null,{Attributes})
""characters("<POEM>...",6,1)
<AUTHOR>startElement(null,"AUTHOR",null,{Attributes})
"OgdenNash"characters("<POEM>...",15,10)
</AUTHOR>endElement(null,"AUTHOR",null)
""characters("<POEM>...",34,1)
<TITLE>startElement(null,"TITLE",null,{Attributes})
"Fleas"characters("<POEM>...",42,5)
</TITLE>endElement(null,"TITLE",null)
""characters("<POEM>...",55,1)
<LINE>startElement(null,"LINE",null,{Attributes})
"Adam"characters("<POEM>...",62,4)
</LINE>endElement(null,"LINE",null)
""characters("<POEM>...",67,1)
</POEM>endElement(null,"POEM",null)
{文档停止}endDocument()

  ContentHandler实践上是一个接口,当处置特定的XML文件的时分,就必要为其创立一个完成了ContentHandler的类来处置特定的事务,能够说,这个实践上就是SAX处置XML文件的中心。上面我们来看看界说在个中的一些办法:
  voidcharacters(char[]ch,intstart,intlength):这个办法用来处置在XML文件中读到字符串,它的参数是一个字符数组,和读到的这个字符串在这个数组中的肇端地位和长度,我们能够很简单的用String类的一个机关办法来取得这个字符串的String类:StringcharEncontered=newString(ch,start,length)。
  voidstartDocument():当碰到文档的开首的时分,挪用这个办法,能够在个中做一些预处置的事情。
  voidendDocument():和下面的办法绝对应,当文档停止的时分,挪用这个办法,能够在个中做一些善后的事情。
  voidstartElement(StringnamespaceURI,StringlocalName,StringqName,Attributesatts):当读到一个入手下手标签的时分,会触发这个办法。在SAX1.0版本中其实不撑持名域,而在新的2.0版本中供应了对名域的撑持,这儿参数中的namespaceURI就是名域,localName是标署名,qName是标签的润色前缀,当没有利用名域的时分,这两个参数都未null。而atts是这个标签所包括的属性列表。经由过程atts,能够失掉一切的属性名和响应的值。要注重的是SAX中一个主要的特性就是它的流式处置,在碰到一个标签的时分,它其实不会记录下之前所碰着的标签,也就是说,在startElement()办法中,一切你所晓得的信息,就是标签的名字和属性,至于标签的嵌套布局,下层标签的名字,是不是有子元属等等别的与布局相干的信息,都是不得而知的,都必要你的程序来完成。这使得SAX在编程处置上没有DOM来得那末便利。
  voidendElement(StringnamespaceURI,StringlocalName,StringqName):这个办法和下面的办法绝对应,在碰到停止标签的时分,挪用这个办法。
  我们仍是相沿讲DOM的时分利用的谁人文档例子,但起首,我们先看一个复杂一些的使用,我们但愿可以统计一下XML文件中各个标签呈现的次数。这个例子很复杂,可是足以论述SAX编程的基础思绪了。一入手下手固然仍是import语句了:

importorg.xml.sax.helpers.DefaultHandler;
importJavax.xml.parsers.*;
importorg.xml.sax.*;
importorg.xml.sax.helpers.*;
importJava.util.*;
importJava.io.*;

  然后,我们创立一个承继于DefaultHandler的类,详细的程序逻辑在这儿能够临时放在一边,要注重的是程序的布局:

publicclassSAXCounterextendsDefaultHandler{
privateHashtabletags;//这个Hashtable用来纪录tag呈现的次数
//处置文档前的事情
publicvoidstartDocument()throwsSAXException{
tags=newHashtable();//初始化Hashtable
}
//对每个入手下手元属举行处置
publicvoidstartElement(StringnamespaceURI,StringlocalName,
StringrawName,Attributesatts)
throwsSAXException
{
Stringkey=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也是成对呈现的,我们只必要剖析栈的布局,就能够很简单的晓得以后标签所处在文档布局中的地位了。

publicclassSAXReaderextendsDefaultHandler{
Java.util.Stacktags=newJava.util.Stack();
……

  在这儿固然没有利用到栈的剖析,但实践上栈的剖析是一件很简单的事变,应为Java.util.Stack承继了Java.util.Vector类,并且Stack中的元素是按栈的布局由底至上分列的,因个,我们可使用Vector类的size()办法来失掉Stack的元素个数,还可使用Vector的get(int)办法来失掉详细的每个元属。实践上,假如把Stack的元素从底向上一一分列出来,我们就失掉了从XML根节点到以后节点的一条独一的路径,有了这条路径的信息,文档的布局就在分明不外了。
  到今朝为止,我们已把握了关于XML编程的两年夜利器:DOM和SAX,也晓得了该怎样在一个Java程序中利用它们。DOM编程绝对复杂,可是速率对照慢,占用内存多,而SAX编程庞大一些,可是速率快,占用内存少。以是,我们应当依据分歧的情况选择利用分歧的办法。年夜部分的XML使用基础都能够用它们来办理。必要出格申明的是,DOM和SAX实在都是言语有关的,并不是Java所独占,也就是说,只需有响应的言语完成,DOM和SAX能够使用在任何面向对象的言语中。


还得说上一点,就java本质而言,是面相对象的,但是你有没有发现,java也不全是,比如说基本类型,int,那他就是整型而不是对象,转换类型是还得借助包装类。

谁可相欹 发表于 2015-1-20 18:33:40

Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。

柔情似水 发表于 2015-1-29 14:31:25

有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)

爱飞 发表于 2015-2-2 22:30:56

让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。

海妖 发表于 2015-2-2 22:36:44

是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言

透明 发表于 2015-2-6 01:40:59

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

分手快乐 发表于 2015-2-14 20:46:22

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

只想知道 发表于 2015-3-4 10:25:43

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言

再见西城 发表于 2015-3-4 10:25:44

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

活着的死人 发表于 2015-3-8 15:44:22

你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。

蒙在股里 发表于 2015-3-11 19:14:46

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

仓酷云 发表于 2015-3-19 08:53:13

你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。

第二个灵魂 发表于 2015-3-27 15:10:57

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
页: [1]
查看完整版本: JAVA编程:JSP与XML的分离