论坛首页 Java企业应用论坛

XFire开发一个WebService

浏览 4542 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-01-25  

使用XFire实现一个简单的WebService

1 功能要求

       返回小于给定数的所有素数!

2 依赖文件

<!----><!---->activaton-1.1.jar

jaxen-1.1-beta-9.jar
jdom.jar
spring-beans.jar
spring-context.jar
spring-core.jar
spring-web.jar
stax-api-1.0.1.jar
wsdl4j-1.6.1.jar
wstx-asl-3.2.0.jar
xbean-2.2.0.jar
xbean-spring-2.8.jar

 

下载地址:

http://www.fs2you.com/files/773351f0-caf4-11dc-938c-0014221b798a/

3 工程结构

<!----><!---->工程根目录
|
|-src
|      |
|      -cn.com.xinli.lmss.ws.impl
|      |     |
|      |     -MathService.java
|      |
|      -cn.com.xinli.lmss.ws.interfaces
|      |     |
|      |     -MathServiceIF.java
|      |
|      -META-INF
|        |
|        -xfire
|            |
|            -services.xml
|
|-webroot
|      |
|      -WEB-INF
|           |
|           -web.xml
<!---->

4 代码

MathServiceIF

 

package cn.com.xinli.lmss.ws.interfaces;

 

import java.util.List;

 

 

 

public interface MathServiceIF {

    /**

     * @param num

     * @return 返回小于给定数的所有素数的集合

     */

    public int[] getPrimeNumberArray(int num);      

    /**

     * @param num

     * @return 返回小于给定数的所有素数的集合,以List形式返回

     */

    public List getPrimeNumberList(Integer num);

}

       实际上完成这个需求只需要方法getPrimeNumberArray就可以了,但是为了说明XFireaegis绑定,所以提供了getPrimeNumberList方法。

 

MathService

 

package cn.com.xinli.lmss.ws.impl;

 

import java.util.ArrayList;

import java.util.List;

 

import cn.com.xinli.lmss.ws.interfaces.MathServiceIF;

 

public class MathService implements MathServiceIF {

 

    public int[] getPrimeNumberArray(int num) {

       System.out.println("调用了");

       List<Integer> list = getPrimeNumberList(new Integer(num));

      

       int a[] = new int[list.size()];

       for (int i=0;i<list.size();i++) {

           Integer temp = list.get(i);

           a[i] = temp.intValue();

       }

       return a;    

    }

 

    public List<Integer> getPrimeNumberList(Integer num) {

       List<Integer> list = new ArrayList<Integer>();

       for(int i=1;i<=num;i++)

       {

           if(isPrimeNumber(i))

           {

              list.add(new Integer(i));

           }     

       }

      

       return list;

    }

 

    /**

     * @param num

     * @return 如果这个数是素数,返回true,否则返回false

     */

    public boolean isPrimeNumber(int number){

         if(number<2)

             return false;

         for(int i=2;i<=Math.sqrt(number);i++){

             if(number%i==0&&number!=2)

                 return false;

         }

         return true;

     }

 

}

方法实现了,现在来把它发布成一个web服务。

src下边创建一个文件夹META-INF,在META-INF下边在创建一个目录xfire,在xfire目录里边创建一个xml文件,services.xml,内容如下:

<beans>

  <service xmlns="http://xfire.codehaus.org/config/1.0">

   <name>MathService</name>

    <namespace>http://lmss.xinli.com.cn</namespace>

    <serviceClass>cn.com.xinli.lmss.ws.interfaces.MathServiceIF</serviceClass>

    <implementationClass>cn.com.xinli.lmss.ws.impl.MathService</implementationClass>

  </service>

</beans>

然后把webroot目录发布到tomcat上边去,我发布名称是xfire

先看看web.xml的配置

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"

        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <display-name>素数计算</display-name>

 

    <servlet> 

        <servlet-name>XFireServlet</servlet-name>     

        <servlet-class>

            org.codehaus.xfire.transport.http.XFireConfigurableServlet

        </servlet-class>

    </servlet>

 

    <servlet-mapping>

        <servlet-name>XFireServlet</servlet-name>

        <url-pattern>/services/*</url-pattern>

    </servlet-mapping>

</web-app>

 

       启动tomcat,我的访问地址是,http://localhost:8080/xfire/services访问后,结果令人沮丧,挂了。有一个错误如下:<!----><!---->
<!---->

大致意思是在MathServiceIF类中没有指明getPrimeNumberList返回值的List中的类型。

二.说说XFireaegis绑定

首先说明,AegisXFire默认的绑定方式,何时需要绑定?

1 Aegis支持的类型

       1.基本类型:int,double,float,long,byte[],short,String,decimal

       2.数组(Array)

       3.集合类型(Collection)

       4.日期类型:java.util.Date, java.util.Calendar, java.sql.Timestamp, java.sql.Date, java.sql.Time

       5.XML:org.w3c.dom.Docmument, org.jdom.Element, XMLStreamReader,XML文本

       6.包含以上类型的自定义类型

2 Aegis需要绑定的类型

       1.集合类型(Collection)

       2.包含集合类型的自定义类型

 

       当使用JDK1.4时,或者是使用了JDK1.5及以上版本但是没有使用泛型的时候、当遇到需要映射POJO或配置WebService接口方法返回类型(如集合类型)时,需要进行绑定,此时aegis的绑定为建立.aegis.xml的文件。

3封装接口

       例如,需要将以下接口封装

public interface UserService {

   

    public User findUserById(String id);

 

    public String test();

 

    public Collection findRolesByUserId(String id);

}

观察此接口,首先我们看findRolesByUserId方法,此方法传入String,返回类型为Collection,此时,我们即需要配置findRolesByUserId方法。

配置步骤,在接口类的同一包下建立和接口名相同的aegis.xml文件,即UserService.aegis.xml文件。

UserService.aegis.xml


<?xml version="1.0" encoding="UTF-8"?>

<mappings>

       <mapping>

              <method name="findRolesByUserId">

                     <return-type

                            componentType="cn.com.xinli.lmss.entity.Role" />

              </method>

       </mapping>

</mappings>

       其中,method代表需要配置的方法名,由于XFire可以支持基本类型,针对集合类型时,需要配置,返回类型或参数类型为基本类型时不需要特殊配置。<return-type/>节点是用来配置返回的Collection中的对象类型,componentType属性代表返回的集合中所包含的类,此类可以是自定义的对象,也可以是基本类型,当然,如果这个类也是包含需要绑定的类型时,需要对这个类也进行aegis说明,详细见下边的例子。

       到此,findRolesByUserId方法配置完毕

       这里需要注意,参数如果也是需要绑定的类型时,也需要aegis说明,使用的是<parameter index="0" componentType="java.lang.String"/>。另外如果方法有两个参数,一个比如为String,一个为集合,那么只需要配置集合参数即可。注意index的值要是集合参数的位置。

4 封装POJO

晕,字太多了,看附件好了,另外附上工程源码的下载地址

http://www.fs2you.com/files/82779ceb-cb28-11dc-81e5-0014221f3995/

 

 

 

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics