之所以把數組類型在調用web service中作為參數的實現鄭重的記錄下來,實在是因為數組在j2ee web service的實現不是一件容易的問題。至少用Jboss的j2ee web service實現時是這樣.
好象網上關于web service的比較深入一點的資料比較少,關于j2ee web service的資料就更少了.
這里只記錄了符合WS
—
I BP
標準的SOAP四種消息傳遞模式中的RPC/Literal消息傳遞模式。這個請參考書籍《j2ee web service 高級編程》一書。該書也只能是參考了,只是介紹了web service的理論實現及一點jax-rpc 的API,并且還有蠻多印刷錯字。雖然jax-rpc API的目標之一就是為了在各種java 的web service實現技術中提供一個便攜的手段,然而各種j2ee服務器的web service技術還是有些差別的,這個還是造成了程序不能直接在各種j2ee服務器之間毫無修改的移植。在 apache的axis實現中,數組作為參數傳遞根本不值一提,借助工具很方面的就可以實現。
但是在jboss中的ws實現中確不是一件便利的事情。因為郁悶了很久,發點牢騷:)具體實現:
???
作為web service服務實現的類必須實現java.rmi.Remote的接口:
package array;
?
import java.rmi.Remote;
import java.rmi.RemoteException;
?
public interface CountUser extends Remote {
?
?? public int countUser(User[] user) throws RemoteException;
}
?
???
具體實現遠程接口的類:
package array;
?
public class CountUserImpl implements CountUser {
??? public int countUser(User[] user){
??????? for(int i=0;i<user.length;i++){
??????????? System.out.println("name "+user[i].getName()+"? phone? "+
?????????????????????????????? user[i].getPhone()+ " birthday "+user[i].getBirthDay());
??????? }
??????? return user.length;
??? }
?
}
?
?
作為數組參數傳遞的類:
?
package array;
?
import java.util.Date;
?
public class User {
??? private String name;
??? private String phone;
??? private Date birthDay;
?
??? public User() {
?
??? }
??? public User(String name,String phone,Date birthDay){
??????? this.name=name;
??????? this.phone=phone;
??????? this.birthDay=birthDay;
??? }
?
??? public void setName(String name) {
??????? this.name = name;
??? }
?
??? public void setPhone(String phone) {
??????? this.phone = phone;
??? }
?
??? public void setBirthDay(Date birthDay) {
??????? this.birthDay = birthDay;
??? }
?
??? public String getName() {
?
??????return name;
??? }
?
??? public String getPhone() {
??????? return phone;
??? }
?
??? public Date getBirthDay() {
??????? return birthDay;
??? }
?
}
?
使用Jboss_Home/bin 下的wstools工具生成布署j2ee web service 必須的三個文件,jax-rpc映射文件,web服務描述器文件,以及wsdl文檔用于wstools工具的配置文件jboss-config.xml類容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://www.jboss.org/jbossws-tools"
?? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?? xsi:schemaLocation="http://www.jboss.org/jbossws-tools http://www.jboss.org/jbossws-tools/schema/jbossws-tool_1_0.xsd"
? <java-wsdl>
? <service? name="ServiceBeanInterface1" style="rpc"?? endpoint="array.ServiceBeanInterface1"/>
????? <namespaces target-namespace="http://array" type-namespace="http://array"/>
???? <mapping file="ServiceBeanInterface1.xml"/>
???? <webservices servlet-link="ServiceBeanInterface1"/>?????
?
</java-wsdl>
</configuration>
使用 wstools -cp array.CountUser -config jboss-config.xml 命令可以生成布署web服務所需的三個文件。另外還得在web.xml文件中把CountUser接口作為servlet發布
? <servlet>
??? <display-name>CountUser Servlet</display-name>
??? <servlet-name>CountUser</servlet-name>
??? <servlet-class>array.CountUserImpl</servlet-class>
? </servlet>
? <servlet-mapping>
??? <servlet-name>CountUser</servlet-name>
??? <url-pattern>/CountUser</url-pattern>
? </servlet-mapping>
? <servlet-mapping>
??? <servlet-name>CountUser</servlet-name>
??? <url-pattern>/services/*</url-pattern>
? </servlet-mapping>
僅僅是這樣倒也算很容易了,但是wstools工具并不能在映射文件中正確實現User[]的映射。因此還需要手工添加如下代碼以實現User[] 到xml之間的映射。???
??? <java-xml-type-mapping>
??? <java-type>array.User[]</java-type>
??? <root-type-qname xmlns:typeNS='http://array'>typeNS:User.Array</root-type-ame>
??? <qname-scope>complexType</qname-scope>
??? </java-xml-type-mapping>
打包成war文件,并且布署。服務端的實現就完成了。打包的war文件下載
?使用的Jboss版本4.04
因為篇幅或許還有分類的原因,客戶端的實現將記錄在下一篇隨筆里 如果你想賜教或者討論,歡迎加入QQ群:30406099
凡是有該標志的文章,都是該blog博主Caoer(草兒)原創,凡是索引、收藏
、轉載請注明來處和原文作者。非常感謝。