仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1439|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA教程之XML使用与XGen实战

[复制链接]
愤怒的大鸟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:37:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
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:36 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
若天明 该用户已被删除
板凳
发表于 2015-1-27 11:56:53 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
若相依 该用户已被删除
地板
发表于 2015-2-3 12:57:36 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
小魔女 该用户已被删除
5#
发表于 2015-2-7 17:46:33 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
海妖 该用户已被删除
6#
发表于 2015-2-8 12:09:17 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
谁可相欹 该用户已被删除
7#
发表于 2015-2-9 23:21:45 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
冷月葬花魂 该用户已被删除
8#
发表于 2015-2-25 22:53:33 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
兰色精灵 该用户已被删除
9#
发表于 2015-3-8 09:56:14 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
愤怒的大鸟 该用户已被删除
10#
 楼主| 发表于 2015-3-11 22:04:01 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
再现理想 该用户已被删除
11#
发表于 2015-3-17 10:10:28 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
只想知道 该用户已被删除
12#
发表于 2015-3-20 12:36:35 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
13#
发表于 2015-3-28 16:25:13 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
飘飘悠悠 该用户已被删除
14#
发表于 2015-4-1 20:11:19 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
活着的死人 该用户已被删除
15#
发表于 2015-4-28 11:54:23 | 只看该作者
是一种使用者不需花费很多时间学习的语言
简单生活 该用户已被删除
16#
发表于 2015-4-29 16:44:04 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
小妖女 该用户已被删除
17#
发表于 2015-6-8 22:44:47 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
金色的骷髅 该用户已被删除
18#
发表于 2015-6-22 02:56:39 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
再见西城 该用户已被删除
19#
发表于 2015-6-29 00:08:51 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
灵魂腐蚀 该用户已被删除
20#
发表于 2015-7-1 06:34:59 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 21:12

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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