服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

j2me与web service-ksoap的快速上手


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

<?xml version="1.0" encoding="utf-8"?>
<deployment xmlns=
"http://xml.apache.org/axis/wsdd/"
xmlns:java=
"http://xml.apache.org/axis/wsdd/providers/java">
<globalconfiguration>
  <parameter name=
  "adminpassword" value="admin"/>
  <parameter name=
  "attachments.directory"
  value="c:/program files
  /apache tomcat 4.0/webapps
  /axis/web-inf/attachments"/>
  <parameter name=
  "attachments.implementation"
  value="org.apache.axis.
  attachments.attachmentsimpl"/>
  <parameter name=
  "sendxsitypes"
  value="true"/>
  <parameter name=
  "sendmultirefs"
  value="true"/>
  <parameter name=
  "sendxmldeclaration"
  value="true"/>
  <parameter name=
  "axis.sendminimizedelements"
  value="true"/>
  <requestflow>
   <handler type=
   "java:org.apache.axis.handlers.jwshandler">
    <parameter
name="scope"
value="session"/>
   </handler>
   <handler type=
   "java:org.apache.axis.handlers.jwshandler">
    <parameter
name="scope"
value="request"/>
    <parameter
name="extension"
value=".jwr"/>
   </handler>
  </requestflow>
</globalconfiguration>
<handler name=
"localresponder"
type="java:org.apache.axis.
transport.local.localresponder"/>
<handler name="urlmapper"
type="java:org.apache.axis.
handlers.http.urlmapper"/>
<handler name="rpcdispatcher"
type="java:org.apache.axis.
providers.java.rpcprovider"/>
<handler name="authenticate"
type="java:org.apache.axis.
handlers.simpleauthenticationhandler"/>
<handler name="msgdispatcher"
type="java:org.apache.axis.
providers.java.msgprovider"/>

<service name="adminservice"
provider="java:msg">
  <parameter name="allowedmethods"
  value="adminservice"/>
  <parameter name="enableremoteadmin"
  value="false"/>
  <parameter name="classname"
  value="org.apache.axis.utils.admin"/>
  <namespace>
  http://xml.apache.org/axis/wsdd/
  </namespace>
</service>
<service name="version"
provider="java:rpc">
  <parameter name="allowedmethods"
  value="getversion"/>
  <parameter name="classname"
  value="org.apache.axis.version"/>
</service>
<!--  your service  begin-->
  <service name="stringprocess"
  provider="java:rpc">
  <parameter name="allowedmethods"
  value="process"/>
  <parameter name="classname"
  value="com.jagie.j2me.
  ws.stringprocessor"/>
</service>
<!-- your service  end -->
<transport name="http">
  <requestflow>
   <handler type="urlmapper"/>
   <handler type=
   "java:org.apache.axis.handlers.
   http.httpauthhandler"/>
  </requestflow>
</transport>
<transport name="local">
  <responseflow>
   <handler type="java:org.apache.axis.
   transport.local.localresponder"/>
  </responseflow>
</transport>
</deployment>

# web.xml

<?xml version="1.0"
encoding="iso-8859-1"?>

<!doctype web-app
    public "-//sun microsystems,
inc.//dtd web application 2.3//en"
    "http://java.sun.com
/j2ee/dtds/web-app_2.2.dtd">

<web-app>
  <display-name>apache-axis</display-name>
  <servlet>
    <servlet-name>axisservlet</servlet-name>
    <display-name>apache-axis
servlet</display-name>
    <servlet-class>
        org.apache.axis.transport.http.axisservlet
    </servlet-class>
  </servlet>

  <servlet>
    <servlet-name>adminservlet</servlet-name>
    <display-name>axis admin servlet</display-name>
    <servlet-class>
        org.apache.axis.transport.http.adminservlet
    </servlet-class>
    <load-on-startup>100</load-on-startup>
  </servlet>

  <servlet>
    <servlet-name>soapmonitorservice</servlet-name>
    <display-name>soapmonitorservice</display-name>
    <servlet-class>
        org.apache.axis.monitor.soapmonitorservice
    </servlet-class>
    <init-param>
      <param-name>soapmonitorport</param-name>
      <param-value>5001</param-value>
    </init-param>
    <load-on-startup>100</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>axisservlet</servlet-name>
    <url-pattern>/servlet/axisservlet</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>axisservlet</servlet-name>
    <url-pattern>*.jws</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>axisservlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>soapmonitorservice</servlet-name>
    <url-pattern>/soapmonitor</url-pattern>
  </servlet-mapping>

<!-- uncomment this if you want the admin servlet -->
<!--
  <servlet-mapping>
    <servlet-name>adminservlet</servlet-name>
    <url-pattern>/servlet/adminservlet
</url-pattern>
  </servlet-mapping>
-->

    <!-- currently the w3c havent settled
on a media type for wsdl;
    http://www.w3.org/tr/2003/
wd-wsdl12-20030303/#ietf-draft
    for now we go with the basic
''it''s xml'' response -->
  <mime-mapping>
    <extension>wsdl</extension>
     <mime-type>text/xml</mime-type>
  </mime-mapping>
  <mime-mapping>
    <extension>xsd</extension>
    <mime-type>text/xml</mime-type>
  </mime-mapping>
</web-app>




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.*;

/**
* <p>title: </p>
* <p>description: </p>
* <p>copyright: copyright (c)
2004</p>
* <p>company: </p>
* @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.*;
/**
* <p>title: </p>
* <p>description: </p>
* <p>copyright: copyright (c)
2004</p>
* <p>company: </p>
* @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;

/**
* <p>title: </p>
* <p>description: </p>
* <p>copyright: copyright (c) 2004</p>
* <p>company: </p>
* @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()方法里,否则出现画面被锁住的情况。

扫描关注微信公众号