`
jinyanhui2008
  • 浏览: 320418 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

j2me使用ksoap2开发webservice应用

阅读更多

今天突然心血来潮想写写关于j2me开发一些心的。

因为项目需要需要使用j2me开发,并且需要调用远程服务器,开始使用JSR 172开发,后来发现很多手机并不支持JSR 172,如果您是针对特定机型来开发并且那款机器支持JSR 172标准的话,恭喜你,我的教程您可以不用看了,因为用JSR 172开发超级简单。

好了回到正题,正式开始讲解。

首先说点废话,您需要下载、以及kxml2。

下载地址:http://downloads.sourceforge.net/ksoap2/ksoap2-j2me-core-2.1.2.jar?modtime=1173974533&big_mirror=0

http://downloads.sourceforge.net/kxml/kxml2-2.3.0.jar?modtime=1151079308&big_mirror=0

您可以去这里下载,下载好了导入你的工程即可。

剩下的当然就是代码啦。。。呵呵

由于我是直接从项目中拷贝出来的,所以一些细节东西我就不进行更改了

现在贴上核心代码:

String serviceNamespace = WebServiceUrl.URL + "service/SalesDataCollectionService";//WebServiceUrl.URL 这里面存放了一个具体的url地址便于 我调试使用,我的地址里面写的其实是 http://localhost:8080/
String serviceURL = WebServiceUrl.URL + "service/SalesDataCollectionService";//具体用处不是很大,因为和上面的地址是一样的,用上面的地址也是一样能跟完成的。
String methodName = "getXtm12ByXtwpdm";//调用的具体方法。这个方法需要传入一个参数,返回一个bean给用户。

SoapObject request = new SoapObject(serviceNamespace, methodName);//这里是一些准备工作,具体用处我就不多介绍了,因为我也不是很明白

request.addProperty( "xtwpdm",getTextFieldXtwpdm().getString());//这里是传入的参数,如果是多条参数就多复制几下就行了。他是一个键值对应的,其实也是按添加顺序来做的,你只要按照顺序往里面添加就行了,不过我的习惯是按照服务器端的名字对应填入键值。

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);//类似于创建了一个连接工厂,因为我英语很烂,所以具体什么意思我也没弄明白,反正照着敲就不会错。
envelope.bodyOut = request;//将填入参数的request放入envelope 当中
(new MarshalBase64()).register(envelope);//需要做一下转码,其实用处不是很大,不过做总比不做好。要不不同的系统谁知道会出现什么问题呢。

HttpTransport ht = new HttpTransport(serviceURL);//创建连接了
ht.debug = true;//可以为false
ht.call(null, envelope);//调用webservice了

if(envelope.getResponse()!=null){//判断是否返回结果,因为我这个是一个查询操作,是带有返回值的。byte[] bb = Base64.decode(envelope.getResponse().toString());将返回的结果进行转码,从string类型转换为byte[]数组,这个在后面我会介绍的,不要着急。

Xtm12Form xtm12 = Xtm12Form.deserialize(bb);//这个就是我们希望得到的那个bean。//bean的源码我会在后面公开的。

//既然得到的你要的bean了,剩下的就是你自己的事情了,自己该怎么向下进行都ok了。

//这个就是ksoap2的精华所在了。

 

 

}

 

 

下面给大家看看 我服务器端的代码

public byte[] getXtm12ByXtwpdm(String xtwpdm) {
   Xtm12 x = this.xtm12DAO.findById(xtwpdm);//得到我要的结果了

    Xtm12Form xf = new Xtm12Form();//将结果进行了封装
    xf.setKcjldw(x.getKcjldw());//因为涉及到商业机密,就简单的列出一个set方法了。
    return xf.serialize();//返回是要求是byte[],所以我在bean中做了一下封装。
}

 

现在该看看精华了Xtm12Form bean 的源码,

package com.MobileRDA.FormBean;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;

import com.MobileRDA.StringVector;

public class Xtm12Form {

private String xtwpdm = "";

private StringVector wsvPersonName = new StringVector();//这就是进行二进制转换的类,我们将来在网络上传输的任何东西都是用二进制传输的,然后在将二进制转换回我们需要的东西。
   
   public String getXtwpdm() {
   return xtwpdm;
}

public void setXtwpdm(String xtwpdm) {
   this.xtwpdm = xtwpdm;
}

public static Xtm12Form deserialize(byte[] data) {//将二进制还原为我们所需要的类
   ByteArrayInputStream bais = new ByteArrayInputStream(data);
   DataInputStream dis = new DataInputStream(bais);
   Xtm12Form wc = new Xtm12Form();
   try {
    wc.xtwpdm = dis.readUTF();

    bais.close();
    dis.close();
   } catch (Exception exc) {
//    exc.printStackTrace();
   }
   return wc;
}

public byte[] serialize() {//将我们的类转换为二进制便于网路传输。
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   DataOutputStream dos = new DataOutputStream(baos);
   try {
    dos.writeUTF(xtwpdm);

    wsvPersonName.writeObject(dos);
    baos.close();
    dos.close();
   } catch (Exception exc) {
//    exc.printStackTrace();
   }
   return baos.toByteArray();
}

}

 

StringVector类的源码:

/**

* Vector主要用来保存各种类型的对象(包括相同类型和不同类型的对象)。
* 但是在一些情况下使用会给程序带来性能上的影响。这主要是由Vector类的两个特点所决定的。
* 第一,Vector提供了线程的安全保护功能。即使Vector类中的许多方法同步。
* 但是如果你已经确认你的应用程序是单线程,这些方法的同步就完全不必要了。
* 第二,在Vector查找存储的各种对象时,常常要花很多的时间进行类型的匹配。
* 而当这些对象都是同一类型时,这些匹配就完全不必要了。
* 因此,有必要设计一个单线程的,保存特定类型对象的类或集合来替代Vector类
*/

package com.MobileRDA;

public class StringVector{

// 这儿的transient标示这个属性不需要自动序列化
private transient String[] data;
private int count;
public int size() {
   return count;
}

public StringVector() {
   // default size is 10
   this(10);
}

public StringVector(int initialSize) {
   data = new String[initialSize];
}

public void add(String str) {
   //     ignore null strings 
   if (str == null) {
    return;
   }
   ensureCapacity(count + 1);
   data[count++] = str;
}

private void ensureCapacity(int minCapacity) {
   int oldCapacity = data.length;
   if (minCapacity > oldCapacity)   {
    String oldData[] = data;
    int newCapacity = oldCapacity * 2;
    data = new String[newCapacity];
    System.arraycopy(oldData, 0, data, 0, count);
   }
}

public void remove(String str) {
   if (str == null)   {
    return; // ignore null str   
   }
   for (int i = 0; i < count; i++)   {
    //     check for a match 
    if (data[i].equals(str))    {
     System.arraycopy(data, i + 1, data, i, count - 1); // copy data 
     //     allow previously valid array element be gc'd 
     data[--count] = null;
     return;
    }
   }
}

public final String getStringAt(int index) {
   if (index < 0)   {
    return null;
   }   else if (index > count){
    return null; // index is > # strings 
   }   else{
    return data[index]; // index is good 
   }
}

public synchronized void writeObject(java.io.DataOutputStream s) throws java.io.IOException {
   //     Write out array length 
   s.writeInt(count);
   //     Write out all elements in the proper order.   
   for (int i = 0; i < count; i++)   {
    s.writeUTF(data[i]);
   }
}

public synchronized void readObject(java.io.DataInputStream s) throws java.io.IOException, ClassNotFoundException {
   //     Read in array length and allocate array   
   int arrayLength = s.readInt();
   data = new String[arrayLength];
   // 同步data的大小
   count = arrayLength;
   //     Read in all elements in the proper order.  
   for (int i = 0; i < arrayLength; i++)   {
    data[i] = s.readUTF();
   }
}
}

 

另外这个bean以及StringVector需要在服务器端和客户端都存在,不是一个单方面的。

好了,代码已经基本上写完了,剩下的就需要大家自己体会了。

分享到:
评论

相关推荐

    axis+ksoap2开发webservice配置指南

    总的来说,"axis+ksoap2开发webservice配置指南"是一个关于在Java环境下使用Axis创建Web服务,并使用ksoap2在J2ME平台上进行调用的实践教程。这个过程涉及到了Web服务的生命周期管理、SOAP通信机制以及J2ME平台上的...

    J2ME使用KSoap调用C#开发的Web Service

    “J2ME使用KSoap调用C#开发的Web Service”这个标题表明,本主题涉及的是在Java 2 Micro Edition (J2ME)平台上,如何利用KSoap库来调用由C#语言编写的Web服务。J2ME是Java的一种轻量级实现,用于移动设备和嵌入式...

    ksoap2-j2me-core-2.1.2.zip_android_android webservice_ksoap2_ks

    `ksoap2`是Java平台上最广泛使用的SOAP客户端库之一,尤其在Android开发中。它简化了与SOAP Web服务的交互过程,包括创建请求、处理响应、序列化和反序列化数据等。`ksoap2`的核心功能包括: 1. **SOAP Envelope...

    J2ME开发 J2ME开发 J2ME开发

    在J2ME开发中,开发者通常会使用集成开发环境(IDE),如NetBeans、Eclipse或JBuilder,这些工具提供了代码编辑、调试和打包应用的功能。编写完代码后,需要通过模拟器或实际设备进行测试。 "J2ME开发.pdf"可能包含...

    J2ME手机应用项目开发实践

    这个“J2ME手机应用项目开发实践”是一个深入探讨如何利用J2ME进行手机应用开发的资源包,包含了实际项目的源代码,为开发者提供了宝贵的参考和学习材料。 J2ME的应用框架主要由两部分构成:MIDP(Mobile ...

    J2ME手机应用项目开发实践 源代码

    J2ME,全称Java 2 Micro Edition,是Java平台的一个子集,专门用于资源有限的移动设备,如早期的...通过研究和修改源代码,你将有机会深入了解J2ME的特性和限制,这对于想要从事移动应用开发的开发者来说是必不可少的。

    ksoap包 webservice连接包

    在标签中提到的"j2me",意味着kSOAP适用于Java Micro Edition(J2ME)平台,这是一个用于开发和部署在移动设备、消费电子设备等嵌入式系统上的Java应用程序的平台。同时,kSOAP也广泛应用于Android平台,尽管Android...

    J2ME手机应用项目开发实践.iso

    J2ME手机应用项目开发实践.iso J2ME手机应用项目开发实践.iso

    ksoap2源代码及jar包

    kSOAP2-j2ME广泛应用于移动开发,比如在Android或J2ME平台上实现功能如位置查询、天气预报、新闻推送等。通过调用Web服务,这些应用能够利用远程服务器的强大功能,而不需要在本地设备上存储大量数据或执行复杂的...

    J2me连接WebServices框架 - kSOAP2源码

    9. **示例应用**:压缩包中的源码可能是作者开发的一个示例应用,展示了如何使用 kSOAP2 调用 Web Services。通过分析这些代码,初学者可以快速入门,了解实际开发流程。 总的来说,这个资源对于想要在 J2ME 平台上...

    基于j2me的手机游戏开发

    开发J2ME游戏的第一步是设置开发环境,通常使用Eclipse或NetBeans这样的集成开发环境(IDE)。安装相应的J2ME插件后,可以创建新的MIDlet项目。MIDlet是J2ME中的应用程序,相当于Java中的主类。 ### 3. 用户界面...

    J2ME移动应用开发讲义

    **J2ME移动应用开发讲义** Java 2 Micro Edition(J2ME)是Java平台的一个子集,专为资源有限的嵌入式设备,如移动电话、PDA和家用电器设计。它允许开发者创建在这些设备上运行的应用程序,提供了一种跨平台的解决...

    使用NetBeans开发J2ME应用程序

    **使用NetBeans开发J2ME应用程序** Java 2 Micro Edition(J2ME)是一种轻量级的Java平台,主要用于移动设备、嵌入式系统和其他有限资源的设备上开发应用程序。NetBeans IDE是一款强大的集成开发环境,它为J2ME应用...

    j2me MIDP设备连接Webservice源码包

    最近在开发j2me,需要连接Webservice,可是在ksoap官网下载的包用不了,想到这个是开源包,应该有源代码,在不同的网站上找了很久,终于收集到了MIDP设备连接Webservice的源代码。经过我的使用,证明是可以用的。...

    J2ME手机游戏开发毕业论文

    这篇毕业论文深入探讨了J2ME在手机游戏开发中的应用,揭示了该技术的关键特性、开发流程以及面临的挑战。 **一、J2ME基础** J2ME由配置和 profiles 组成,配置定义了最小的Java运行时环境,而profiles则针对特定...

    使用eclipse开发J2ME应用程序(上)

    **使用Eclipse开发J2ME应用程序(上)** 在移动设备和嵌入式系统的世界里,J2ME(Java 2 Micro Edition)是用于开发应用程序的首选平台之一。Eclipse,作为一个强大的开源集成开发环境(IDE),也提供了对J2ME开发...

    J2ME无线通信技术应用开发

    J2ME无线通信技术应用开发,手机编程.主要介绍了基于java的手机软件开发。

    基于Eclipse环境的J2ME应用程序开发实例源码

    【基于Eclipse环境的J2ME应用程序开发实例源码】是一个关于使用Eclipse集成开发环境进行J2ME(Java 2 Micro Edition)应用编程的教学资源。J2ME是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机、智能...

    ksoap2 全jar包

    用于andriod调用webservice,使用简单方便。目前仅需要俩个jar包,ksoap2-j2me-core-2.1.2.jar 和 ksoap2-android-assembly-3.4.0-jar-with-dependencies.jar 都在压缩包里。

Global site tag (gtag.js) - Google Analytics