zoukankan      html  css  js  c++  java
  • ibatis+spring+cxf+mysql搭建webservice

    首先需必备:mysql、myeclipse6.5、apache-cxf-2.6.2

    一、建数据库,库名:cxf_demo;表名:book

     
    1. CREATE DATABASE `cxf_demo`  --数据库  
     
    1. --表  
    2. CREATE TABLE `book` (  
    3.   `id` varchar(32) NOT NULL COMMENT 'id',  
    4.   `book_name` varchar(100) DEFAULT NULL COMMENT '名称',  
    5.   `author` varchar(100) DEFAULT NULL COMMENT '作者',  
    6.   `status` int(11) DEFAULT NULL COMMENT '状态',  
    7.   `type_id` varchar(32) DEFAULT NULL COMMENT '类型',  
    8.   `price` double DEFAULT NULL COMMENT '金额',  
    9.   `brief` varchar(100) DEFAULT NULL COMMENT '简介',  
    10.   `book_No` int(11) DEFAULT NULL COMMENT '编号',  
    11.   `create_time` datetime DEFAULT NULL COMMENT '创建时间',  
    12.   PRIMARY KEY (`id`)  
    13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8  


    二、好了,现在来建一个web项目名为:myWebservice,大概的package结构如下,大家就将package创建出来吧:

    三、建了项目后要将cxf的jar包导入哦,呵呵我不知道哪些cxf jar是必要的,所以就将所有的jar包都导入了,apache-cxf-2.6.2这个版本的。。。

    四、好了,现在我们来写resource这个包下面的配置文件,⊙0⊙噢,resource的结构是酱紫滴,看如下图:

    我们先来配置数据库jdbc.properties这个文件

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. jdbc.driverClassName=com.mysql.jdbc.Driver  
    2. jdbc.url=jdbc:mysql://localhost:3306/cxf_demo?useUnicode=true&characterEncoding=UTF-8&failOverReadOnly=false&maxReconnects=10&autoReconnect=true  
    3. jdbc.username=root  
    4. jdbc.password=root  

    然后是配置applicationContext-common.xml

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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" xmlns:jee="http://www.springframework.org/schema/jee"  
    4.     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"  
    5.     xmlns:aop="http://www.springframework.org/schema/aop"  
    6.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
    7.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
    8.     http://www.springframework.org/schema/tx   
    9.     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd   
    10.     http://www.springframework.org/schema/jee   
    11.     http://www.springframework.org/schema/jee/spring-jee-3.0.xsd   
    12.     http://www.springframework.org/schema/aop   
    13.     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
    14.     http://www.springframework.org/schema/context   
    15.     http://www.springframework.org/schema/context/spring-context-3.0.xsd"  
    16.     default-lazy-init="true">  
    17.   
    18.     <description>Spring配置</description>  
    19.   
    20.     <!-- 使用annotation 自动注册bean,并检查@Required,@Autowired的属性已被注入 -->  
    21.     <context:component-scan base-package="com.cy" />  
    22.   
    23.     <!-- 加载JDBC property文件 -->  
    24.     <context:property-placeholder location="classpath*:config/jdbc.properties" ignore-unresolvable="true"/>  
    25.       
    26.     <!-- 连接数据库   -->  
    27.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
    28.         <property name="driverClassName" value="${jdbc.driverClassName}"/>  
    29.         <property name="url" value="${jdbc.url}"/>  
    30.         <property name="username" value="${jdbc.username}"/>  
    31.         <property name="password" value="${jdbc.password}"/>  
    32.           
    33.         <!-- Connection Pooling Info -->  
    34.     <!-- <property name="initialSize" value="1" /> 初始化连接数量 -->   
    35.         <property name="maxIdle" value="5" /><!-- 最大等待连接中的数量,设 0 为没有限制 -->  
    36.         <property name="minIdle" value="1"/><!-- 最小等待连接中的数量,设 0 为没有限制  -->  
    37.         <property name="maxActive" value="25" /><!-- 连接池的最大数据库连接数。设为0表示无限制。 -->  
    38.     <!-- <property name="maxWait" value="60000"/> 最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。  -->     
    39.     <!-- <property name="timeBetweenEvictionRunsMillis" value="3600000" />  -->   
    40.     <!--    <property name="minEvictableIdleTimeMillis" value="3600000" /> -->    
    41.     <!-- <property name="removeAbandoned" value="true" />强制自我中断避免dbcp自身bug出现连接过久资源耗尽-->  
    42.     <!--    <property name="removeAbandonedTimeout" value="60" />自我中断时间秒 -->  
    43.     </bean>  
    44.       
    45.     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
    46.         <property name="dataSource" ref="dataSource"/>  
    47.     </bean>  
    48.       
    49.     <!-- 使用annotation定义事务  -->  
    50.     <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />  
    51.     <!-- ibatis -->     
    52.     <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">  
    53.         <property name="configLocation" value="classpath:sqlmap-config.xml"/>  
    54.         <property name="dataSource" ref="dataSource"/>  
    55.     </bean>  
    56.       
    57.     <!-- 配置切面   -->  
    58.     <aop:config>  
    59.         <aop:aspect id="logAspecter" ref="logAspcet">  
    60.             <aop:pointcut id="mypointcut" expression="execution(* com.cy.*.service.impl.*.*(..))"/>  
    61.         </aop:aspect>  
    62.     </aop:config>  
    63.   
    64. </beans>  


    五、好啦,现在我们来写dto在Book.java文件里

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. package com.cy.business.dto;  
    2.   
    3. import java.util.Date;  
    4.   
    5. public class Book {  
    6. private static final long serialVersionUID = -2672626820160275114L;  
    7.       
    8.     private String id;  
    9.     private String bookName;  
    10.     private String author;  
    11.     private String typeId;  
    12.     private Double price;  
    13.     private String brief;  
    14.     private Integer bookNo;  
    15.     private Integer status;  
    16.     private Date createTime;  
    17.     public String getId() {  
    18.         return id;  
    19.     }  
    20.     public void setId(String id) {  
    21.         this.id = id;  
    22.     }  
    23.     public String getBookName() {  
    24.         return bookName;  
    25.     }  
    26.     public void setBookName(String bookName) {  
    27.         this.bookName = bookName;  
    28.     }  
    29.     public String getAuthor() {  
    30.         return author;  
    31.     }  
    32.     public void setAuthor(String author) {  
    33.         this.author = author;  
    34.     }  
    35.     public String getTypeId() {  
    36.         return typeId;  
    37.     }  
    38.     public void setTypeId(String typeId) {  
    39.         this.typeId = typeId;  
    40.     }  
    41.     public Double getPrice() {  
    42.         return price;  
    43.     }  
    44.     public void setPrice(Double price) {  
    45.         this.price = price;  
    46.     }  
    47.     public String getBrief() {  
    48.         return brief;  
    49.     }  
    50.     public void setBrief(String brief) {  
    51.         this.brief = brief;  
    52.     }  
    53.     public Integer getBookNo() {  
    54.         return bookNo;  
    55.     }  
    56.     public void setBookNo(Integer bookNo) {  
    57.         this.bookNo = bookNo;  
    58.     }  
    59.     public Integer getStatus() {  
    60.         return status;  
    61.     }  
    62.     public void setStatus(Integer status) {  
    63.         this.status = status;  
    64.     }  
    65.     public Date getCreateTime() {  
    66.         return createTime;  
    67.     }  
    68.     public void setCreateTime(Date createTime) {  
    69.         this.createTime = createTime;  
    70.     }  
    71. }  

    然后咧,就是在sqlmap文件夹里写Book_SqlMap.xml与dto关联哦:

     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">  
    3. <!-- 定义命名空间 -->  
    4. <sqlMap  namespace="BookNS">  
    5.     <!-- 定义缓存 -->  
    6.     <cacheModel id="Book_Cache" type="OSCACHE" readOnly="true">  
    7.         <flushInterval hours="24" />  
    8.         <!-- 配置哪些SQL将清空缓存 -->  
    9.         <flushOnExecute statement="saveBook" />  
    10.         <flushOnExecute statement="deleteBook" />  
    11.         <flushOnExecute statement="updateBook" />  
    12.         <flushOnExecute statement="changeBookStatus" />  
    13.         <property name="size" value="1000" />  
    14.     </cacheModel>  
    15.       
    16.     <!-- 对象引用 -->  
    17.     <typeAlias alias="BookPo" type="com.cy.business.dto.Book"/>  
    18.       
    19.     <!-- 定义结果 -->  
    20.     <resultMap class="BookPo" id="BookPo_Result">  
    21.         <result column="id" property="id" />  
    22.         <result column="book_name" property="bookName" />  
    23.         <result column="author" property="author" />  
    24.         <result column="type_id" property="typeId" />  
    25.         <result column="price" property="price" />  
    26.         <result column="brief" property="brief" />  
    27.         <result column="book_No" property="bookNo" />  
    28.         <result column="status" property="status" />  
    29.         <result column="create_time" property="createTime"/>  
    30.     </resultMap>  
    31.       
    32.     <select id="queryBook" parameterClass="BookPo" resultMap="BookPo_Result" cacheModel="Book_Cache">  
    33.         select * from book   
    34.         <dynamic prepend=" WHERE ">  
    35.             <isNotEmpty property="id" prepend="and">  
    36.                 id=#id:VARCHAR#  
    37.             </isNotEmpty>  
    38.             <isNotEmpty property="bookName" prepend="and">  
    39.                 instr(book_Name,#bookName:VARCHAR#)  
    40.             </isNotEmpty>  
    41.             <isNotEmpty property="author" prepend="and">  
    42.                 instr(author,#author:VARCHAR#)  
    43.             </isNotEmpty>  
    44.             <isNotEmpty property="bookNo" prepend="and">  
    45.                 book_No=#bookNo:VARCHAR#  
    46.             </isNotEmpty>  
    47.         </dynamic>  
    48.     </select>  
    49.       
    50.     <insert id="saveBook" parameterClass="BookPo">  
    51.         insert into book(id,book_name,author,type_id,price,brief,book_no,status,create_time)   
    52.         values(#id#,#bookName#,#author#,#typeId#,#price#,#brief#,#bookNo#,0,sysdate());  
    53.     </insert>  
    54.       
    55.     <update id="changeBookStatus" parameterClass="BookPo">  
    56.         <![CDATA[ 
    57.         update book set status=#status# where id=#id# 
    58.         ]]>  
    59.     </update>  
    60.       
    61.     <update id="updateBook" parameterClass="BookPo">  
    62.         <![CDATA[ 
    63.         update book set book_name=#bookName#,author=#author#,type_id=#typeId# 
    64.         ,price=#price#,brief=#brief#,book_no=#bookNo# where id=#id# 
    65.         ]]>  
    66.     </update>  
    67.       
    68.     <delete id="deleteBook" parameterClass="BookPo">  
    69.         <![CDATA[ 
    70.         delete from book where id=#id# 
    71.         ]]>  
    72.     </delete>  
    73.       
    74. </sqlMap>  

    写完这些,然后来实现业务逻辑层,这些添删改查功能。。。

    接口IBookService.java

     
    1. package com.cy.business.service;  
    2.   
    3. import java.util.List;  
    4.   
    5. import com.cy.business.dto.Book;  
    6.   
    7. public interface IBookService {  
    8.   
    9. public List<Book> findBook(Book book);  
    10.       
    11.     public boolean updateBook(Book book);  
    12.       
    13.     public boolean deleteBook(Book book);  
    14.       
    15.     public boolean changeBookStatus(Book book);  
    16.       
    17.     public boolean saveBook(Book book);  
    18. }  


    实现接口方法BookService.java

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. package com.cy.business.service.impl;  
    2.   
    3. import java.util.List;  
    4.   
    5. import javax.annotation.Resource;  
    6. import javax.inject.Inject;  
    7.   
    8. import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;  
    9. import org.springframework.stereotype.Service;  
    10. import org.springframework.transaction.annotation.Transactional;  
    11.   
    12. import com.cy.business.dto.Book;  
    13. import com.cy.business.service.IBookService;  
    14. import com.ibatis.sqlmap.client.SqlMapClient;  
    15.   
    16. @Service  
    17. @Transactional  
    18. public class BookService extends SqlMapClientDaoSupport implements IBookService {  
    19.   
    20.     //及其重要,完成进行注入  
    21.     @Inject  
    22.     @Resource(name="sqlMapClient")  
    23.     public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {  
    24.         super.setSqlMapClient(sqlMapClient);  
    25.     }  
    26.       
    27.     public boolean changeBookStatus(Book book) {  
    28.         try {  
    29.             int result = this.getSqlMapClientTemplate().update("changeBookStatus", book);  
    30.             if (result > 0) {  
    31.                 return true;  
    32.             } else {  
    33.                 return false;  
    34.             }  
    35.         } catch (Exception e) {  
    36.             return false;  
    37.         }  
    38.     }  
    39.   
    40.     public boolean deleteBook(Book book) {  
    41.         try {  
    42.             int result = this.getSqlMapClientTemplate().delete("deleteBook", book);  
    43.             if (result > 0) {  
    44.                 return true;  
    45.             } else {  
    46.                 return false;  
    47.             }  
    48.         } catch (Exception e) {  
    49.             return false;  
    50.         }  
    51.     }  
    52.   
    53.     @SuppressWarnings("unchecked")  
    54.     public List<Book> findBook(Book book) {  
    55.         try {  
    56.             return this.getSqlMapClientTemplate().queryForList("queryBook", book);  
    57.         } catch (Exception e) {  
    58.             e.printStackTrace();  
    59.             return null;  
    60.         }  
    61.     }  
    62.   
    63.     public boolean saveBook(Book book) {  
    64.         try {  
    65.             this.getSqlMapClientTemplate().insert("saveBook", book);  
    66.             return true;  
    67.         } catch (Exception e) {  
    68.             e.printStackTrace();  
    69.             return false;  
    70.         }  
    71.     }  
    72.   
    73.     public boolean updateBook(Book book) {  
    74.         try {  
    75.             int result = this.getSqlMapClientTemplate().update("updateBook", book);  
    76.             if (result > 0) {  
    77.                 return true;  
    78.             } else {  
    79.                 return false;  
    80.             }  
    81.         } catch (Exception e) {  
    82.             e.printStackTrace();  
    83.             return false;  
    84.         }  
    85.     }  
    86.   
    87. }  


    嗯,完成这些,就开始来写webservice接口咯,在package名为webservice下,

    接口IMyWebservice.java

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. package com.cy.webservice;  
    2.   
    3. import javax.jws.WebMethod;  
    4. import javax.jws.WebParam;  
    5. import javax.jws.WebService;  
    6.   
    7. import org.springframework.stereotype.Component;  
    8.   
    9. import com.cy.business.dto.Book;  
    10.   
    11. @WebService(name = "IMyWebservice", targetNamespace = "http://webservice.cy.com/")  
    12. @Component()  
    13. public interface IMyWebservice {  
    14.   
    15.     @WebMethod(operationName = "pushData", action = "urn:PushData")  
    16.     public boolean pushData(@WebParam(name="book")Book book);  
    17. }  


    实现类MyWebService.java

     
    1. package com.cy.webservice.impl;  
    2.   
    3. import java.util.List;  
    4.   
    5. import javax.annotation.Resource;  
    6. import javax.jws.WebService;  
    7.   
    8. import com.cy.business.dto.Book;  
    9. import com.cy.business.service.IBookService;  
    10. import com.cy.webservice.IMyWebservice;  
    11.   
    12. @WebService(targetNamespace = "http://impl.webservice.cy.com/", portName = "MyWebservicePort", serviceName = "MyWebservice")  
    13. public class MyWebService implements IMyWebservice {  
    14.   
    15.     @Resource  
    16.     private IBookService bookService;  
    17.       
    18.     public boolean pushData(Book book) {  
    19.         try {  
    20.             System.out.println("进入webservice了。。。");  
    21.             boolean flag = bookService.saveBook(book);//先保存数据  
    22.             if(flag){  
    23.                 Book bk = new Book();  
    24.                 bk.setBookNo(89757);  
    25.                 List<Book> list = bookService.findBook(book);  
    26.                 if(list!=null && !list.isEmpty()){//然后更改数据。。。  
    27.                     bk = new Book();  
    28.                     bk = list.get(0);  
    29.                     bk.setStatus(1);  
    30.                     bk.setBookName("岑逸951560368");  
    31.                     return bookService.updateBook(bk);  
    32.                 }else{  
    33.                     return false;  
    34.                 }  
    35.             }else{  
    36.                 return false;  
    37.             }  
    38.         } catch (Exception e) {  
    39.             e.printStackTrace();  
    40.             return false;  
    41.         }  
    42.     }  
    43.   
    44. }  

    ⊙0⊙生气这样我们就写完了?还木有哦,别忘了在resource包下还有个配置文件还木有写哈。。。applicationContext-cxf.xml

     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xmlns:jee="http://www.springframework.org/schema/jee"  
    5.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
    6.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
    7.     http://cxf.apache.org/jaxws   
    8.     http://cxf.apache.org/schemas/jaxws.xsd"  
    9.     default-lazy-init="true">  
    10.   
    11.     <bean id="myWebservice" class="com.cy.webservice.impl.MyWebService"></bean>  
    12.     <jaxws:endpoint address="/myWebservice" implementor="#myWebservice"></jaxws:endpoint>  
    13.       
    14. </beans>  


    六、好啦,我们的工作做了一大半了!现在来让我们运行一下这个webservice吧,在项目http://localhost:8080/myWebservice/后边需要加上"service",这是因为在web.xml中我们这么配置的,大家还记得吧奋斗继续

     
    1. <servlet-mapping>  
    2.    <servlet-name>cxf</servlet-name>  
    3.    <url-pattern>/service/*</url-pattern>  
    4.  </servlet-mapping>  

    能够打开这个就说明你成功了................................................................一大半,为嘛这么说呢,因为还需要测试啊!!!

    你打开超链接WSDL : {http://impl.webservice.cy.com/}MyWebservice会来到这个界面

    哈哈,你的webservice写的差不多了,开心吧。。。

    七、那俺们现在开始写客户端来测试一下,要有耐心哦。。。马上就成功鸟。。。生气奋斗

    建一个名为myWebclient的JavaProject,大家跟着我建吧。。。看如下图package结构:

    我们通过myeclipse6.5来快捷的创建客户端。。。

    闭嘴来看图操作。我们将编译文件放在webservice这个包下,选择webservice这个包,new->other

    搜索出这个工具哦,然后next->next会有如下界面 wsdl url这个地址就是刚才打开的http://localhost:8080/myWebservice/service/myWebservice?wsdl      

    然后next->到下一个图了,切记myWebservice这个项目一定是部署了正在运行的哦!!!

    finish之后,所以的文件编译完成了!

    八、我们现在来完成webUtil这个package下的文件吧!

    Util.java文件

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. package com.cy.client.webUtil;  
    2.   
    3. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;  
    4.   
    5.   
    6. public class Util {  
    7.     
    8.     @SuppressWarnings({ "unchecked" })  
    9.     public static Object getService(Class clazz, String url){  
    10.         JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();  
    11.                 Object srv = null;  
    12.                 factory.setServiceClass(clazz);  
    13.         factory.setAddress(url);  
    14.         srv=(Object) factory.create();  
    15.                 return srv;  
    16.     }  
    17.   
    18. }  

    UtilWebService.java文件是连接webservice的接口地址:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. package com.cy.client.webUtil;  
    2.   
    3. import com.cy.client.webservice.IMyWebservice;  
    4.   
    5.   
    6.   
    7. public class UtilWebService {  
    8.     public static IMyWebservice getMyWebService(){  
    9.         String url="http://localhost:8080/myWebservice/service/myWebservice?wsdl";  
    10.         IMyWebservice service = (IMyWebservice) Util.getService(IMyWebservice.class,url);  
    11.         return service;  
    12.     }  
    13. }  


    现在我们在client包下建Client.java客户端

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. package com.cy.client;  
    2.   
    3. import java.util.UUID;  
    4.   
    5. import com.cy.client.webUtil.UtilWebService;  
    6. import com.cy.client.webservice.Book;  
    7. import com.cy.client.webservice.IMyWebservice;  
    8.   
    9. public class Client {  
    10.   
    11.     private IMyWebservice myWebservice;  
    12.       
    13.     public boolean getBookInfo(){  
    14.         myWebservice = UtilWebService.getMyWebService();  
    15.         // 创建 GUID 对象  
    16.         UUID uuid = UUID.randomUUID();  
    17.         // 得到对象产生的ID  
    18.         String a = uuid.toString();  
    19.         // 转换为大写  
    20.         a = a.replaceAll("-", "");  
    21.         Book book = new Book();  
    22.         book.setId(a);  
    23.         book.setAuthor("岑逸");  
    24.         book.setBookName("随园诗话");  
    25.         book.setBookNo(89757);  
    26.         book.setBrief("哈哈");  
    27.         return myWebservice.pushData(book);  
    28.     }  
    29.       
    30.     public static void main(String[] args) {  
    31.         boolean flag = new Client().getBookInfo();  
    32.         System.out.println("推送:"+flag);  
    33.     }  
    34. }  


    运行一下吧。。。哈哈成功了!!!得意生气数据库也有数据了!!!有木有可怜花了一个多小时

    非常感谢本文的作者,原文地址:http://blog.csdn.net/cenyi2013/article/details/17315755

  • 相关阅读:
    前端攻城狮学习笔记九:让你彻底弄清offset
    JavaScript中Element与Node的区别,children与childNodes的区别
    JavaScript代码优化实战之一:缓存变量,关键字过滤
    【转】纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等),NB么
    包装对象——JavaScript中原始类型拥有属性的原因
    关于两个容积不同的瓶子中装水可以得到哪些精确值的问题的算法
    JavaScript中判断鼠标按键(event.button)
    累了休息一会儿吧——分享一个JavaScript版扫雷游戏
    用CSS让未知高度内容垂直方向居中
    空间换时间,把递归的时间复杂度降低到O(2n)
  • 原文地址:https://www.cnblogs.com/tancp/p/4039938.html
Copyright © 2011-2022 走看看