XFire的使用小结

以前就开始看过一些XFire的资料,但是每一次都是按照书写的例子才能写出一些基本的例子,根本不理解,目前又做了一种发布webservice的方式 通过继承XFireServlet的方式,这种方式的好处就是简单 不需要配置services.xml文件 


User
public class User {
private int id;
private String name;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

}

 


UserManager
public interface UserManager {
List findAllUser();
}

    UserManagerImpl

public class UserManagerImpl implements UserManager {

	public List findAllUser() {
		List list = new ArrayList();
		for(int i = 1 ; i <= 3 ; i ++) {
			User user = new User();
			user.setId(i);
			user.setName("user" + i);
			list.add(user);
		}
		return list;
	}

}

    最简单的两个方法

建立一个SOAPServlet继承XFireServlet,覆盖init()方法,在init()方法里面注册自己的服务:
public class SOAPServlet extends XFireServlet {
@Override
public void init() throws ServletException {
  super.init();
  ServiceRegistry registry = this.getXFire().getServiceRegistry();
  ObjectServiceFactory factory = new ObjectServiceFactory();
  Service service = factory.create(UserManager.class); // 根据具体类型创建服务
  service.setInvoker(new BeanInvoker(new UserManagerImpl())); // 设定服务调用模式
  registry.register(service); // 向服务管理注册服务
}
}

   注意一下super.init(),是必须加的,因为XFire核心的 Http Transprot是通过 XFireServletController实现的,我们可以来看下XFireServlet的init()方法里面都干了什么

写道
public void init()
throws ServletException
{
try
{
super.init();
xfire = createXFire();
controller = createController();//这里去创建XFireServletController
}
catch (Throwable tx)
{
// log.er
logger.error("Error initializing XFireServlet.", tx);
throw new ServletException("Error initializing XFireServlet.", tx);
}
}

 如果没有init()就会报空指针错误,当然这个错误很明显 会提示你XFireServletController为空,我只是在这里说明下,因为小弟水平太次了,就犯了这个错误,一看空指针也没有看详细信息就以为失败了,真是太2了。


再配置下web.xml把我们的servlet配置进去:

写道
<servlet>
<servlet-name>SOAPServlet</servlet-name>
<servlet-class>com.soap.SOAPServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SOAPServlet</servlet-name>
<url-pattern>/soap/*</url-pattern>
</servlet-mapping>

 好了启动服务访问下:

http://127.0.0.1:8080/webservice/soap/UserManager?wsdl


呵呵,估计又报错了,说类型不能识别,使用jdk1.5以上的朋友可以加上泛型把上面的List 都改成List<User>再跑就行了,但是很多情况下又得去支持jdk1.4那么我们就必须在接口的目录下添加一个xxx.aegis.xml文件了:


这里就是UserManager.aegis.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<mappings>
    <mapping>
        <method name="findAllUser">
            <return-type componentType="com.soap.User"/>
        </method>
    </mapping>
</mappings>


相信大家一看就知道这个文件的意思了,但是为了帮助跟我一样的菜鸟  我稍微解释下这个文件的意思:

第一行不用说,xml的固定写法:

<mappings>下的mapping映射的<method>就是我们接口中的方法,为什么要这个配置文件呢,因为XFire只支持八种基本类型,有时候我都忘了八种基本类型有char和short了(char byte short  int long double float boolean 呵呵 这里补充下,真是太菜了,要不说出去都丢人了),好了 也就是说不是这八种类型 不管是参数 和 返回值  XFire都不知道,就需要我们手动配置了


<method name="findAllUser"> //name属性 方法名为findAllUser 

           //如果你的方法里面有参数也不是这八种基本类型 比如有个参数是 User user ,String str

          //配置

<parameter index="0" keyType="com.soap.User" componentType="com.soap.User" mappedName="user"/>   //名称就知道了 我就 不解释了

  <parameter index="1" keyType="java.lang.String" componentType="java.lang.String" mappedName="str"/>
            <return-type componentType="com.soap.User"/> //返回类型的List中封装的是什么 看来泛型真是个好东西,可惜为了兼容1.4只能忍了
</method>



好了不使用泛型的方式也行了 部署测试下。



可能还有需求我不想用web方式  用j2se方式 能发布xfire吗,答案是肯定的,XFire为我们提供了一个XFireHttpServer ,在上面那个基础上我写了一个文件:

public class ServiceStarter {
   
    XFireHttpServer server;
   
    public void start() throws Exception {
        //创建service
        ObjectServiceFactory serviceFactory = new ObjectServiceFactory();
        Service endpoint = serviceFactory.create(UserManager.class);
        Service endpoint1 = serviceFactory.create(WebserviceInterface.class);
       
        endpoint.setInvoker(new BeanInvoker(new UserManagerImpl()));
        endpoint1.setInvoker(new BeanInvoker(new Webservicehandler()));
       
        //我这里注册了两个服务  就是为了验证下看能否注册多个接口  上面XFire的例子也是一样的

       //这里就必须手动建立xfire了
        XFire xfire = XFireFactory.newInstance().getXFire();
        xfire.getServiceRegistry().register(endpoint);
        xfire.getServiceRegistry().register(endpoint1);
       
        //建立对象
        server = new XFireHttpServer();

       //设置监听端口
        server.setPort(8081);

     //开启服务
        server.start();
    }


    public void stop() throws Exception {
        server.stop();
    }
   
    public static void main(String[] args) {
        ServiceStarter starter = new ServiceStarter();
        try {
            starter.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这里写的很简单,直接运行下这个方法   然后访问:

http://127.0.0.1:8081/UserManager?wsdl      这种情况估计不常见 知道下就可以了    



还有配置service.xml方式的例子 我就不介绍了,那种例子别人给的太多了 。。。。

 

 

 

你可能感兴趣的:(xml,servlet,webservice,配置管理,SOAP)