前一段时间应工作要求进行WEB SERVICES接口的编写工作。现在写点东西备忘。
用JAVA快速建立WEB SERVICES服务的环境TOMCAT5.5.17+AXIS2-1.3
第一步安装JDK与TOMCAT。
第二步将AXIS2的WAR包部署到TOMCAT中,最简单的就是直接放到TOMCAT中的WEBAPPS目录下。
第三步启动TOMCAT。访问
http://localhost:8080/axis2/看到AXIS2的页面,那么AXIS2就已经能工作了。
接下就是创建业务代码。
比如:现在要求写一个WEB SERVICES服务。传递一个字符串到WEB SERVICES,然后WEB SERVICES返回一个状态0。
我们先定义一个原型方法
public
ClassA
...
{
public int testWS(String s)...{
return 0;
}
}
public int testWS(String s)...{
return 0;
}
}
以下的指令都要求AXIS2的JAR包
第一步生成WSDL
java -cp .;D:/java/axis2-1.3/lib/* org.apache.ws.java2wsdl.Java2WSDL -cn ClassA -o .
参数说明:-cp 类路径
-cn 原形类
-o 输出路径
运行完成后就可以看到目录下多了一个WSDL文件.不要动它继续生成SERVER端和CLIENT端
第二步生成SERVER端
java -cp .;D:/java/axis2-1.3/lib/* org.apache.axis2.wsdl.WSDL2Java -uri D:/test/6/ClassA.wsdl -ss -sd -p com.hjw.test.server -d xmlbeans -o server
参数说明: -cp 类路径
参数说明: -cp 类路径
-uri WSDL文件
-ss -sd 搞不太清楚,好像是用来生成SERVER端部署描述的。
-p 生成包。就是说生成到什么包名下。
-d xmlbeans 搞不太清楚,每次都是这样用的。
-o server 输出目录。叫什么都没关系,只要你喜欢。
运行完成后就可以发现在SERVER目录下有了一大堆的类啊什么的。不管它,继续生成客户端测试代码。(如果不需要在JAVA下调用或者直接用传统方式去调用的话可以不用这一步了)
第三步生成CLIENT测试代码
java -cp .;D:/java/axis2-1.3/lib/* org.apache.axis2.wsdl.WSDL2Java -uri D:/test/6/ClassA.wsdl -p com.hjw.test.server -d xmlbeans -o client
这个指令跟SERVER端的基本上一样,就是少了个-ss和-sd 好像就是说不生成部署描述。
到此为止我们的WEB SERVICES框架已经完整的生成了。再下来就是去实现业务了。
我们到SERVER目录下找到类似于ClassASkeleton.java的文件。我们的实现就只要改这个类了。
打开这个类我们发现这个类里有个方法这个方法名为我们那个原型类里的方法名。但是这个方法没有实现默认只是抛出一个没有完成的异常。接下来当然是去掉这个异常然后加入自己的方法了。
public
com.hjw.test.server.TestWSResponseDocument testWSReq(
com.telemd.ws.contentsyncreq.server.TestWSReqDocument testWSReq) ... {
System.out.println("请求内容:"+ testWSReq.getTestReq().xmlText());
com.hjw.test.server.TestWSResponseDocument responseDoc = com.hjw.test.server.TestWSResponseDocument.Factory.newInstance();
com.hjw.test.server.TestWSResponseDocument.TestWSResponse response = responseDoc
.addNewTestWSResponse();
doc = "<root><return>0</return></root>";
XmlObject xobj = null;
try ...{
xobj = XmlObject.Factory.parse(doc);
} catch (XmlException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
response.set(xobj);
response.setReturn(0);
return responseDoc;
}
com.telemd.ws.contentsyncreq.server.TestWSReqDocument testWSReq) ... {
System.out.println("请求内容:"+ testWSReq.getTestReq().xmlText());
com.hjw.test.server.TestWSResponseDocument responseDoc = com.hjw.test.server.TestWSResponseDocument.Factory.newInstance();
com.hjw.test.server.TestWSResponseDocument.TestWSResponse response = responseDoc
.addNewTestWSResponse();
doc = "<root><return>0</return></root>";
XmlObject xobj = null;
try ...{
xobj = XmlObject.Factory.parse(doc);
} catch (XmlException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
response.set(xobj);
response.setReturn(0);
return responseDoc;
}
好了。现在改好这个业务了。很简单就是在控制台上打印一下接收到的请求再返回一个0给调用者。
然后就配置一下ANT。转到SERVER目录下执行 ant 回车。一阵子之后ANT就会把类编译好并打成AAR为后缀的包。
现在把TOMCAT启动。登录 进去后。把这个AAR包UPLOAD上去。那么这个WEB SERVICES服务就完成了。
接下来就是进行测试。
记得吗?刚刚我们已经生成了一个CLIENT测试代码。也先用ANT把它编译一下,变成一个JAR包。
然后导入这个JAR包再写个测试类。(当然你可以用任何语言去做这个事情)
public
class
Test1
...
{
public static void main(String[] args) ...{
try ...{
ClassAServiceStub stub = new ClassAServiceStub(
null, "http://localhost:8080/axis2/services/ClassAService");
TestWSDocument csrDoc = TestWSDocument.Factory.newInstance();
TestWSReq response = csrDoc.addNewTestWSReq();
response.addTestWSInfo("20061227,37,ggclyhsjb,1,409,3");
TestWSResponseDocument csrrDoc = stub
.TestWSReq(csrDoc);
System.out.println("回应XML为:");
System.out.println(csrrDoc.getTestWSResponse()
.xmlText());
System.out.println("返回值:"
+ csrrDoc.getTestWSResponse().getReturn());
} catch (Exception e) ...{
e.printStackTrace();
}
}
}
public static void main(String[] args) ...{
try ...{
ClassAServiceStub stub = new ClassAServiceStub(
null, "http://localhost:8080/axis2/services/ClassAService");
TestWSDocument csrDoc = TestWSDocument.Factory.newInstance();
TestWSReq response = csrDoc.addNewTestWSReq();
response.addTestWSInfo("20061227,37,ggclyhsjb,1,409,3");
TestWSResponseDocument csrrDoc = stub
.TestWSReq(csrDoc);
System.out.println("回应XML为:");
System.out.println(csrrDoc.getTestWSResponse()
.xmlText());
System.out.println("返回值:"
+ csrrDoc.getTestWSResponse().getReturn());
} catch (Exception e) ...{
e.printStackTrace();
}
}
}
主要的难点。因为生成 SERVER后那些类名,方法名都是根据原型类和方法来决定的。所以要特别注意找准这些请求类,回应类,文本类等东西。如果用ECLIPSE帮下忙会很有用。
注意防火墙的阻挡,要不会出些异常的。
核心思想:这是我的想法不一定正确。
我觉得WEB SERVICES对于开发人员来说主要是要创建和使用那些消息传递的XML文件。WEB SERVICES之间的通信就是一个基于SOAP协议的东西。所以我们在服务器端接收,回应和客户端发送,接收 回应的载体都是XML文件。在得到接收过来的东西后就能像普通JAVA程序一样进行开发处理,然后再打包成XML响应发出去就行了。注意这其中的处理时间也不能太长了,否则客户端会产生请求超时的异常。可以采用多线程的方法来处理那种需要很长时间的任务。
好了。先写到这里,下去想到什么再补充。