|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
其实你不用Struts,spring这些工具,直接用jsp,servlet能够很方便地写出来,而且,可以根据个人的水平、爱好,有很多方案。而struts,spring这些工具的出来。web简介
WSA计划用于与J2ME设置文件协同事情,J2ME设置文件要末基于ConnectedDeviceConfiguration(CDC),要末基于ConnectedLimitedDeviceConfiguration(CLDC1.0或CLDC1.1)。远程挪用API基于J2SE的JavaAPIforXML-BasedRPC(JAX-RPC1.1)的一个完全子集,它包括了一些远程办法挪用(RemoteMethodInvocation,RMI)类,以满意JAX-RPC依附。XML剖析API基于SimpleAPIforXML,v2(SAX2)的一个完全子集。
WSA的方针是把对Web服务挪用和XML剖析的基础撑持集成到设备的运转时情况,如许开辟职员就不用在每一个使用程序中嵌进如许的功效了――在像挪动德律风和团体数字助理如许资本无限的设备中,这算是一个出格华侈资本的成绩。
中心标准
WebServicesInteroperabilityOrganization(WS-I)增进了界说Web服务的中心标准和使用层协定,而且它们受WorldWideWebConsortium(W3C)和OrganizationfortheAdvancementofStructuredInformationStandards(OASIS)的引导。4个关头尺度划定了怎样创立、部署、发明和怎样利用Web服务:
Web服务尺度形貌
SimpleObjectAccessProtocol(SOAP)1.1界说了传输和数据编码
WebServicesDefinitionLanguage(WSDL)1.1界说了怎样形貌远程服务
UniversalDescription,Discovery,&Integration(UDDI)2.0界说了怎样发明远程服务
ExtensibleMarkupLanguage(XML)1.0和XMLSchema界说了可扩大标志言语(ExtensibleMarkupLanguage,XML)和XML形式(Schema)
这些次要标准常常十分普遍,并且Web服务开辟职员已发明难以完成完整互操纵性。为懂得决尺度注释中存在的差别,WS-I已界说了一组称作WS-IBasicProfile,version1.0的分歧性划定规矩。JSR172切合基础设置文件(BasicProfile)。
J2ME平台上的Web服务
JSR172划定了尺度化客户端手艺,同意J2ME使用程序在典范Web服务架构上利用远程服务,如所示:
在典范Web服务架构上的J2MEWeb服务
在高层,该Web服务架构具有三个元素:
驻留在撑持WSA无线设备上的收集感知使用程序。该使用程序包含利用JSR172运转库与收集举行通讯的JSR172存根。下文将会形貌存根和运转库所饰演的脚色。
无线收集和Internet和对应的通讯和数据编码协定,包含二进制协定、HTTP和SOAP/XML.
Web服务器,饰演服务供应者的脚色,一般在一个或多个防火墙和代办署理网关前面。Web服务器一般供应对公用收集上后端使用程序和服务器的会见。
WSA的第一个版本只办理了Web服务的利用,不撑持服务端点的创立和开辟;J2ME设备能够是服务用户,但不成所以服务供应者。JSR172还没有划定利用UDDI的服务发明的API。
懂得JSR172
起首考察怎样构造典范的基于JSR172的使用程序,入手下手懂得J2MEWebServices是怎样运作的:
该使用程序自己是一个基于挪动信息设备设置文件(MobileInformationDeviceProfile,MIDP)或团体基本设置文件(PersonalBasisProfile,PBP))的智能客户机,具有特定于营业的逻辑、用户界面、耐久性逻辑和性命周期和使用程序形态办理。该使用程序可使用JAXP子集API来处置XML文档。还可使用JAX-RPC子集API来利用Web服务,从而利用JSR172存根和运转库。
在像手提德律风如许的设备中,使用程序和JSR172存根一般驻留在设备内存中,而一切JSR172元素连同基本设置文件和设置一同嵌进到设备自己。
JSR172运转库和服务供应者接口
在JSR172操纵的中央是运转库,带有服务供应者接口,同意存根实行一切与挪用RPC服务端点有关的义务:
设置特定于RPC挪用的属性。
形貌RPC挪用输出和前往值。
编码输出值。
挪用RPC服务端点。
对使用程序解码并为其前往服务端点所前往的全体值。
刻画出了客户机使用程序、存根和运转库三者之间的干系:
JSR172运转库和SPI
固然JSR172运转库埋没了像毗连办理和数据编码如许的庞大性,但SPI从运转库完成细节分别出了存根,从而同意存根在供给商完成之间的可移植性。
客户机使用程序不间接与运转库和SPI举行交互;而是利用存根。运转库和SPI次要为盘算开辟JSR172运转库和主动化工具的第三方供给商所体贴,好比开辟职员用于天生存根的WSDL到Java映照工具。
因为使用程序开辟职员不间接利用SPI,因而本文不会较细致地先容运转库和SPI。假如想懂得关于它们的更多信息,能够查阅JSR172标准。
JSR172JAX-RPC子集API
正如后面所提到的,JSR172Web服务远程挪用API基于J2SE的JAX-RPC1.1API的一个完全子集。以以下表在高层形貌了该子集。要懂得具体信息,请参阅JSR172specification:
切合WS-IBasicProfile。
撑持SOAP1.1。
撑持一切传输,好比HTTP1.1,它能够传送SOAP动静,并且具有一个绑缚SOAP1.1的已界说协定。
撑持全套数据范例:逻辑型、字符型、短整型、整型、长整型、浮点型、双精度型、字符串型(String)、基础范例数组和庞大范例(包含基础或庞大范例的布局)。
注重,真实的浮点撑持只在基于CDC或基于CLDC1.1.OnCLDC1.0的软件仓库中呈现,浮点型和双精度型映照为String。还要注重,所撑持的数据范例会束缚所撑持的WSDL数据范例。前面的部分将会商WSDL到Java数据范例映照。
撑持暗示RPC挪用或呼应(利用Document/Literal动静传送形式的WSDL操纵)的SOAP动静的Literal暗示;不撑持Encoded暗示。
不撑持带有附件的SOAP动静。
不撑持SOAP动静处置程序。
不撑持服务端点;即不同意设备是Web服务供应者。
不供应发明撑持(UDDI).
要削减对收集带宽的需求――和要节俭用户的工夫和每字节的开支,请不要在设备自己上强迫利用XML编码。
注:完成大概会利用更高效的编码,好比设备与无线网关间的二进制协定,只需它抵消费者和临盆者来讲都是通明的。
下表形貌了JSR172JAX-RPC子会合的软件包:
Java软件包形貌
javax.microedition.xml.rpc界说了存根利用的Type,它是正当复杂范例的列举:逻辑型、字节型、短整型、整型、长整型、浮点型、双精度型、String
界说了存根利用的ComplexType,它是暗示WSDLxsd:complextype界说的特别范例
界说了存根利用的Element,它暗示WSDLxsd:element界说
界说了存根利用的Operation,它暗示服务端点的WSDLwsdl:operation
界说了FaultDetailHandler,这是一个处置自界说妨碍的存根所完成的接口
界说了存根利用的FaultDetailException,这是一个Exception类,暗示运转时完成抛出的作为JAXRPCException了局的非常;为service-specificDefines前往存根非常具体值所利用的QName(限制名)类,并将相干的QName前往给Stub实例
javax.xml.namespace界说了存根所利用的QName(限制名)类
javax.xml.rpc界说了Stub接口,这是一切JAX-RPC存根的基础接口;还界说了NamespaceConstants和与JAXRPCException有关的类
java.rmi尺度java.rmi软件包子集,包括它以满意JAX-RPC依附性;只界说了Remote处置程序和三个非常类:MarshalException、RemoteException和ServerException
除像RemoteException如许的非常,存根还利用年夜多半上述API;使用程序自己利用存根。
在使用程序中利用JAX-RPC子集
创立JSR172JAX-RPC客户机的一样平常步骤以下:
从形貌远程Web服务的WSDLXML文档天生JSR172JAX-RPC存根类。
在本人的代码中创立天生存根的实例。
实例化以后,挪用天生存根的办法。这些办法与WSDLXML文档中服务端点的wsdl:操纵绝对应。
天生JSR172JAX-RPC存根
客户机使用程序经由过程存根和设备的JSR172运转库与远程服务举行交互。该运转库埋没了与毗连、SOAP和数据编码办理相干的庞大性。
要与运转库举行交互,客户机一般利用存根天生器所天生的存根大概WSDL到Java的映照工具,它们用于在WSDL文档中输出远程服务接口界说,并天生利用JAX-RPC子集API和运转库SPI的存根类。固然也妙手工开辟这些存根,但利用该天生器效果会更佳。下图概述了存根的天生:
天生JSR172存根的一样平常步骤。最初所失掉的存根类完成了StubInterface和服务的远程接口,并利用了撑持类。
天生JSR172JAX-RPC存根的步骤相似于创立基于RMI的使用程序的步骤。在尺度RMI中,RMI编译器(rmic)从远程接口界说天生存根。如所示,创立WSA使用程序以后,WSDL到Java的映照工具从WSDLXML文件天生存根。映照工具天生远程接口Java文件和撑持类,它们由天生的存基本身所利用。然后将JSR172存根编译为Java类,并同使用程序一同打包。
Sun的J2MEWirelessToolkitV2.1包括JSR172JAX-RPC存根天生器――本文稍后将报告怎样利用它。第三方供给商供应了本人的存根天生器。
利用JSR172JAX-RPC存根
存根一旦天生了,使用程序就能够利用它了。以下代码片断利用了称作PubService的服务,以便检索无线手艺文章:
packagej2medeveloper.pubwebservice
//MIDP
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.lcdui.Display;
importjavax.microedition.lcdui.Form;
...
//JAX-RPC
importjava.rmi.RemoteException;
//JAX-RPC
StringserviceURL="www.j2medeveloper.com/pubwebservice";
StringarticleID="IntroJSR172";
...
//Instantiatetheservicestub.
PubService_Stubservice=newPubService_Stub();
//Setupthestub.
service._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY,serviceURL);
service._setProperty(Stub.SESSION_MAINTAIN_PROPERTY,newBoolean(true));
...
try{
//InvokethePubServicemethodgetArticleByID()toretrieve
//aspecificarticlebyID.AWirelessArticlerepresentsan
//articleandhasmethodstogetthearticlesauthor,date,
//title,summary,andbody.PubServicealsohasamethodto
//getthePubServicesRSSfeed.
WirelessArticlearticle=service.getArticleByID(articleID);
//CreateaFormtodisplaythearticle.
javax.microedition.lcdui.Formform=
newForm(article.getShortTitle());
form.append(wrap(article.getSummary()));
...
...
display.setCurrent(form);
}catch(RemoteExceptione){
//HandleRMIexception.
}catch(Exceptione){
//Handleexception.
}
...
利用存根会使远程服务挪用变得十分简单。该代码用例子申明了PubService_Stub,初始化了实例,并挪用了它的个中一个办法getArticleByID(),以便对文章自己举行检索。然后,使用程序利用了文章的会见办法来猎取文章的题目、择要等等。
注重,由于挪用PubService_Stub.getArticleByID()是分块挪用,因而在实践使用程序中,要用分别的线程来分拨该挪用。在WSA中,办法挪用遵守罕见的客户机/服务器交互的同步哀求-呼应模子:客户机向服务器收回哀求,然后守候服务器的呼应:
同步哀求/呼应模子
怎样对办法及其参数举行编码、序列化和发送,和怎样吸收、解码和反序列化呼应,对使用程序来讲是完整通明的。JSR172存根和运转库处置一切这些单调冗杂的细节。
将WSDL数据范例映照到Java
上面扼要考查一下JSR172的JAX-RPC子集API中的WSDL到Java的数据范例映照:
WSDL数据范例Java数据范例
xsd:stringString
xsd:intint或Integer
xsd:longlong或Long
xsd:shortshort或Short
xsd:booleanboolean或Boolean
xsd:bytebyte或Byte
xsd:floatString、float或Float
xsd:doubleString、double或Double
xsd:QNamejavax.xml.namespace.QName
xsd:base64Binarybyte[]
xsd:hexBinarybyte[]
Arrays取决于XML数组的形式
xsd:complexType基础和类范例的序列
别忘了,由于CLDC1.0不撑持浮点范例,因而必定要将浮点型和双精度型映照为String型。当方针既包括CLDC1.0又包括CLDC1.1平台时,开辟职员应利用该默许映照。
要懂得关于WSDL的更多信息,请参阅JSR172specification和W3CsWSDLspecification。
在使用程序中利用JAXP子集
如今将注重力转移到JAXP子集――其他JSR172API。记得JAXP和JAX-RPC都是可选软件包;它们相互自力地存在。
JAXPXML剖析API基于SimpleAPIforXMLv2(SAX2)的一个完全子集。固然尺度SAX2API中的年夜多半类没被包括在该子会合,但保存有一切需要的中心功效。
以以下表在高层形貌了JAXP子集。要懂得更多信息,请参阅JSR172specification:
基于SAX2.0的一个完全子集不撑持SAX1.0,由于SAX2.0已将它代替了。
撑持XML定名空间
既撑持UTF-8又撑持UTF-16字符编码。
要末不撑持文档对象模子(DocumentObjectModel(DOM))的Level1.0,要末不撑持DOM的Level2.0,由于思索到它太粗笨。
不撑持可扩大款式表言语转换(ExtensibleStylesheetLanguageTransformations,XSLT)。
撑持文档范例界说(DocumentTypeDefinition,DTD)。
剖析器能够依据XML文档范例的指定外部或内部界说来对这些文档举行考证。JSR172划定,文档考证是可选的,由于该操纵开支极年夜,一个文档在限定较高的基于CLDC的情况不合适,但大概会在更高真个基于CDC的平台上取得乐成。假如跳过DTD处置,DefaultHandler.skippedEntity()办法就会关照使用程序。该逻辑切合XML1.0标准。
下表形貌了JSR172JAXP子会合的软件包:
Java软件包形貌
javax.xml.parsers界说了SAXParser,这是一个暗示复杂的基于SAX的剖析器的API。
界说了SAXParserFactory,这是一个取得和设置基于SAX的剖析器的工场。
界说了ParserConfigurationException,抛出时唆使设置毛病。
界说了FactoryConfigurationError,抛出时唆使剖析器工场的成绩。
org.xml.sax界说了Attributes,这是一个经由过程以下情势供应对属性列表举行会见的接口:
属性索引
限制定名空间的称号
限制(前缀)称号
界说了Locator,这是一个用于将SAX事务与文档地位相干联的接口。经由过程利用Locator(该Locator经由过程挪用DefaultHandler对象的setDocumentLocator()办法而指定)的实例,该使用程序能够猎取剖析事务地位信息,好比事务行号、列号和大众和体系标识符。
Locator供应了猎取以后文档事务停止地位的行号、列号的办法和猎取以后文档事务的大众和体系标识符的办法。
界说了InputSource,它封装输出源。它供应了猎取或设置字撙节、字符集、编码和大众和体系标识符的办法。
界说了通用SAX非常类、SAXException和三个子类:SAXNotRecognizedException、SAXNotSupportedException和SAXParseException
org.xml.sax.helpers界说了DefaultHandler,这是SAX2事务处置程序的基类。它供应了要扩大的使用程序的事务处置举动的缺省完成。使用程序开辟职员只需掩盖相干的办法,就能够计划剖析举动。
在读取XML流的时分,当剖析器与XML元素或属性产生抵触时,它就经由过程挪用个中一个DefaultHandler办法来关照断定事务的使用程序;比方:
startDocument()和endDocument(),在XML文档的开首和开端
startElement()和endElement(),在XML元素的开首和开端
characters(),当在元素外部发明字符数据时
skippedEntity(),当跳过一个实体时
JSR172specification形貌了DefaultHandler办法的其他部分。
以下办法界说显现了怎样利用JAXP来剖析从PubService检索的RSS提纲:
/**
*InvoketheserviceandparsetheRSSfeed.
*/
privatevoidparseRSSfeed(){
try{
//CreateaRSSparserhandler
parser=newRSSParserHandler();
try{
SAXParserFactoryfactory=SAXParserFactory.newInstance();
saxParser=factory.newSAXParser();
}catch(Exceptione){
//Handleexception...
return;
}
//InvoketheremoteservicemethodgetRSSFeedto
//retrievetheRSSfeedforthePubservice
//website.
StringrssFeed=service.getRSSFeed();
//ParsetheRSSfeed.
byte[]rssFeedByteArray=rssFeed.getBytes("UTF-8");
ByteArrayInputStreamrssFeedByteArrayInputStream=
newByteArrayInputStream(rssFeedByteArray);
saxParser.parse(rssFeedByteArrayInputStream,parser);
}catch(RemoteExceptione){
//HandleRMIexception.
}catch(Exceptione){
//Handleexception.
}
}
parseRSSfeed()办法利用PubService_Stub.getRSSFeed()远程服务来检索PubService的RSSContentXML文档,然后将其传送到JAXPRSS-feedXML剖析器。以下类界说显现了怎样完成卖力剖析RSS提纲的处置程序:
/**
*RSSParserhandlerclasstoparsetheRSSfeedfromthe
*server.
*/
classRSSParserHandlerextendsDefaultHandler{
//Stacktokeeptrackofdocumentparsing.
Stackstack;
//Currentdocumentelement.
Objectcurrent;
/**Startofdocumentprocessing.*/
publicvoidstartDocument(){
rssParsingComplete=false;
title=link=description=null;
stack=newStack();
}
/**Processthenewelement.*/
publicvoidstartElement(
Stringuri,StringlocalName,StringqName,
Attributesattributes)throwsSAXException{
if("item".equals(qName)){
title=link=description=null;
}
stack.push(qName);
}
/**Processthecharacterdataforcurrenttag.*/
publicvoidcharacters(
char[]ch,intstart,intlength){
Objectcurrent=stack.peek();
if("title".equals(qName)){
title=newString(ch,start,length));
}elseif("link".equals(qName)){
link=newString(ch,start,length));
}elseif("description".equals(qName)){
description=newString(ch,start,length));
}
}
/**Processtheendelementtag.*/
publicvoidendElement(
Stringuri,StringlocalName,StringqName){
stack.pop();
if("rss".equals(qName)){
rssParsingComplete=true;
}else{
//Dosomethingwithtitle,link,description,such
//asdisplayingittotheuser.
}
}
}
注重,startDocument()、startElement()、stopElement()和characters()办法的界说供应了SAX2XML剖析所需的最低功效。
撑持Web服务的J2ME无线工具包
J2MEWirelessToolkitv2.1包括开辟充实使用J2MEWebService的MIDlet所需的库。该工具包还包括JAX-RPC存根天生器,能够从命令行或KToolbar菜单运转它,以下图所示:
J2ME无线工具包2.1有用程序和存根天生器
在Utilities屏幕上选择StubGenerator。在呈现的对话框中,输出形貌要利用服务的输出WSDL文档的URL、天生文件的输入路径和用于已天生存根文件的软件包名。响应地选择CLDC1.0或1.1。
J2ME无线工具包的v2.1还包括一个示例使用程序JSR172Demo。
停止语
J2MEWeb服务标准(J2MEWebServicesSpecification)使J2ME平台上的Web服务和XML剖析编程接口尺度化了。跟着JAX-RPC子集API的呈现,开辟职员可使用Java编程言语和熟习的JAX-RPCAPI来创立利用基于XML的远程服务的使用程序。而不用处置HTTP、SOAP和数据转换的底层细节。并且跟着JAXP子集API的引进,XML剖析今朝已经是J2ME平台自己不成支解的一部分。J2MEWebServicesAPI打消了开辟职员在每一个使用程序中包括用于远程挪用和XML剖析代码的必要。
这些功效壮大的API同意挪动使用程序更简单地会见基于Web的服务,可是开辟职员万万别忘了J2ME设备供应的受限定的使用程序情况。仅仅移植现有的基于XML的桌面或企业使用程序不是开辟J2ME平台的Web服务客户机的得当办法。对设备处置才能、电池寿命、收集带宽和平安性的得当思索也是不成短少的。
更多信息
JSR172:J2MEWebServicesSpecification
WebServicesInteroperabilityOrganization(WS-I)
WorldWideWebConsortium(W3C)
OrganizationfortheAdvancementofStructuredInformationStandards(OASIS)
TheComplexityofDevelopingMobileNetworkedDataServices,J2MEWirelessConnectionWizardForSunJavaSystemStudio
W3CWSDLwebsite
先说优点,首先和C,C++这些语言比起来,java很简单,去掉指针的java,非常好理解,自动垃圾回收机制也很好,自从JDK1.5推出以后,性能上又有了很大提高。 |
|