锁定老帖子 主题:XFire开发一个WebService
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-01-25
一 使用XFire实现一个简单的WebService1 功能要求返回小于给定数的所有素数! 2 依赖文件<!----><!---->activaton-1.1.jar jaxen-1.1-beta-9.jar
下载地址: http://www.fs2you.com/files/773351f0-caf4-11dc-938c-0014221b798a/ 3 工程结构<!----><!---->工程根目录 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就可以了,但是为了说明XFire的aegis绑定,所以提供了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中的类型。 二.说说XFire的aegis绑定首先说明,Aegis为XFire默认的绑定方式,何时需要绑定? 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/
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 4543 次