仓酷云
标题:
JAVA教程之XML使用与XGen实战
[打印本页]
作者:
愤怒的大鸟
时间:
2015-1-18 11:37
标题:
JAVA教程之XML使用与XGen实战
windows系统样,他们做了什么事或者留了一些后门程序,谁都不知道,二,java开发是跨平台,任何系统上都可以运行,对于保密型系统和大型系统开发这是必要的xml现在仿佛任何的软件开辟都离不开XML手艺撑持,在图形图象、数据库、加密平安、软件工程、收集教导、电子商务、语音手艺上都有XML发挥拳脚的中央,XML使用年夜潮已光降。
XML事情小组开创会员C.M.Sperberg-McQueen以为:“XML最年夜的影响在于XML软件大批衰亡:XML分析器、XML程序言语库、XSLT处置器、XSLFO处置器、数据库承受XML―不但云云,另有收集扫瞄器也承受XML。”也正由于云云,IBM、微软、SUN、惠普、Oracle等至公司纷繁进进这个市场。
在学会了XGen等对象绑定工具后,信任人人已是伎痒,但愿立即用XGen来实战一下,体验一下XML对象绑定的上风。上面就先容一下我常常用到的XML使用。
1.XML设置文件
每一个体系大概都必要或年夜或小的设置文件,经由过程设置文件来初始化体系的参数,优点不必具体先容了。一样平常设置文件的格局有以下种:
1.window体系中ini格局文件和Java言语中利用的Properties文件
2.XML格局的文件
3.其他格局文件
第一品种型的设置文件是纯文本文件,基础接纳“key=value”的格局来纪录各类参数,便于手工誊写和浏览。
基于XMLSchema的XML文件易于浏览,而且能十分好的显现各个元素之间的条理干系和束缚干系。相对ini文件格局利用xml格局的设置文件有以下长处:
1.1.设置具有条理性
1.2.取值无效性反省
1.3.撑持链表,列举,庞大数据范例
1.4.设置文件能够嵌套
1.5.分离XMLSpy等XML编纂工具编纂设置文件非常便利
1.6.存在大批第三方的XML对象绑定工具,而且功效壮大、开辟便利。如Java言语版的XGen、JAXB,C++版工具XBind
如今就使入手下手理论利用XML作为程序利用的设置文件吧。
1.1.计划XSD文件(XMLSchema)
XGen必要编译的是XSD文件,XSD文件是用来形貌指定范例的XML文件的纲目文件,是个纯文本文件。经由过程本文编纂工具就能够手工创立、编纂XSD文件,可是经由过程一些XML编纂工具能够事半功倍的完成XSD编写事情。我也用过一些XML编纂工具,可是只要XMLSPY的功效最壮大,而且利用十分便利。
XMLSpy的一些特征:
l在编纂XML、XSD等文件时具有提醒输出功效,能够十分便利的选择。
l同时具有XML文件正当性校验功效,能够判别Element值的取值是不是切合schema的界说。
l撑持DTD和XSD互转
l供应XSD的样例XML实例文件功效
l一样撑持java,c++,c#的xml绑定,能够天生Java,c++和C#代码,不要太壮大哦!
经由过程XMLSpy编写AlertServer.xsd文件
<?xmlversion="1.0"?>
<xsd:schematargetNamespace="urn:com:lianchuang:smartsecurer:alert:config:configfile.xsd"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns="urn:com:lianchuang:smartsecurer:alert:config:configfile.xsd"elementFormDefault="qualified"attributeFormDefault="unqualified">
<xsd:elementname="Config"type="ConifgType"/>
<xsd:complexTypename="ConifgType">
<xsd:sequence>
<xsd:elementref="Globe"/>
</xsd:sequence>
</xsd:complexType>
<xsd:elementname="Globe"type="GlobeType"/>
<xsd:complexTypename="GlobeType">
<xsd:sequence>
<xsd:elementref="AlertServer"/>
<xsd:elementref="VOManager"maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:elementname="AlertServer"type="AlertServerType"/>
<xsd:complexTypename="AlertServerType">
<xsd:sequence>
<xsd:elementname="ID"type="xsd:int"/>
<xsd:elementname="Address"type="xsd:string"default="127.0.0.1"minOccurs="0"/>
<xsd:elementname="Port"type="xsd:int"default="1099"minOccurs="0"/>
<xsd:elementname="AlertServerName"type="xsd:string"minOccurs="0"/>
<xsd:elementname="RegisterInterval"type="xsd:int"default="1000"minOccurs="0"/>
<xsd:elementname="CacheSize"type="xsd:int"default="10000"minOccurs="0"/>
<xsd:elementname="DeliverThreadNum"type="xsd:int"default="2"minOccurs="0"/>
<xsd:elementref="DBOperMode"default="Default"minOccurs="0"/>
<xsd:elementname="BatchDBInsertSize"type="xsd:int"default="1000"minOccurs="0"/>
<xsd:elementname="StatisticsInterval"type="xsd:int"default="1000"minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:elementname="VOManager"type="VOManagerType"/>
<xsd:complexTypename="VOManagerType">
<xsd:sequence>
<xsd:elementname="Address"type="xsd:string"/>
<xsd:elementname="Port"type="xsd:int"default="1099"minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:elementname="DBOperMode">
<xsd:simpleType>
<xsd:restrictionbase="xsd:string">
<xsd:enumerationvalue="Default"/>
<xsd:enumerationvalue="Native"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:schema>
注重<xsd:schema>设置
elementFormDefault="qualified"attributeFormDefault="unqualified"属性
,不然在unmarshal(InputStream,valid)办法挪用中会有非常。如许设置暗示限定部分元素和属性,即对每一个部分的元素都要设定前缀。
当将elementFormDefault设置为qualified时,它暗示在该语法的实例中,必需利用前缀或经由过程设置{默许定名空间}来显式限制一切元素。unqualified设置意味着只要全局声明的元素才必需被显式限制,而部分声明的元素不得被限制。在此情况下,限制一个部分声明是毛病的。一样,将attributeFormDefault设置为qualified时,必需利用前缀显式限制实例文档中的一切属性。
1.2.创立Java对象
进进xgen安装目次,为了费事将AlertServer.xsd文件拷贝到该目次下。实行以下剧本:
xgenAlertServer.xsd
在以后目次下,会依照urn路径天生comlianchuangsmartsecureralertconfigconfigfile_xsd目次,而且新创立的class文件就保留在该目次下。若在XSD中界说了自界说庞大范例数据,则会在configfile_xsd
目次下创立 ype目次,并把相干的JavaClass放在该目次下。
1.3.编写代码
关于界说XSD文档,每一个庞大范例的ElementA,会有ElementA和ElementATypeComplexType类来作为该Java类的映照,经由过程getElementATypeComplexType()办法间接能够猎取猎取ElementA的庞大对象范例的援用。
如在XSD文件中的Globe,能够经由过程XXX.getConifgTypeComplexType().getGlobe()来猎取该Java对象,经由过程config.getConifgTypeComplexType().getGlobe().getGlobeTypeComplexType()来猎取实践的该范例的对象。
关于一些基础范例Element。XGen界说了一些X开首的类与之对应,如int,用XInt暗示。能够经由过程newXInt(inti)来机关XInt对象。
//上面是读取指定的设置文件,前往Java对象的代码
publicstaticsynchronizedConfiggetConfig(StringfileName)throws
FileNotFoundException
{
//创立InputStream对象
Filefile=newFile(fileName);
FileInputStreamins=newFileInputStream(file);
ChainedEntityResolverer=newChainedEntityResolver();
Unmarshallerun=newUnmarshaller(er);
GlobalElementge=null;
try
{
ge=un.unmarshal(ins,false);//注重,因为自己对XML和XSD也是一孔之见,unmarshal的办法实验了一遍,只要利用这个办法,才能够一般转化xml文件的对象。不晓得为何…
if(ge!=null&&geinstanceofConfig)
configInstance=(Config)ge;
}
catch(ValidationExceptionex)
{
m_log.error(ex);
}
catch(MarshalExceptionex)
{
m_log.error(ex);
}
catch(IOExceptionex)
{
m_log.error(ex);
}
returnconfigInstance;
}
//上面是打印对象各个属性参数的样例代码
publicstaticvoidprintConfig(Configconfig)
{
if(config==null)
return;
m_log.debug("================AlertServerParameters==================");
m_log.debug("ID="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().getAlertServer().
getAlertServerTypeComplexType().getID());
m_log.debug("Address="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().
getAlertServer().getAlertServerTypeComplexType().getAddress());
m_log.debug("Port="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().
getAlertServer().getAlertServerTypeComplexType().getPort());
m_log.debug("AlertServerName="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().getAlertServer().
getAlertServerTypeComplexType().getAlertServerName());
m_log.debug("RegisterInterval="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().getAlertServer().
getAlertServerTypeComplexType().getRegisterInterval());
m_log.debug("DeliverThreadNum="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().
getAlertServer().getAlertServerTypeComplexType().
getDeliverThreadNum());
m_log.debug("CacheSize="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().getAlertServer().
getAlertServerTypeComplexType().getCacheSize());
m_log.debug("BatchDBInsertSize="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().getAlertServer().
getAlertServerTypeComplexType().getBatchDBInsertSize());
m_log.debug("=================VOManagerParameters==================");
for(inti=0;
i<
config.getConifgTypeComplexType().getGlobe().getGlobeTypeComplexType().
getVOManagerCount();
++i)
{
m_log.debug("VOMangerAddress="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().getVOManager()[i].
getVOManagerTypeComplexType().getAddress());
m_log.debug("VOMangerPort="+
config.getConifgTypeComplexType().getGlobe().
getGlobeTypeComplexType().getVOManager()[i].
getVOManagerTypeComplexType().getPort());
}
}
2.使用XML格局的动静通讯
编写自界说Socket通讯程序时,都必要本人界说一套通讯协定的标准,特别是异构的体系。我们可使用xml文档作为通讯协定,分离XML相干的对象绑定工具来将XML格局的报文转换为Java、C++等言语的对象。
上面以Java言语分离XGen利用样例形貌通讯的流程。
2.1.通讯流程
l发送XML对象
经由过程程序创立相干的对象,并赋值。经由过程unmarshal办法转化为StringWriter对象,利用StringWriter的getBuffer().toString()办法前往转化好的字符串。最初,使用socket发送该String。
l吸收XML对象
吸收到XML文档后,marshal到Java对象便可。
2.2.详细手艺
l通讯中加密
因为经由过程XML文档举行通讯,数据包是明文的文本,关于一些敏感数据必要举行得当的加密。如间接对XMLw文档长进行DES然后传送,大概依据情形接纳更平安的加密体例。
l发送XML文档
//UDPSocket
DatagramSocketdiscoverySocket=null;
//发送的数据包
DatagramPacketdgp=null;
//将XML对象转化StringWriter对象,即转化为字符串对象
StringWritersw=newStringWriter();
//XML绑定对象
requestreq=null;
//必要发送的字符数组
byte[]sendBytes=null;
……
……
try
{
//创立XML文档对象
req=XMLObjAnalysis.makeRequset(m_agentDisc.m_configFileName,
getDiscoverRespSeqNo(),
XMLObjAnalysis.DISCOVERY_REQUEST);
sw.getBuffer().setLength(0);
//将哀求对象序列化为xml字符串
req.getRequestTypeComplexType().setRequestAgentIp(newXString(
agentKey.getRequestIp()));
req.marshal(sw);
//将XML文档经由过程DES加密
sendBytes=getDESBytes(sw.getBuffer().toString().
getBytes(),true);
if(sendBytes!=null)
{
dgp=newDatagramPacket(sendBytes,sendBytes.length);
dgp.setAddress(ia);
dgp.setPort(agentKey.getPort());
m_log.debug("Senddiscoverypdu:"+agentKey.getRequestIp()+
":"+
agentKey.getPort()+",size="+
sendBytes.length);
//m_log.debug(newString(sw.getBuffer()));
discoverySocket.send(dgp);
}
}
catch(Exceptionex4)
{
m_log.error(ex4);
}
l吸收XML文档
inGram=
newDatagramPacket
(inBuffer,inBuffer.length);
try
{
for(;;)
{
try
{
inSock.receive(inGram);
}
catch(IOExceptionex)
{
m_log.error
("ERRORreadinginputsocket:"
+ex.getMessage());
//break;
}
catch(Exceptionex)
{
ex.printStackTrace();
try
{
Thread.sleep(100);
}
catch(InterruptedExceptionex2)
{
}
//return;
continue;
}
recvBytes=newbyte[inGram.getLength()];
System.arraycopy(inGram.getData(),0,recvBytes,0,inGram.getLength());
dealAgentMessage(recvBytes,hostName);
}
}
finally
{
if(inSock!=null)
inSock.close();
}
privatevoiddealAgentMessage(finalbyte[]origRecvBytes)
{
BasicInforesp=null;
//解密XML文档
byte[]recvBytes=m_agentDisc.getDESBytes(origRecvBytes,false);
//将encoding标签改成gb2312,如许能够剖析出元素中的中文,不然,没法准确转化为中文
Stringorig=newString(recvBytes);
orig=orig.replaceAll("encoding="UTF-8"","encoding="gb2312"");
//将字符串转化为ByteArrayInputStream
ByteArrayInputStreambais=newByteArrayInputStream(orig.trim().
getBytes());
try
{
//将XML文档转换为对象
resp=XMLObjAnalysis.getResponseFromXMLStream(bais);
}
catch(Exceptionex1)
{
m_log.error(ex1);
}
StringrequestAgentIp=resp.getBasicInfoTypeComplexType().
getRequestAgentIp().get();
if(resp==null)
{
m_log.error("Decodereponseerror.Ip="+requestAgentIp);
return;
}
//判别是不是是代办署理主动发明的呼应数据
if(resp.getBasicInfoTypeComplexType().getResponse().
getResponseChoiceComplexType().getAutoDiscoveryAsChoice()!=null)
{
……
}
elseif(resp.getBasicInfoTypeComplexType().getResponse().
getResponseChoiceComplexType().getHealthCheckAsChoice()!=null)
{
……
}
}
你说是sun公司对她研究的透还是微软?针对自己工具开发的.net性能上肯定会站上风的。
作者:
爱飞
时间:
2015-1-21 11:07
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
作者:
若天明
时间:
2015-1-27 11:56
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
作者:
若相依
时间:
2015-2-3 12:57
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
作者:
小魔女
时间:
2015-2-7 17:46
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者:
海妖
时间:
2015-2-8 12:09
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
作者:
谁可相欹
时间:
2015-2-9 23:21
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者:
冷月葬花魂
时间:
2015-2-25 22:53
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者:
兰色精灵
时间:
2015-3-8 09:56
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
作者:
愤怒的大鸟
时间:
2015-3-11 22:04
Java 编程语言的风格十分接近C、C++语言。
作者:
再现理想
时间:
2015-3-17 10:10
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者:
只想知道
时间:
2015-3-20 12:36
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者:
仓酷云
时间:
2015-3-28 16:25
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
作者:
飘飘悠悠
时间:
2015-4-1 20:11
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
作者:
活着的死人
时间:
2015-4-28 11:54
是一种使用者不需花费很多时间学习的语言
作者:
简单生活
时间:
2015-4-29 16:44
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
作者:
小妖女
时间:
2015-6-8 22:44
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
作者:
金色的骷髅
时间:
2015-6-22 02:56
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者:
再见西城
时间:
2015-6-29 00:08
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
作者:
灵魂腐蚀
时间:
2015-7-1 06:34
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2