WebService CXF学习(高级篇2):CXF+Spring+Hibernate

 前一节仅仅只讲了与Spring整合,没有涉及到数据库,而且是直接将Java象传递到服务端。这一节我起到一个回顾前面章节的作用。用在客户端运用JABX将JAVA对象编组成XML文件,在客户端将XML解组成JAVA并存入数据库。下面我们就着手开发这个Demo:
    服务端开发
    第一步,编写数据资源层相关接口
    DAO编写:
   
Java代码 复制代码 
  1. public interface HibernateDao {   
  2.        
  3.     public void save(UserInfo object);   
  4.     public void delete(UserInfo object);   
  5.     public void update(UserInfo object);   
  6.     public UserInfo get(int id);   
  7. }   
  8.       


    DAO实现类:
Java代码 复制代码 
  1. public class HibernateDaoImpl extends HibernateDaoSupport implements HibernateDao {   
  2.   
  3.     public void delete(UserInfo object) {   
  4.         this.getHibernateTemplate().delete(object);   
  5.     }   
  6.   
  7.     public void save(UserInfo object) {   
  8.         this.getHibernateTemplate().save(object);   
  9.     }   
  10.   
  11.     public void update(UserInfo object) {   
  12.         this.getHibernateTemplate().update(object);   
  13.     }   
  14.   
  15.     public UserInfo get(int id) {   
  16.         return (UserInfo) this.getHibernateTemplate().get(UserInfo.class, id);   
  17.     }   
  18.   
  19. }  

      实体对象:
Java代码 复制代码 
  1. @Entity  
  2. @Table(name = "userinfo")   
  3. public class UserInfo implements java.io.Serializable {   
  4.   
  5.     private static final long serialVersionUID = 2281022190032353574L;   
  6.        
  7.     @Id  
  8.     @GeneratedValue(strategy = GenerationType.IDENTITY)   
  9.     private Integer id;   
  10.     private String name;   
  11.     private Integer age;   
  12.     private Integer address;   
  13.   
  14.     public UserInfo() {   
  15.     }   
  16.   
  17.     public UserInfo(String name, Integer age) {   
  18.         this.name = name;   
  19.         this.age = age;   
  20.     }   
  21.   
  22.     public UserInfo(String name, Integer age, Integer address) {   
  23.         this.name = name;   
  24.         this.age = age;   
  25.         this.address = address;   
  26.     }   
  27.   
  28.     public Integer getId() {   
  29.         return this.id;   
  30.     }   
  31.   
  32.     public void setId(Integer id) {   
  33.         this.id = id;   
  34.     }   
  35.   
  36.     public String getName() {   
  37.         return this.name;   
  38.     }   
  39.   
  40.     public void setName(String name) {   
  41.         this.name = name;   
  42.     }   
  43.   
  44.     public Integer getAge() {   
  45.         return this.age;   
  46.     }   
  47.   
  48.     public void setAge(Integer age) {   
  49.         this.age = age;   
  50.     }   
  51.   
  52.     public Integer getAddress() {   
  53.         return this.address;   
  54.     }   
  55.   
  56.     public void setAddress(Integer address) {   
  57.         this.address = address;   
  58.     }   
  59.   
  60. }  


      第二步:业务逻辑层接口编写
      业务逻辑接口:
Java代码 复制代码 
  1. @WebService  
  2. public interface IService {   
  3.   
  4.     //public void save(@WebParam(name="info")String xml);   
  5.     public void save(@WebParam(name="dto")UserInfoDTO dto,@WebParam(name="flag")boolean flag);   
  6.     public void update(@WebParam(name="info")String xml);   
  7.     public void delete(@WebParam(name="id")int id);   
  8.     public @WebResult(name="String")String get(@WebParam(name="id")int id);   
  9. }  

     接口实现类:
Java代码 复制代码 
  1. @WebService  
  2. public class ServiceImpl implements IService {   
  3.     private Logger log = LoggerFactory.getLogger(ServiceImpl.class);   
  4.     private HibernateDao dao;   
  5.        
  6. //  public void setDao(HibernateDao dao) {   
  7. //      this.dao = dao;   
  8. //  }   
  9.   
  10.     public void delete(int id) {   
  11.         log.info("delete id is {} user"+id);   
  12.         //UserInfo userInfo = (UserInfo)object;   
  13.         //log.info("this username is:"+userInfo.getName());   
  14.         //log.info("delete {} information..."+userInfo.getName());   
  15.         //dao.delete(userInfo);   
  16.     }   
  17.   
  18. //  public void save(String xml) {   
  19. //      //UserInfo userInfo = (UserInfo)object;   
  20. //      log.info("add {} user..."+xml);   
  21. //      //dao.save(userInfo);   
  22. //      System.out.println("ssss");   
  23. //  }   
  24.        
  25.     public void save(UserInfoDTO dto,boolean flag) {   
  26.         System.out.println("name:"+dto.getName());   
  27.     }   
  28.   
  29.     public void update(String xml){   
  30.         ApplicationContext context = new ClassPathXmlApplicationContext(   
  31.         "applicationContext-resources.xml");   
  32.         this.dao = (HibernateDao)context.getBean("dao");   
  33.         try {   
  34.             JAXBContext jaxbContext = JAXBContext.newInstance("com.itdcl.model");   
  35.             Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();   
  36.             StringReader reader = new StringReader(xml);   
  37.             Customers cus = (Customers)unmarshaller.unmarshal(reader);   
  38.             Customer cust = cus.getCustomer();   
  39.                
  40.             UserInfo userInfo = new UserInfo();   
  41.             System.out.println("Address:"+cust.getAddress());   
  42.             userInfo.setAddress(cust.getAddress());   
  43.             System.out.println("Age:"+cust.getAge());   
  44.             userInfo.setAge(Integer.valueOf(cust.getAge()));   
  45.             System.out.println("Name:"+cust.getName());   
  46.             //userInfo.setId(2);   
  47.             userInfo.setName(cust.getName());   
  48.                
  49.             dao.save(userInfo);   
  50.         } catch (JAXBException e) {   
  51.             e.printStackTrace();   
  52.         }   
  53.            
  54.     }   
  55.        
  56.     public String get(int id){   
  57.         //return dao.get(id);   
  58.         return null;   
  59.     }   
  60. }  


     DAO与Service接口配置:
Java代码 复制代码 
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop"  
  5.     xmlns:tx="http://www.springframework.org/schema/tx"  
  6.     xmlns:jaxws="http://cxf.apache.org/jaxws"  
  7.     xsi:schemaLocation="   
  8.     http://cxf.apache.org/jaxws    
  9.     http://cxf.apache.org/schemas/jaxws.xsd   
  10.     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd   
  11.     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd   
  12.     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">   
  13.   
  14.     <!--*******************Hibernate数据库持久层配置文件***********************-->   
  15.     <bean id="propertyConfigurer"  
  16.         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">   
  17.         <property name="locations">   
  18.             <list>   
  19.                 <value>classpath:jdbc.properties</value>   
  20.             </list>   
  21.         </property>   
  22.     </bean>   
  23.   
  24.     <bean id="dataSource"  
  25.         class="org.springframework.jdbc.datasource.DriverManagerDataSource">   
  26.         <property name="driverClassName" value="${driverClassName}" />   
  27.         <property name="url" value="${jdbc.url}" />   
  28.         <property name="username" value="${jdbc.username}" />   
  29.         <property name="password" value="${jdbc.password}" />   
  30.     </bean>   
  31.   
  32.     <bean id="sessionFactory"  
  33.         class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">   
  34.         <property name="dataSource">   
  35.             <ref local="dataSource" />   
  36.         </property>   
  37.         <property name="hibernateProperties">   
  38.             <props>   
  39.                 <prop key="hibernate.dialect">   
  40.                     ${hibernate.dialect}   
  41.                 </prop>   
  42.                 <prop key="hibernate.show_sql">${show_sql}</prop>   
  43.                 <prop key="hibernate.format_sql">${format_sql}</prop>   
  44.                 <!-- 缓存设置 -->   
  45.                 <prop key="cache.use_query_cache">   
  46.                     ${cache.use_query_cache}   
  47.                 </prop>   
  48.                 <prop key="cache.use_second_level_cache">   
  49.                     ${cache.use_second_level_cache}   
  50.                 </prop>   
  51.                 <prop key="cache.provider_class">   
  52.                     ${cache.provider_class}   
  53.                 </prop>   
  54.   
  55.                 <!-- C3P0连接池配置 -->   
  56.                 <prop key="c3p0.acquire_increment">   
  57.                     ${c3p0.acquire_increment}   
  58.                 </prop>   
  59.                 <prop key="c3p0.max_statements">   
  60.                     ${c3p0.max_statements}   
  61.                 </prop>   
  62.                 <prop key="c3p0.min_size">${c3p0.min_size}</prop>   
  63.                 <prop key="c3p0.max_size">${c3p0.max_size}</prop>   
  64.                 <prop key="c3p0.timeout">${c3p0.timeout}</prop>   
  65.                 <prop key="c3p0.idle_test_period">   
  66.                     ${c3p0.idle_test_period}   
  67.                 </prop>   
  68.             </props>   
  69.         </property>   
  70.         <property name="namingStrategy">   
  71.             <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />   
  72.         </property>   
  73.         <property name="packagesToScan" value="com.itdcl.pojo" />   
  74.     </bean>   
  75.   
  76.     <bean id="dao" class="com.itdcl.dao.HibernateDaoImpl">   
  77.         <property name="sessionFactory" ref="sessionFactory" />   
  78.     </bean>   
  79. </beans>  


     WebService接口发布:
Java代码 复制代码 
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:jaxws="http://cxf.apache.org/jaxws"  
  5.     xsi:schemaLocation="   
  6.         http://www.springframework.org/schema/beans    
  7.         http://www.springframework.org/schema/beans/spring-beans-2.0.xsd   
  8.         http://cxf.apache.org/jaxws    
  9.         http://cxf.apache.org/schemas/jaxws.xsd">   
  10.     <import resource="classpath:META-INF/cxf/cxf.xml" />   
  11.     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />   
  12.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />   
  13.   
  14.     <bean id="serverUserInfo" class="com.itdcl.model.UserInfoDTO" />   
  15.     <jaxws:endpoint id="helloWorld"  
  16.         implementor="com.itdcl.service.HelloWorldImpl" address="/HelloWorld" />   
  17.   
  18.     <jaxws:endpoint id="myTest"  
  19.         implementor="com.itdcl.service.MyTestImpl" address="/MyTest" />   
  20.   
  21.     <jaxws:endpoint id="service"  
  22.         implementor="com.itdcl.service.ServiceImpl" address="/Service">   
  23.         <!--  jaxws:serviceFactory>   
  24.             <ref bean="jaxWsServiceFactoryBean" />   
  25.         </jaxws:serviceFactory>-->   
  26.     </jaxws:endpoint>   
  27.   
  28.     <bean id="jaxWsServiceFactoryBean"  
  29.         class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">   
  30.         <property name="wrapped" value="true" />   
  31.         <property name="dataBinding" ref="aegisBean" />   
  32.     </bean>   
  33.   
  34.     <bean id="aegisBean"  
  35.         class="org.apache.cxf.aegis.databinding.AegisDatabinding" />   
  36. </beans>  


    第三步:服务端程序编写了,打包部署

    客户端开发
    第一步:WebService客户端生成,可以手工编写。这里我就通过配置Ant文件来生成WebService客户端:
Java代码 复制代码 
  1. <?xml version="1.0"?>   
  2. <project name="cxf" basedir="." default="usage">   
  3.     <property name="webroot.dir" value="E:/workspace3/CXFSpring" />   
  4.     <!-- webservice接口 -->   
  5.     <property name="target.class" value="com.itdcl.service.IService" />   
  6.     <property name="wsdl.name" value="Service.wsdl" />   
  7.     <property name="src.dir" value="src" />   
  8.     <property name="client.dir" value="client" />   
  9.     <property name="server.dir" value="server" />   
  10.     <property name="compile.dir" value="${webroot.dir}/bin" />   
  11.   
  12.     <target name="usage">   
  13.         <echo   
  14.             message="java2wsdl         -->java文件生成wsdl文件,java2wsdl -Ddir=com/starit/cxf/java2wsdl -Dsrc=com.starit.cxf.java2wsdl.Hello" />   
  15.         <echo   
  16.             message="wsdl2javaClient       -->java文件生成client,java2wsdl -Ddir=com/starit/cxf/java2wsdl -Dwsdl=hello.wsdl" />   
  17.     </target>   
  18.     <target name="java2wsdl">   
  19.         <echo message="生成wsdl文件" />   
  20.         <exec dir="${compile.dir}" executable="cmd.exe">   
  21.             <arg line="/c java2ws" />   
  22.             <arg line="-o ${wsdl.name} -wsdl ${target.class}" />   
  23.         </exec>   
  24.         <!-- copy资源文件 -->   
  25.         <move todir="${src.dir}" preservelastmodified="true">   
  26.             <fileset dir="${compile.dir}">   
  27.                 <include name="**/*.wsdl" />   
  28.             </fileset>   
  29.         </move>   
  30.     </target>   
  31.   
  32.     <target name="wsdl2javaClient">   
  33.         <echo message="生成java client文件" />   
  34.         <mkdir dir="${client.dir}" />   
  35.         <exec dir="." executable="cmd.exe">   
  36.             <arg line="/c wsdl2java" />   
  37.             <!-- 生成的java所存目录 -->   
  38.             <arg line="-d ${client.dir}"/>   
  39.             <!-- wsdl文件所在路径 -->   
  40.             <arg line="-client src\*.wsdl" />   
  41.         </exec>   
  42.     </target>   
  43. </project>  


    第二步:WebService接口注册配置
Java代码 复制代码 
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:jaxws="http://cxf.apache.org/jaxws"  
  5.     xsi:schemaLocation="   
  6.         http://www.springframework.org/schema/beans    
  7.         http://www.springframework.org/schema/beans/spring-beans-2.0.xsd   
  8.         http://cxf.apache.org/jaxws    
  9.         http://cxf.apache.org/schemas/jaxws.xsd">   
  10.   
  11.     <!--  jaxws:client id="helloWorldClient"  
  12.         address="http://localhost:9999/cxf/HelloWorld"  
  13.         serviceClass="com.itdcl.service.IHelloWorld" />-->   
  14.   
  15.     <!--  jaxws:client id="myTestClient"  
  16.         address="http://localhost:9999/cxf/MyTest"  
  17.         serviceClass="com.itdcl.service.IMyTest" />-->   
  18.   
  19.     <jaxws:client id="service"  
  20.         address="http://localhost:9999/cxf/Service"  
  21.         serviceClass="com.itdcl.service.IService" />   
  22. </beans>  

    
    剩下的事就测试我们整合是否成功了,编写一个JUnit测试类或写一个Main函数测试一下。
Java代码 复制代码 
  1. public class JaxbSampleClient {   
  2.     private final static String MODEL = "com.itdcl.model";   
  3.     public static void main(String[] args) throws FileNotFoundException, JAXBException, ParserConfigurationException, TransformerException {   
  4.         ApplicationContext context = new ClassPathXmlApplicationContext(   
  5.                 "beans.xml");   
  6.         IService service = (IService) context.getBean("service");   
  7.            
  8.            
  9.         ObjectFactory factory = new ObjectFactory();   
  10.         Customer customer = factory.createCustomer();   
  11.         customer.setId(1);   
  12.         customer.setAge("26");   
  13.         customer.setName("Josen");   
  14.         customer.setAddress(100);   
  15.   
  16.         Customers customers = factory.createCustomers();   
  17.         customers.setCustomer(customer);   
  18.   
  19.         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();   
  20.         dbf.setNamespaceAware(true);   
  21.         DocumentBuilder db = dbf.newDocumentBuilder();   
  22.         Document doc = db.newDocument();   
  23.   
  24.         // 转换   
  25.         JAXBContext jaxbContext = JAXBContext.newInstance(MODEL);   
  26.         Marshaller marshaller = jaxbContext.createMarshaller();   
  27.         //将customers数据与doc绑定   
  28.         marshaller.marshal(customers, doc);   
  29.            
  30.         DOMSource domSource = new DOMSource(doc);   
  31.         StringWriter writer = new StringWriter();   
  32.         StreamResult result = new StreamResult(writer);   
  33.         TransformerFactory tf = TransformerFactory.newInstance();   
  34.         Transformer transformer = tf.newTransformer();   
  35.         transformer.transform(domSource, result);   
  36.         String xmlString = writer.toString();   
  37.         //System.out.println(xmlString);   
  38.            
  39.         service.update(xmlString);   
  40.     }   
  41.   
  42. }  


    运行一下,看插入数据库没有。这节到此就靠一段落啦,下节讲解WS-Security

你可能感兴趣的:(WebService CXF学习(高级篇2):CXF+Spring+Hibernate)