1. 服务端

这次要发布的web service非常简单。它的功能是把从客户端传入的字符串中的小写字母转变成大写字母,再返回给客户端。Soap 服务器采用apache的AXIS(可以从http://ws.apache.org/axis/下载),应用服务器可以选用各种servlet 容器,我这里采用的是weblogic。

1.1 实现类的源代码

 1J2ME与WebService// StringProcessor.java
 2J2ME与WebServicepackage com.jagie.j2me.ws;
 3J2ME与WebService
 4

1.2 发布步骤

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

J2ME与WebService

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/下载,如图所示:

J2ME与WebService

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

#server-config.wsdd

J2ME与WebService<?xml version="1.0" encoding="UTF-8"?>
J2ME与WebService
<deployment xmlns="http://xml.apache.org/axis/wsdd/" 
J2ME与WebServicexmlns:java
="http://xml.apache.org/axis/wsdd/providers/java">
J2ME与WebService 
<globalConfiguration>
J2ME与WebService  
<parameter name="adminPassword" value="admin"/>
J2ME与WebService  
<parameter name="attachments.Directory" value="C:\Program Files
J2ME与WebService  \Apache Tomcat 4.0\webapps\axis\WEB-INF\attachments"
/>
J2ME与WebService  
<parameter name="attachments.implementation" 
J2ME与WebService  value
="org.apache.axis.attachments.AttachmentsImpl"/>
J2ME与WebService  
<parameter name="sendXsiTypes" value="true"/>
J2ME与WebService  
<parameter name="sendMultiRefs" value="true"/>
J2ME与WebService  
<parameter name="sendXMLDeclaration" value="true"/>
J2ME与WebService  
<parameter name="axis.sendMinimizedElements" value="true"/>
J2ME与WebService  
<requestFlow>
J2ME与WebService   
<handler type="java:org.apache.axis.handlers.JWSHandler">
J2ME与WebService    
<parameter name="scope" value="session"/>
J2ME与WebService   
</handler>
J2ME与WebService   
<handler type="java:org.apache.axis.handlers.JWSHandler">
J2ME与WebService    
<parameter name="scope" value="request"/>
J2ME与WebService    
<parameter name="extension" value=".jwr"/>
J2ME与WebService   
</handler>
J2ME与WebService  
</requestFlow>
J2ME与WebService 
</globalConfiguration>
J2ME与WebService 
<handler name="LocalResponder" 
J2ME与WebService type
="java:org.apache.axis.transport.local.LocalResponder"/>
J2ME与WebService 
<handler name="URLMapper" 
J2ME与WebService type
="java:org.apache.axis.handlers.http.URLMapper"/>
J2ME与WebService 
<handler name="RPCDispatcher" 
J2ME与WebService type
="java:org.apache.axis.providers.java.RPCProvider"/>
J2ME与WebService 
<handler name="Authenticate" 
J2ME与WebService type
="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
J2ME与WebService 
<handler name="MsgDispatcher" 
J2ME与WebService type
="java:org.apache.axis.providers.java.MsgProvider"/>
J2ME与WebService
J2ME与WebService 
<service name="AdminService" provider="java:MSG">
J2ME与WebService  
<parameter name="allowedMethods" value="AdminService"/>
J2ME与WebService  
<parameter name="enableRemoteAdmin" value="false"/>
J2ME与WebService  
<parameter name="className" value="org.apache.axis.utils.Admin"/>
J2ME与WebService  
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
J2ME与WebService 
</service>
J2ME与WebService 
<service name="Version" provider="java:RPC">
J2ME与WebService  
<parameter name="allowedMethods" value="getVersion"/>
J2ME与WebService  
<parameter name="className" value="org.apache.axis.Version"/>
J2ME与WebService 
</service>
J2ME与WebService 
<!--  your service  begin-->
J2ME与WebService  
<service name="StringProcess" provider="java:RPC">
J2ME与WebService  
<parameter name="allowedMethods" value="process"/>
J2ME与WebService  
<parameter name="className" 
J2ME与WebService  value
="com.jagie.j2me.ws.StringProcessor"/>
J2ME与WebService 
</service>
J2ME与WebService
<!-- your service  end -->
J2ME与WebService 
<transport name="http">
J2ME与WebService  
<requestFlow>
J2ME与WebService   
<handler type="URLMapper"/>
J2ME与WebService   
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
J2ME与WebService  
</requestFlow>
J2ME与WebService 
</transport>
J2ME与WebService 
<transport name="local">
J2ME与WebService  
<responseFlow>
J2ME与WebService   
<handler type="java:org.apache.axis.transport.local.LocalResponder"/>
J2ME与WebService  
</responseFlow>
J2ME与WebService 
</transport>
J2ME与WebService
</deployment>
J2ME与WebService

# web.xml

J2ME与WebService<?xml version="1.0" encoding="ISO-8859-1"?>
J2ME与WebService
J2ME与WebService
<!DOCTYPE web-app
J2ME与WebService    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
J2ME与WebService    "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd"
>
J2ME与WebService
J2ME与WebService
<web-app>
J2ME与WebService  
<display-name>Apache-Axis</display-name>
J2ME与WebService  
<servlet>
J2ME与WebService    
<servlet-name>AxisServlet</servlet-name>
J2ME与WebService    
<display-name>Apache-Axis Servlet</display-name>
J2ME与WebService    
<servlet-class>
J2ME与WebService        org.apache.axis.transport.http.AxisServlet
J2ME与WebService    
</servlet-class>
J2ME与WebService  
</servlet>
J2ME与WebService
J2ME与WebService  
<servlet>
J2ME与WebService    
<servlet-name>AdminServlet</servlet-name>
J2ME与WebService    
<display-name>Axis Admin Servlet</display-name>
J2ME与WebService    
<servlet-class>
J2ME与WebService        org.apache.axis.transport.http.AdminServlet
J2ME与WebService    
</servlet-class>
J2ME与WebService    
<load-on-startup>100</load-on-startup>
J2ME与WebService  
</servlet>
J2ME与WebService
J2ME与WebService  
<servlet>
J2ME与WebService    
<servlet-name>SOAPMonitorService</servlet-name>
J2ME与WebService    
<display-name>SOAPMonitorService</display-name>
J2ME与WebService    
<servlet-class>
J2ME与WebService        org.apache.axis.monitor.SOAPMonitorService
J2ME与WebService    
</servlet-class>
J2ME与WebService    
<init-param>
J2ME与WebService      
<param-name>SOAPMonitorPort</param-name>
J2ME与WebService      
<param-value>5001</param-value>
J2ME与WebService    
</init-param>
J2ME与WebService    
<load-on-startup>100</load-on-startup>
J2ME与WebService  
</servlet>
J2ME与WebService
J2ME与WebService  
<servlet-mapping>
J2ME与WebService    
<servlet-name>AxisServlet</servlet-name>
J2ME与WebService    
<url-pattern>/servlet/AxisServlet</url-pattern>
J2ME与WebService  
</servlet-mapping>
J2ME与WebService
J2ME与WebService  
<servlet-mapping>
J2ME与WebService    
<servlet-name>AxisServlet</servlet-name>
J2ME与WebService    
<url-pattern>*.jws</url-pattern>
J2ME与WebService  
</servlet-mapping>
J2ME与WebService
J2ME与WebService  
<servlet-mapping>
J2ME与WebService    
<servlet-name>AxisServlet</servlet-name>
J2ME与WebService    
<url-pattern>/services/*</url-pattern>
J2ME与WebService  
</servlet-mapping>
J2ME与WebService
J2ME与WebService  
<servlet-mapping>
J2ME与WebService    
<servlet-name>SOAPMonitorService</servlet-name>
J2ME与WebService    
<url-pattern>/SOAPMonitor</url-pattern>
J2ME与WebService  
</servlet-mapping>
J2ME与WebService
J2ME与WebService 
<!-- uncomment this if you want the admin servlet -->
J2ME与WebService 
<!--
J2ME与WebService  <servlet-mapping>
J2ME与WebService    <servlet-name>AdminServlet</servlet-name>
J2ME与WebService    <url-pattern>/servlet/AdminServlet</url-pattern>
J2ME与WebService  </servlet-mapping>
J2ME与WebService 
-->
J2ME与WebService
J2ME与WebService    
<!-- currently the W3C havent settled on a media type for WSDL;
J2ME与WebService    http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
J2ME与WebService    for now we go with the basic 'it's XML' response 
-->
J2ME与WebService  
<mime-mapping>
J2ME与WebService    
<extension>wsdl</extension>
J2ME与WebService     
<mime-type>text/xml</mime-type>
J2ME与WebService  
</mime-mapping>
J2ME与WebService  
<mime-mapping>
J2ME与WebService    
<extension>xsd</extension>
J2ME与WebService    
<mime-type>text/xml</mime-type>
J2ME与WebService  
</mime-mapping>
J2ME与WebService
</web-app>
J2ME与WebService

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种访问方式

  1. 直接用HttpConnection访问 http://localhost:7001/jagiews/services/StringProcess?method=process&name=qqqq,得到xml的返回数据,然后用kxml(http://kxml.enhydra.org/)解析,得到返回值。
  2. 如果你的手机支持MIDP2.0的话,可以考虑使用JSR172。
  3. 用ksoap api。

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

2.1 客户端源代码

2.1.1 WSClientMIDlet.java

J2ME与WebServicepackage com.jagie.j2me.ws;
J2ME与WebService
J2ME与WebService
import javax.microedition.midlet.*;
J2ME与WebService
import javax.microedition.lcdui.*;
J2ME与WebService

2.1.2 DisplayForm.java

J2ME与WebServicepackage com.jagie.j2me.ws;
J2ME与WebService
J2ME与WebService
import javax.microedition.lcdui.*;
J2ME与WebService
J2ME与WebService

2.1.3 StringProcessorStub.java

J2ME与WebServicepackage com.jagie.j2me.ws;
J2ME与WebService
J2ME与WebService
import org.ksoap.*;
J2ME与WebService
import org.ksoap.transport.HttpTransport;
J2ME与WebService

测试客户端

现在,试着在你的ide里运行WSClientMIDlet,如果调用成功,则出现以下画面:

J2ME与WebService

总结

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

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-04-10
  • 2021-10-28
  • 2021-12-06
  • 2021-10-15
猜你喜欢
  • 2022-02-21
  • 2021-04-08
  • 2021-12-10
  • 2021-11-05
  • 2022-12-23
相关资源
相似解决方案