J2ME与WebService-KSOAP的罗曼史

来源:百度文库 编辑:神马文学网 时间:2024/04/28 18:45:09
J2ME和Web Service-KSOAP的罗曼史

----J2ME和Web Service-KSOAP的快速上手

作者:Cleverpig


版权声明:能够任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
原文地址:
http://www.matrix.org.cn/resource/article/43/43662_J2ME_KSOAP.Html
关键词: j2me soap webservice

1、服务端

这次要发布的web service很简单。他的功能是把从客户端传入的字符串中的小写字母转变成大写字母,再返回给客户端。

Soap 服务器采用apache的AXIS(能够从http://ws.apache.org/axis/下载),应用服务器能够选用各种servlet 容器,我这里采用的是weblogic。

1.1 实现类的源代码:


// StringPRocessor.java
package com.jagie.j2me.ws;

public class StringProcessor
{
  public StringProcessor()
  {
  }

  public String process(String name)
  {
    return name.toUpperCase();
  }

}


1.2 发布步骤

1.准备一个目录作为web application的发布目录,我这里的这个目录叫jagiews,这个目录的全路径中最好不要有空格和中文。我的发布目录结构如下:

2.编译StringProcessor.java,把生成的StringProcessor.class置于: /jagiews/WEB-INF/classes/com/jagie/j2me/ws目录下。

3.在jagiews/WEB-INF/lib 文档夹中置入以下axis服务器需要的jar文档 axis.jar,axis-ant.jar,commons-discovery.jar,commons-logging.jar,jaxrpc.jar,log4j-1.2.8.jar,saaj.jar ,wsdl4j.jar。这些文档能够在http://ws.apache.org/axis/下载。

4.在jagiews/WEB-INF目录下增加2个发布描述文档:
server-config.wsdd,web.xml。

#server-config.wsdd


"http://xml.apache.org/axis/wsdd/"
xmlns:java=
"http://xml.apache.org/axis/wsdd/providers/java">

    "adminPassWord" value="admin"/>
    "attachments.Directory"
  value="C:/Program Files
  /Apache Tomcat 4.0/webapps
  /axis/WEB-INF/attachments"/>
    "attachments.implementation"
  value="org.apache.axis.
  attachments.AttachmentsImpl"/>
    "sendXsiTypes"
  value="true"/>
    "sendMultiRefs"
  value="true"/>
    "sendXMLDeclaration"
  value="true"/>
    "axis.sendMinimizedElements"
  value="true"/>
  
      "java:org.apache.axis.handlers.JWSHandler">
     name="scope"
value="session"/>
  

      "java:org.apache.axis.handlers.JWSHandler">
     name="scope"
value="request"/>
     name="extension"
value=".jwr"/>
  

  


"LocalResponder"
type="java:org.apache.axis.
transport.local.LocalResponder"/>
type="java:org.apache.axis.
handlers.http.URLMapper"/>
type="java:org.apache.axis.
providers.java.RPCProvider"/>
type="java:org.apache.axis.
handlers.SimpleAuthenticationHandler"/>
type="java:org.apache.axis.
providers.java.MsgProvider"/>

provider="java:MSG">
    value="AdminService"/>
    value="false"/>
    value="org.apache.axis.utils.Admin"/>
  
  http://xml.apache.org/axis/wsdd/
  


provider="java:RPC">
    value="getVersion"/>
    value="org.apache.axis.Version"/>


    provider="java:RPC">
    value="process"/>
    value="com.jagie.j2me.
  ws.StringProcessor"/>



  
  
      "java:org.apache.axis.handlers.
   http.HTTPAuthHandler"/>
  



  
  
  




# web.xml

encoding="ISO-8859-1"?>

    PUBLIC "-//Sun Microsystems,
Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com
/j2ee/dtds/web-app_2.2.dtd">


  Apache-Axis
  
    AxisServlet
    Apache-Axis
Servlet

    
        org.apache.axis.transport.http.AxisServlet
    

  


  
    AdminServlet
    Axis Admin Servlet
    
        org.apache.axis.transport.http.AdminServlet
    

    100
  


  
    SOAPMonitorService
    SOAPMonitorService
    
        org.apache.axis.monitor.SOAPMonitorService
    

    
      SOAPMonitorPort
      5001
    

    100
  


  
    AxisServlet
    /servlet/AxisServlet
  


  
    AxisServlet
    *.jws
  


  
    AxisServlet
    /services/*
  


  
    SOAPMonitorService
    /SOAPMonitor
  





    
  
    wsdl
     text/xml
  

  
    xsd
    text/xml
  




5.开启您的application server,把目录jagiews发布为一个名叫jagiews的web application。

6.测试:打开浏览器,输入网址(这里使用的是weblogic,其他的服务器请酌情修改): http://localhost:7001/jagiews/services/StringProcess?method=process&name=QQqq,假如浏览器能在返回的xml文档中显示字符串"QQQQ",恭喜您,您的web service发布成功了。假如发布不成功,请按以上发布步骤检查一下。

2、客户端

客户端自然是用MIDlet了,但是用什么方式来访问web service呢?其实有3种访问方式

直接用HttpConnection访问 http://localhost:7001/jagiews/services/StringProcess?method=process&name=qqqq,得到xml的返回数据,然后用kxml(http://kxml.enhydra.org/)解析,得到返回值。

假如您的手机支持MIDP2.0的话,能够考虑使用JSR172。

用ksoap api。

这里讲述第三种方式。使用之前,您需要从 http://ksoap.enhydra.org/software/downloads/index.html下载稳定的ksoap包,置于您的classpath中。

2.1 客户端源代码

2.1.1 WSClientMIDlet.java


package com.jagie.j2me.ws;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

/**
*

Title:


*

Description:


*

Copyright: Copyright (c)
2004


*

Company:


* @author not attributable
* @version 1.0
*/

public class WSClientMIDlet
    extends MIDlet
{
  static WSClientMIDlet instance;

  public WSClientMIDlet()
  {
    instance = this;
  }

  public void startApp()
  {
    Display display=
Display.getDisplay(this);
    DisplayForm displayable =
new DisplayForm();
    display.setCurrent(displayable);

  }

  public void pauseApp()
  {
  }

  public void destroyApp
  (boolean unconditional)
  {
  }

  public static void quitApp()
  {
    instance.destroyApp(true);
    instance.notifyDestroyed();
    instance = null;
  }

}


2.1.2 DisplayForm.java


package com.jagie.j2me.ws;
import javax.microedition.lcdui.*;
/**
*

Title:


*

Description:


*

Copyright: Copyright (c)
2004


*

Company:


* @author not attributable
* @version 1.0
*/

public class DisplayForm
    extends Form
    implements CommandListener,
Runnable
{
  private TextField textField1;
  private Thread t;

  public DisplayForm()
  {
    super("字符转换webservice测试");

    try
{
      jbInit();
    }
    catch (Exception e)
{
      e.printStackTrace();
    }

  }

  private void jbInit()
  throws Exception
  {
    // Set up this Displayable
to listen to command events
    textField1 = new TextField
("", "", 15, TextField.ANY);
    this.setCommandListener(this);
    textField1.setLabel
("待处理的字符串是:");
    textField1.setConstraints
(TextField.ANY);
    textField1.setInitialInputMode
("Tester");
    setCommandListener(this);
    // add the Exit command
    addCommand(new Command
("Exit", Command.EXIT, 1));
    addCommand(new Command
("Process", Command.OK, 1));
    this.append(textField1);
  }

  public void commandAction
  (Command command,
  Displayable displayable)
  {

    if (command.getCommandType
() == Command.EXIT)
{
      WSClientMIDlet.quitApp();
    }
    else if (command.getCommandType()
== Command.OK)
{
      t = new Thread(this);
      t.start();
    }
  }

  public void run()
  {
    String s1 =
textField1.getString();
    String s2 =
new StringProcessorStub().process(s1);
    StringItem resultItem =
new StringItem("处理后的字符串是:", s2);
    this.append(resultItem);
}
}


2.1.3 StringProcessorStub.java


package com.jagie.j2me.ws;

import org.ksoap.*;
import org.ksoap.transport.HttpTransport;

/**
*

Title:


*

Description:


*

Copyright: Copyright (c) 2004


*

Company:


* @author not attributable
* @version 1.0
*/

  public class StringProcessorStub
  {
    public StringProcessorStub()
{
  }

  public String process(String name)
  {
    String result = null;
    try
{

      SoapObject rpc =
   new SoapObject
    ("http://localhost:
7001/jagiews/services/StringProcess",
"process");

      rpc.addProperty("name", name);

      HttpTransport ht =
   new HttpTransport
    ("http://localhost:7001/
jagiews/services/StringProcess",
"");

      result = (String) ht.call(rpc);

    }
    catch (Exception e) {
      e.printStackTrace();
    }

    return result;

  }
}


总结

有了ksoap,手机上调用web service就很容易了。但是要注意的是,使用网络连接这种费时操作的时候,一定要单独开线程进行,不要直接写在commandAction()方法里,否则出现画面被锁住的情况。进入讨论组讨论。