java6新特性简介.ppt_第1页
java6新特性简介.ppt_第2页
java6新特性简介.ppt_第3页
java6新特性简介.ppt_第4页
java6新特性简介.ppt_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java6新特性简介,1、jaxb2、stax3、compilerapi4、轻量级httpserver5、用console开发控制台程序6、commonannotations7、web服务元数据(webservicesmetadata)8、jax-ws9、脚本语言支持(scripting),jaxb(javaarchitectureforxmlbinding)是一种特殊的序列化/反序列化工具。它可以使xml数据以javaobjects的形式直接应用于java程序之中,使javaobjects与xml数据之间的转换成为可能。在jaxb中将javaobjects到xml数据的转换称为marshal;xml数据到javaobjects的转换称为unmarshal。,jaxb,xjc命令行程序xjc用于编译dtd或schema生成与xml数据结构对应的javabeans类。操作方法如下:xjc-xmlschema|-dtdd保存java文件的目录pjava文件所在的包,jaxb,常用注解及其作用,jaxb,xmlaccessortype控制字段或属性的序列化。xmlaccesstype.field表示jaxb将自动绑定java类中的每个非静态的(static)、非瞬态的(由xmltransient标注)字段到xml。其他值还有xmlaccesstype.property和xmlaccesstype.none。xmljavatypeadapter使用定制的适配器(即扩展抽象类xmladapter并覆盖marshal()和unmarshal()方法),以序列化java类为xml。xmlelementwrapper对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的xml元素(称为包装器)。xmlrootelement将java类或枚举类型映射到xml元素。xmlelement将java类的一个属性映射到与属性同名的一个xml元素。xmlattribute将java类的一个属性映射到与属性同名的一个xml属性。,序列化(marshalling)与反序列化(unmarshalling),jaxb,/创建jaxb环境jaxbcontextcontext=jaxbcontext.newinstance(student.class);/创建编组marshallermarshaller=context.createmarshaller();/设置编组属性,使得输出的xml文档进行格式化(提供缩进)marshaller.setproperty(marshaller.jaxb_formatted_output,boolean.true);/编组到文件marshaller.marshal(student,file);/从文件解组到一个新对象中studentnewstudent=(student)context.createunmarshaller().unmarshal(file);,stax(jsr173)是jdk6.0中除了dom和sax之外的又一种处理xml文档的api。,stax,stax的来历在jaxp1.3(jsr206)有两种处理xml文档的方法:dom(documentobjectmodel)和sax(simpleapiforxml).由于jdk6.0中的jaxb2(jsr222)和jax-ws2.0(jsr224)都会用到stax所以sun决定把stax加入到jaxp家族当中来,并将jaxp的版本升级到1.4(jaxp1.4是jaxp1.3的维护版本).jdk6里面jaxp的版本就是1.4.,stax简介,stax,stax是thestreamingapiforxml的缩写,一种利用拉模式解析(pull-parsing)xml文档的api.stax通过提供一种基于事件迭代器(iterator)的api让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符;sax也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;dom采用的方式是将整个xml文档映射到一颗内存树,这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。,几种xml文档解析方式比较:,stax,dom(documentobjectmodel)文档对象模型分析方式。以层次结构(类似于树型)来组织节点和信息片段,映射xml文档的结构,允许获取和操作文档的任意部分。是w3c的官方标准。优点:1、允许应用程序对数据和结构做出更改。2、访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。缺点:1、通常需要加载整个xml文档来构造层次结构,消耗资源大。,几种xml文档解析方式比较:,stax,sax(simpleapiforxml)流模型中的推模型分析方式。通过事件驱动,每发现一个节点就引发一个事件,通过回调方法完成解析工作,解析xml文档的逻辑需要应用程序完成。优点:1、不需要等待所有数据都被处理,分析就能立即开始。2、只在读取数据时检查数据,不需要保存在内存中。3、可以在某个条件得到满足时停止解析,不必解析整个文档。4、效率和性能较高,能解析大于系统内存的文档。缺点:1、需要应用程序自己负责tag的处理逻辑(例如维护父/子关系等),使用麻烦。2、单向导航,很难同时访问同一文档的不同部分数据,不支持xpath。,几种xml文档解析方式比较:,stax,jdom(java-baseddocumentobjectmodel)java特定的文档对象模型。自身不包含解析器,使用sax。优点:1、使用具体类而不是接口,简化了dom的api。2、大量使用了java集合类,方便了java开发人员。缺点:1、没有较好的灵活性。2、性能较差。,几种xml文档解析方式比较:,stax,dom4j(documentobjectmodelforjava)简单易用,采用java集合框架,并完全支持dom、sax和jaxp。优点:1、大量使用了java集合类,方便java开发人员,同时提供一些提高性能的替代方法。2、支持xpath。3、有很好的性能。缺点:1、大量使用了接口,api较为复杂。,几种xml文档解析方式比较:,stax,stax(streamingapiforxml)流模型中的拉模型分析方式。提供基于指针和基于迭代器两种方式的支持。优点:1、接口简单,使用方便。2、采用流模型分析方式,有较好的性能。缺点:1、单向导航,不支持xpath,很难同时访问同一文档的不同部分。,由上面的测试结果可以看出,性能表现最好的是sax,其次是staxstream和staxevent,dom和dom4j也有着不错的表现。性能最差的是jdom。所以,如果你的应用程序对性能的要求很高,sax当然是首选。如果你需要访问和控制任意数据的功能,dom是个很好的选择,而对java开发人员来讲,dom4j是更好的选择。如果只需要做xml文档解析的话,综合性能、易用性、面向对象特征等各方面来衡量,staxevent无疑是最好的选择。,stax,jdk6的compilerapi(jsr199)可以动态编译java源文件,compilerapi结合反射功能就可以实现动态的产生java代码并编译执行这些代码,有点动态语言的特征。这个特性对于某些需要用到动态编译的应用程序相当有用,比如jspwebserver,当我们手动修改jsp后,是不希望需要重启webserver才可以看到效果的,这时候我们就可以用compilerapi来实现动态编译jsp文件,当然,现在的jspwebserver也是支持jsp热部署的,现在的jspwebserver通过在运行期间通过runtime.exec或processbuilder来调用javac来编译代码,这种方式需要我们产生另一个进程去做编译工作,不够优雅而且容易使代码依赖与特定的操作系统;compilerapi通过一套易用的标准的api提供了更加丰富的方式去做动态编译,而且是跨平台的。,compilerapi,jdk6提供了一个简单的httpserverapi,据此我们可以构建自己的嵌入式httpserver,它支持http和https协议,提供了http1.1的部分实现,没有被实现的那部分可以通过扩展已有的httpserverapi来实现,程序员必须自己实现httphandler接口,httpserver会调用httphandler实现类的回调方法来处理客户端请求,在这里,我们把一个http请求和它的响应称为一个交换,包装成httpexchange类,httpserver负责将httpexchange传给httphandler实现类的回调方法.,轻量级httpserver,jdk6中提供了java.io.console类专用来访问基于字符的控制台设备.你的程序如果要与windows下的cmd或者linux下的terminal交互,就可以用console类代劳.但我们不总是能得到可用的console,一个jvm是否有可用的console依赖于底层平台和jvm如何被调用.如果jvm是在交互式命令行(比如windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个可用的console实例。,用console开发控制台程序,commonannotations原本是javaee5.0(jsr244)规范的一部分,现在sun把它的一部分放到了javase6.0中.随着annotation元数据功能(jsr175)加入到javase5.0里面,很多java技术(比如ejb,webservices)都会用annotation部分代替xml文件来配置运行参数(或者说是支持声明式编程,如ejb的声明式事务),如果这些技术为通用目的都单独定义了自己的annotations,显然有点重复建设,所以,为其他相关的java技术定义一套公共的annotation是有价值的,可以避免重复建设的同时,也保证javase和javaee各种技术的一致性.,commonannotations,commonannotations,web服务元数据(webservicesmetadata),自从jdk5添加了元数据功能(annotation)之后,sun几乎重构了整个j2ee体系,由于变化很大,干脆将名字也重构为javaee,javaee(当前版本为5.0)将元数据纳入很多规范当中,这其中就包括webservices的相关规范,比以前的jax-rpc编程模型简单(当然,axis的编程模型也很简单).这里要谈的web服务元数据(jsr181)只是javaweb服务规范中的一个,它跟commonannotations,jaxb2,stax,saaj和jax-ws等共同构成javaee5的webservices技术堆栈.,下面介绍jsr-181里面各个元数据的相关参数及用途:,web服务元数据(webservicesmetadata),如何在jdk6环境下发布webservices和查看生成的wsdl:,web服务元数据(webservicesmetadata),1、将/bin加入path环境变量2、执行如下代码发布wsprovider到http:/localhost:8888/lj/wsprovider,wsgen-cp.webservices.wsprovider在这里可以执行wsprovider类的main方法就可以.在这个例子中会生成以下3个类的源代码文件及class文件sayhisayhiresponseprinttime3、在浏览器输入http:/localhost:8888/lj/wsprovider?wsdl就可以看到生成的wsdl,wsgen:,web服务元数据(webservicesmetadata),wsgen是在jdk的bin目录下的一个exe文件(windows版),该命令的主要功能是用来生成合适的jax-ws。它读取webservice的终端类文件,同时生成所有用于发布webservice所依赖的源代码文件和经过编译过的二进制类文件。命令参数说明:-cp定义classpath-r生成bean的wsdl文件的存放目录-s生成发布webservice的源代码文件的存放目录(如果方法有抛出异常,则会生成该异常的描述类源文件)-d生成发布webservice的编译过的二进制类文件的存放目录(该异常的描述类的class文件)命令范例:wsgen-cp./bin-r./wsdl-s./src-d./bin-wsdlorg.jsoso.jws.server.example,jax-ws2.0的来历,jax-ws,jax-ws(jsr-224)是javaarchitectureforxmlwebservices的缩写,简单说就是一种用java和xml开发webservices应用程序的框架,目前版本是2.0,它是jax-rpc1.1的后续版本,j2ee1.4带的就是jax-rpc1.1,而javaee5里面包括了jax-ws2.0,但为了向后兼容,仍然支持jax-rpc.现在,sun又把jax-ws直接放到了javase6里面,由于jax-ws会用到commonannotation(jsr250),javawebservicesmetadata(jsr181),jaxb2(jsr222),stax(jsr173),所以sun也必须把后几个原属于javaee范畴的components下放到javase,现在我们可以清楚地理解了为什么sun要把这些看似跟javase没有关系的components放进来,终极目的就是要在javase里面支持webservices.,jax-ws2.0的架构,jax-ws,jax-ws不是一个孤立的框架,它依赖于众多其他的规范,本质上它由以下几部分组成1、用来开发webservices的javaapi2、用来处理marshal/unmarshal的xmlbinding机制,jax-ws2.0用jaxb2来处理javaobject与xml之间的映射,marshalling就是把javaobject映射到xml,unmarshalling则是把xml映射到javaobject.之所以要做javaobject与xml的映射,是因为最终作为方法参数和返回值的javaobject要通过网络传输协议(一般是soap)传送,这就要求必须对javaobject做类似序列化和反序列化的工作,在soap中就是要用xml来表示javaobject的内部状态3、众多元数据(annotations)会被jax-ws用来描述webservices的相关类,包括commonannotations,webservicesmetadata,jaxb2的元数据和jax-ws2.0规范自己的元数据.4、annotationprocessingtool(apt)是jax-ws重要的组成部分,由于jax-ws2.0规范用到很多元数据,所以需要apt来处理众多的annotations.在/bin下有两个命令wsgen和wsimport,就是用到apt和compilerapi来处理碰到的annotations,wsgen可以为webservicesprovider产生并编译必要的帮助类和相关支持文件,wsimport以wsdl作为输入为webserviceconsumer产生并编译必要的帮助类和相关支持文件.5、jax-ws还包括jax-wsruntime与应用服务器和工具之间的契约关系,jax-ws2.0的编程模型,jax-ws,现在用jax-ws2.0来编写webservices非常简单,不像jax-rpc,jax-ws可以把任意pojo暴露为webservices,服务类不需要实现接口,服务方法也没有必要抛出rmi异常.下面介绍在jdk6环境下用jax-ws2.0开发和测试webservices的步骤1、编写服务类,并用webservicesmetadata(jsr-181)标注这个服务类,用web服务元数据中的wsprovider类作为服务类的例子,源代码可见上文。2、用wsgen生成上面服务类的必要的帮助类,然后调用用endpoint类的静态方法publish发布服务类(请参考web服务元数据),我在这里是将服务类发布到http:/localhost:8888/lj/wsprovider,jax-ws2.0的编程模型,jax-ws,3、用wsimport为服务消费者(也就是服务的客户端)生成必要的帮助类,命令如下:wsimport-d./bin-s./src-pwebservices.clienthttp:/localhost:8888/lj/wsprovider?wsdl这会在netcsdnbloglj下生成客户端的帮助类,在这个例子中会生成7个类helloservice.classobjectfactory.classpackage-info.classprintsystemtime.classsayhi.classsayhiresponse.classwsprovider.class,jax-ws2.0的编程模型,jax-ws,4、在客户端用下面代码即可调用步骤1定义的webservicehelloservicehs=newhelloservice();wsproviderws=hs.getwsproviderport();system.out.println(ws.sayhi(lj);ws.printsystemtime();调用上述代码后客户端控制台输出hi,lj服务端控制台输出服务器当前系统时间,wsimport,jax-ws,wsimport也是在jdk的bin目录下的一个exe文件(windows版),主要功能是根据服务端发布的wsdl文件生成客户端存根及框架,负责与webservice服务器通信,并在将其封装成实例,客户端可以直接使用,就像使用本地实例一样。对java而言,wsimport帮助程序员生存调用webservice所需要的客户端类文件.java和.class。要提醒指出的是,wsimport可以用于非java的服务器端,如:服务器端也许是c#编写的webservice,通过wsimport则生成java的客户端实现。命令参数说明:-d生成客户端执行类的class文件的存放目录-s生成客户端执行类的源文件的存放目录-p定义生成类的包名命令范例:wsimport-d./bin-s./src-porg.jsoso.jws.client.refhttp:/localhost:8080/hello?wsdl,概述:,脚本语言支持(scripting),jdk6增加了对脚本语言的支持(jsr223),原理上是将脚本语言编译成bytecode,这样脚本语言也能享用java平台的诸多优势,包括可移植性,安全等,另外,由于现在是编译成bytecode后再执行,所以比原来边解释边执行效率要高很多。,加入对脚本语言的支持后,对java语言也提供了以下好处。,脚本语言支持(scripting),1、许多脚本语言都有动态特性,比如,你不需要用一个变量之前先声明它,你可以用一个变量存放完全不同类型的对象,你不需要做强制类型转换,因为转换都是自动的。现在java语言也可以通过对脚本语言的支持间接获得这种灵活性。,加入对脚本语言的支持后,对java语言也提供了以下好处。,脚本语言支持(scripting),2、可以用脚本语言快速开发产品原型,因为现在可以edit-run,而无需edit-compile-run,当然,因为java有非常好的ide支持,我们完全可以在ide里面编辑源文件,然后点击运行(隐含编译),以此达到快速开发原型的目的,所以这点好处基本上可以忽略。,加入对脚本语言的支持后,对java语言也提供了以下好处。,脚本

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论