仓酷云

标题: JAVA教程之J2ME Web 服务进门 [打印本页]

作者: 只想知道    时间: 2015-1-18 11:22
标题: JAVA教程之J2ME Web 服务进门
其实你不用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推出以后,性能上又有了很大提高。
作者: 精灵巫婆    时间: 2015-1-18 21:38
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
作者: 谁可相欹    时间: 2015-1-23 18:43
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者: 再见西城    时间: 2015-1-31 19:13
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
作者: 金色的骷髅    时间: 2015-2-6 21:19
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
作者: 灵魂腐蚀    时间: 2015-2-12 15:53
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者: 变相怪杰    时间: 2015-2-26 10:05
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
作者: 小女巫    时间: 2015-3-8 13:23
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
作者: 山那边是海    时间: 2015-3-11 09:51
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者: 冷月葬花魂    时间: 2015-3-13 09:08
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者: 因胸联盟    时间: 2015-3-20 17:46
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2