本文用一個簡明的例子,闡述了如何在手機上用KSOAP API來訪問本地伺服器上的Web Service。並且給出了詳細的操作步驟和全部的Server,Client源代碼。
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
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
value="org.apache.axis.attachments.AttachmentsImpl"/>
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"/>
http://xml.apache.org/axis/wsdd/
value="com.jagie.j2me.ws.StringProcessor"/>
# web.xml
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/se ... d=process&name=qqqq,如果瀏覽器能在返回的xml文檔中顯示字元串"QQQQ",恭喜你,你的web service發布成功了。如果發布不成功,請按以上發布步驟檢查一下。
2. 客戶端
客戶端自然是用MIDlet了,不過用什麼方式來訪問web service呢?其實有3種訪問方式
直接用HttpConnection訪問 http://localhost:7001/jagiews/se ... d=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;
}
}
測試客戶端
現在,試著在你的ide里運行WSClientMIDlet,如果調用成功,則出現以下畫面:
總結
有了ksoap,手機上調用web service就很容易了。不過要注意的是,使用網路連接這種費時操作的時候,一定要單獨開線程進行,不要直接寫在commandAction()方法里,否則出現畫面被鎖住的情況。
參考資料
http://ksoap.enhydra.org/softwar ... StockQuoteDemo.java
轉自別處!