java随记

坚持就是胜利!

 

j2ee web service开发(一) 映射数组复杂类型

 之所以把数组类型在调用web service中作为参数的实现郑重的记录下来,实在是因为数组在j2ee web service的实现不是一件容易的问题。至少用Jbossj2ee 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服务器之间毫无修改的移植。在 apacheaxis实现中,数组作为参数传递根本不值一提,借助工具很方面的就可以实现。

但是在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

posted on 2006-11-06 09:33 傻 瓜 阅读(4145) 评论(0)  编辑  收藏 所属分类: j2ee web service


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(7)

我参与的团队

随笔分类

随笔档案

文章分类

友情链接

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜