WebService与XFire

 1、WebService与XFire简介

       WebService即分布式开发,是将一个完整的项目拆分为多个项目,分别完成前台部分(VC)和后台部分(M),各个项目之间是单独存在的,可以单独部署。 
     理论上分布式开发可以提高开发效率,但会影响访问的性能。这种分布式开发一般在政府项目或多公司合作开发时使用。
 
     Java最早的分布式的开发是SUN提出的RMI(远程方法调用),在这个的基础上,结合ORMapping的概念,出现了EJB1/2。
 
     WebService概念实际上是微软提出的,也是完成分布式开发的功能,但交互数据使用w3c提供的标准XML完成。这样可以进行跨语言的交互。在这之后,Java也出现了支持WebService的语法JAXB,但语法非常复杂,基本上不用,在这个基础上出现了两个框架(XFire和AXIS),但AXIS没有工具支持,需要手工对发布的远程接口进行编译以及修改。在XFire的1.2.6版本后,XFire被Apache收购,更名为CXF,但更新版本后,只能在Spring2.5环境下使用,如果不使用Spring,该框架无法单独使用。

      在这里XML的语法格式是由w3c制订好的,语法为WSDL,之间的传输协议为SOAP。 
这种项目一般在以下情况下使用: 
政府项目,特别是电信项目和银行项目 
多公司合作的项目 
子公司项目


2、XFire+Hibernate完成登陆功能 

     这里先不使用Spring框架,先单独使用Hibernate完成后台项目,Struts2完成前台项目 
建立WebService项目 

 

 

 

 

 

在web.xml中会自动加入以下内容:

 <servlet> 
        <servlet-name>XFireServlet</servlet-name> 
        <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class> 
          <load-on-startup>0</load-on-startup> 
</servlet> 
<servlet-mapping> 
      <servlet-name>XFireServlet</servlet-name> 
       <url-pattern>/services/*</url-pattern> 
</servlet-mapping>

 

    加入Hibernate支持 
在编写好服务接口和实现类后。

 

 

需要建立一个WebService后台的服务 
 

  

 

 
这时会在项目的根目录下增加一下WebServices的目录,和一个services.xml文件:

 

 


<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://xfire.codehaus.org/config/1.0"> 
     <service> 
          <name>UserService</name> 
           <serviceClass>org.wu.xfire.service.UserService</serviceClass> 
           <implementationClass> 
                     org.wu.xfire.service.impl.UserServiceImpl 
           </implementationClass> 
     <style>rpc</style> 
     <use>literal</use> 
     <scope>application</scope> 
</service> 
</beans>

 

 后台项目完成后,如果部署可以查看WSDL的信息:则表示后台项目完成。 
http://localhost/WebServiceBack/services/UserService?wsdl,

 

 在WebServiceBack中编写测试类进行测试:

测试成功后可以编写前台项目调用后台项目发布的服务接口UserService!

 

 

package org.wu.xfire.test; 

import java.net.MalformedURLException; 
import org.codehaus.xfire.XFireFactory; 
import org.codehaus.xfire.client.XFireProxyFactory; 
import org.codehaus.xfire.service.Service; 
import org.codehaus.xfire.service.binding.ObjectServiceFactory; 
import org.wu.xfire.dao.HelloDAO; 
import org.wu.xfire.pojo.User; 
import org.wu.xfire.service.UserService; 

public class Test { 

public static void main(String[] args) { 
              Service service = new ObjectServiceFactory().create(UserService.class); 
              Service helloservice = new ObjectServiceFactory().create(HelloDAO.class); 
              XFireProxyFactory factory = new XFireProxyFactory(XFireFactory .newInstance().getXFire());

               String url = "http://localhost/WebServiceBack/services/UserService"; 
              try { 
                       UserService userdao = (UserService) factory.create(service , url); 
                       User user = new User(); 
                         user.setUsername("Wuzhulin"); 
                          user.setUserid("Hello"); 
                          user.setPassword("12345"); 
                         System.out.println(userdao.isLogin(user)); 
                         System.out.println(hellodao.sayHello("张三")); 
                    } catch (MalformedURLException e) { 
                              e.printStackTrace(); 
                    } catch (Exception e) { 
                         e.printStackTrace(); 
                    } 

                 }

          }

 
建立前台项目WebServiceFront,加入Struts支持.方法同上,删除web.xml中的XFire相关内容。 
需要建立一个WebService前台的服务(Web Service Client)



 

 

 

 

生成的pojo对象属性类型为JAXBElement,使用比较麻烦,最好重新加入一些setter和getter方法,方便使用,注意getter方法必须改名。User.java

 

 

package org.wu.xfire.pojo; 

import javax.xml.bind.JAXBElement; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElementRef; 
import javax.xml.bind.annotation.XmlType; 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "User", propOrder = { 
    "password", 
    "userid", 
    "username" 
}) 
public class User { 
private static ObjectFactory factory = new ObjectFactory(); 
    @XmlElementRef(name = "password", namespace = "http://pojo.xfire.wu.org", type = JAXBElement.class) 
    protected JAXBElement<String> password; 
    @XmlElementRef(name = "userid", namespace = "http://pojo.xfire.wu.org", type = JAXBElement.class) 
    protected JAXBElement<String> userid; 
    @XmlElementRef(name = "username", namespace = "http://pojo.xfire.wu.org", type = JAXBElement.class) 
    protected JAXBElement<String> username; 

    public JAXBElement<String> getPassword() { 
        return password; 
    } 

    public void setPassword(JAXBElement<String> value) { 
        this.password = ((JAXBElement<String> ) value); 
    } 

    public JAXBElement<String> getUserid() { 
        return userid; 
    } 

    public void setUserid(JAXBElement<String> value) { 
        this.userid = ((JAXBElement<String> ) value); 
    } 

    public JAXBElement<String> getUsername() { 
        return username; 
    } 

    public void setUsername(JAXBElement<String> value) { 
        this.username = ((JAXBElement<String> ) value); 
    } 
    public String getPasswordValue() { 
return password.getValue(); 


public void setPassword(String value) { 
this.password = factory.createUserPassword(value); 


public String getUseridValue() { 
return userid.getValue(); 


public void setUserid(String value) { 
this.userid = factory.createUserUserid(value); 


public String getUsernameValue() { 
return username.getValue(); 


public void setUsername(String value) { 
this.username = factory.createUserUsername(value); 


}


如果服务器端的style选择的是rpc,可以直接在前台项目中自己定义接口和pojo对象,通过XFire提供的方法直接使用。

 

 <service>
        <name>UserService</name>
         <serviceClass>org.wu.xfire.service.UserService</serviceClass>
         <implementationClass>
               org.wu.xfire.service.impl.UserServiceImpl
         </implementationClass>
       <style>rpc</style>
       <use>literal</use>
       <scope>application</scope>
 </service>

 

在WebServiceFront项目中编写测试类进行测试:

 

 

package org.wu.xfire.test; 

import org.wu.xfire.hello.HelloDAOClient; 
import org.wu.xfire.hello.HelloDAOPortType; 
import org.wu.xfire.pojo.User; 
import org.wu.xfire.user.UserServiceClient; 
import org.wu.xfire.user.UserServicePortType; 

public class Test { 

public static void main(String[] args) { 
            UserServicePortType userdao = new UserServiceClient().getUserServiceHttpPort(); 
             System.out.println(userdao.getClass().getName()); 
             User user = new User(); 
              user.setUsername("Wuzhulin"); 
              user.setUserid("hello"); 
              user.setPassword("12345"); 
              System.out.println(userdao.isLogin(user)); 
       } 
}


注意,这里不支持引用传递,因此如果要前后台沟通数据,必须通过参数和返回值的形式来传递。 
而且WebService对Hibernate关系映射的支持也很差。只支持单方向的一对多或多对多关系,而且Set集合必须加入泛型。 
分页代码也不能直接返回Map了,因为WebService不支持Object类型。需要单独定义一个Page对象。 

3、XFire + Spring 开发 
Spring在开发中主要还是结合Hibernate开发。 
在WebService的开发中,主要还是使用Spring完成后台项目,用来进行服务的发布功能。



 
 

选择XFireSpringServlet来完趁服务的发布。 
加入 Spring与Hibernate支持,并在web.xml中配置Spring结合其他框架的监听器

 

<context-param> 
           <param-name>contextConfigLocation</param-name> 
           <param-value>/WEB-INF/classes/applicationContext-*.xml</param-value> 
  </context-param> 
<listener>

            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener>


正常编写好接口与实现类,在spring中,可以直接通过bean发布服务。

 

<!-- 需要先导入一个发布服务的配置文件 --> 
<import resource="classpath:org/codehaus/xfire/spring/xfire.xml"></import> 

<bean name="userService" class="org.codehaus.xfire.spring.ServiceBean"> 
          <property name="name" value="UserService"></property> 
          <property name="serviceClass" value="org.wu.xfire.service.UserService"></property> 
          <property name="serviceBean"> 
             <ref bean="userserviceimpl"/> 
          </property> 
          <property name="style" value="rpc"></property> 
          <property name="use" value="literal"></property> 
          <property name="scope" value="application"></property> 
</bean>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值