CXF3.0.2+Spring3.2.14 WebService入门实例五(上)

各位阿猿们,在学习之前我们先大声地唱一首歌吧,《桃花庵--程序员版》,预备,走:写字楼里写字间,写字间中程序员;程序人员写程序,又将程序换酒钱;酒醒只在屏前坐,酒醉还来屏下眠;酒醉酒醒日复日,屏前屏后年复年;但愿老死电脑间,不愿鞠躬老板前;奔驰宝马贵者趣,公交自行程序员;别人笑我太疯癫,我笑自己命太贱;但见满街漂亮妹,哪个归得程序员。

这一节比较失败,我打算分成上、下集来写,上半部分直接学习达拉斯母牛的CXF实战之RESTFul服务(七),

博客地址:http://blog.csdn.net/accountwcx/article/details/47183429

由于时间有限,这一部分大体写一下,我把工程上传了,有不明白的地方可以下来看一下,然后自己再百度一下;下半部分另写的一个实例;

 

在学习之前,先学习一下什么是Rest,没说的,找度娘!好家伙,本来就不明白,看完这些介绍更糊涂了!英文的,中文的,怎么晦涩怎么来,不明觉厉!好流弊!好吧,请允许我说三个字,真是中国砖家啊!唉,经常加班熬夜的阿猿(媛)们有三个弊端:第一,记忆力越来越差;第二,数数经常会数错;第四,记忆力越来越差。

 

请原谅我这个最低层的阿猿吧,找一个最容易理解的,

REST即表述性状态传递(英文:Representational State Transfer,简称REST),是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful 。

REST本质上是使用URL来操作资源的一种方式。任何事物都是资源,每个资源都有唯一的资源标识,通过URL来操作资源,而不会改变资源标识符,所有的操作都是无状态的!对资源的操作无非是增、删、改、查四种操作,其实只要是软件开发都是这四种操作!

 

优点:降低开发的复杂度

       提高系统的伸缩性

      剩下的自己补充

 

缺点:安全性没有保证

 

首先还是要介绍一下开发工具和开发环境,jdk1.6.0_43+Tomcat6.0.29+MyEclipse10.5,没有使用Maven进行管理!

 

一、新建web工程,选择Java EE5.0

 

 

二、新建文件传输类Book.java

package com.pojo;

 

import javax.xml.bind.annotation.XmlRootElement;

/**

 * 类名: Book.java

 * 作者: 张述飞

 * 创建时间: 2016-1-13下午19:35:44

 * 版本: V1.0

 * 功能描述: 书籍实体类

 */

@XmlRootElement(name ="Book")

publicclass Book {

    //id

    private Stringid;

    //书名

    private StringbookName;

    //作者

    private Stringauthor;

    //价格

    private Doubleprice;

    public String getId() {

       returnid;

    }

    publicvoid setId(String id) {

       this.id = id;

    }

    public String getBookName() {

       returnbookName;

    }

    publicvoid setBookName(String bookName) {

       this.bookName = bookName;

    }

    public String getAuthor() {

       returnauthor;

    }

    publicvoid setAuthor(String author) {

       this.author = author;

    }

    public Double getPrice() {

       returnprice;

    }

    publicvoid setPrice(Double price) {

       this.price = price;

    }

   

    @Override

    public String toString() {

       return"Book[author=" +author +", id=" +id +",bookName=" +bookName +"]";

    }

 

 

}

 

三、新建类LibrarySerive.java

package com.util;

 

importjava.util.HashMap;

importjava.util.Map;

 

importjavax.ws.rs.DELETE;

importjavax.ws.rs.GET;

importjavax.ws.rs.POST;

importjavax.ws.rs.PUT;

importjavax.ws.rs.Path;

import javax.ws.rs.PathParam;

importjavax.ws.rs.Produces;

importjavax.ws.rs.core.MediaType;

importjavax.ws.rs.core.Response;

 

importcom.pojo.Book;

 

/**

 *

 * 类名:LibrarySerive.java

 * 作者: 张述飞

 * 创建时间: 2016-1-14下午4:52:41

 * 版本: V1.0

 * 功能描述:图书馆服务

 */

@Path("/library")

@Produces("application/xml")

public classLibrarySerive {

       private Map<String, Book> books =new HashMap<String, Book>();

       public LibrarySerive() {

              init();

       }

       /**

        * 获取

        *@param <Books>

        *@param id 索引

        *@return 书

        */

       @GET

       @Path("/books/")

       public Map<String, Book> getBooks(){

              System.out.println("得到所有书籍方法开始!!");

              return books;

       }

      

       /**

        * 获取

        *@param id 索引

        *@return 书

        */

       @GET

       @Path("/books/{id}/")

       public BookgetBook(@PathParam("id") String id) {

              System.out.println("查询方法开始!!");

              return books.get(id);

       }

       /**

        * 更新

        *@param book

        *@return

        */

       @PUT

       @Path("/books/")

       public Response updateBook(Book book) {

              System.out.println("更新方法开始!!");

              Response r;

              if (book == null) {

                     r =Response.noContent().build();

                     return r;

              }

              String id = book.getId();

              Book b = books.get(id);

              if (b != null) {

                     books.put(id, book);

                     r =Response.ok(true,MediaType.TEXT_PLAIN).build();

              } else {

                     r =Response.notModified().build();

              }

              return r;

       }

      

       /**

        * 添加

        *@param book

        *@return

        */

       @POST

       @Path("/books/")

       public Response addBook(Book book) {

              System.out.println("添加方法开始!!");

              Response r;

              if (book == null) {

                     r =Response.noContent().build();

                     return r;

              } else {

                     books.put(book.getId(),book);

                     r = Response.ok(true,MediaType.TEXT_PLAIN).build();                    

              }

              return r;

       }

      

       /**

        * 删除

        *@param book

        *@return

        */

       @DELETE

       @Path("/books/{id}/")

       public ResponsedeleteBook(@PathParam("id") String id) {

              System.out.println("删除方法开始!!");

              Response r;

              Book book = books.get(id);

              if (book == null) {

                     r =Response.notModified("id 不存在!").build();

              } else {

                     books.remove(id);

                     r =Response.ok(book,MediaType.APPLICATION_XML).build();

              }

              return r;

       }

      

       /**

        * 初始化,在图书馆里添加图书

        */

       public void init() {

              Book book = null;

             

              book = new Book();

              book.setAuthor("CSDN");

              book.setId("blog");

              book.setBookName("如何使用博客");

              book.setPrice(3.0);

              books.put(book.getId(), book);

             

              book = new Book();

              book.setAuthor("MCXF");

              book.setId("cxf");

              book.setBookName("CXFWebService开发");

              book.setPrice(26.0);

              books.put(book.getId(), book);

             

              book = new Book();

              book.setAuthor("张述飞");

              book.setId("web");

              book.setBookName("Web开发实战");

              book.setPrice(12.0);

              books.put(book.getId(), book);

       }

}

 

四、新建接口实现类Server.java

package com.util;

 

importorg.apache.cxf.jaxrs.JAXRSServerFactoryBean;

importorg.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;

 

/**

 * 发布服务

 * 类名:Server.java

 * 作者: 张述飞

 * 创建时间: 2016-1-21下午1:56:57

 * 版本: V1.0

 * 功能描述:

 */

 

public classServer {

      

 

       public static void main(String[] args)throws Exception {

              JAXRSServerFactoryBean sf = newJAXRSServerFactoryBean();

             

              sf.setResourceClasses(LibrarySerive.class);

              sf.setResourceProvider(LibrarySerive.class,new SingletonResourceProvider(new LibrarySerive()));

              sf.setAddress("http://localhost:8080/WbRest/");

              sf.create();

       }

}

五、新建客户端Client

package com.test;

 

importjava.io.InputStream;

importjava.net.HttpURLConnection;

importjava.net.URL;

importjava.net.URLConnection;

importjava.util.HashMap;

importjava.util.Map.Entry;

importjava.util.Set;

 

importcom.pojo.Book;

import com.util.LibrarySerive;

 

/**

 * 感觉这个类调用的好像不是webservice,^_^

 * 类名:Client.java

 * 作者: 张述飞

 * 创建时间: 2016-1-21下午1:51:52

 * 版本: V1.0

 * 功能描述:

 */

 

public classClient {

 

       public static void main(String[] args)throws Exception {                           

        URLConnection conn = newURL("http://localhost:8080/WbRest/library/books/blog/").openConnection();

        HttpURLConnection con =(HttpURLConnection) conn;

        con.setRequestMethod("GET");

        int code = con.getResponseCode();

        System.out.println(code);

        InputStream is = con.getInputStream();

        int len = 0;

        byte[] b = new byte[1024];

        StringBuffer sb = new StringBuffer();

        while((len = is.read(b)) != -1){

            String s = newString(b,0,len,"UTF-8");

            sb.append(s);

        }

        System.out.println(sb.toString());

        con.disconnect();

             

             

             

             

              LibrarySerive library = newLibrarySerive();

              /**

              Book book =library.getBook("blog");

              System.out.println("book::"+book.getBookName());

              */

             

              Book book = new Book();

              book.setId("test");

              book.setAuthor("蒋百里");

              book.setBookName("国防论");

              book.setPrice(16.00);

             

              library.addBook(book);

             

             

              HashMap<String, Book> hmap =(HashMap<String, Book>) library.getBooks();

              Set<Entry<String,Book>> set = hmap.entrySet();

              for (Entry<String, Book>book1 : set) {

                     System.out.println(book1.getValue());

                     Book b1 = book1.getValue();

                     System.out.println(b1.getBookName());

              }

              /**

              Book book1 =library.getBook("test");

              System.out.println("book1::"+book1.getBookName());*/

             

       }

}

 

=====================================================================

这里注意先要运行Server.java, 再运行Client.java,在客户端会显示:

200

<?xmlversion="1.0" encoding="UTF-8"standalone="yes"?><Book><author>CSDN</author><bookName>如何使用博客</bookName><id>blog</id><price>3.0</price></Book>

添加方法开始!!

得到所有书籍方法开始!!

Book [author=MCXF, id=cxf,bookName=CXF WebService开发]

CXF WebService开发

Book [author=蒋百里, id=test,bookName=国防论]

国防论

Book [author=张述飞, id=web,bookName=Web开发实战]

Web开发实战

Book [author=CSDN, id=blog,bookName=如何使用博客]

如何使用博客

在服务器端会显示

查询方法开始!!

 

六、这里写一个异常

警告:

java.lang.NoClassDefFoundError:javax/servlet/AsyncContext

    atorg.eclipse.jetty.server.AbstractHttpConnection.<init>(AbstractHttpConnection.java:162)

    ...... ... ... ...

    ...12 more

2016-1-21 14:20:07org.eclipse.jetty.io.nio.SelectorManager$SelectSet doSelect

这个异常需要导入javax.servlet-3.0.jar,这个是在servlet3.0以后才有的方法

 

七、使用Spring, applicationContext.xml

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:tx="http://www.springframework.org/schema/tx"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"

    xmlns:jaxrs="http://cxf.apache.org/jaxrs"

    xsi:schemaLocation="

    http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsd

    http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsd

    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd

    http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsd

    http://cxf.apache.org/transports/http/configurationhttp://cxf.apache.org/schemas/configuration/http-conf.xsd   

    http://cxf.apache.org/jaxrshttp://cxf.apache.org/schemas/jaxrs.xsd">

   

    <importresource="classpath:META-INF/cxf/cxf.xml"/>

    <importresource="classpath:META-INF/cxf/cxf-servlet.xml"/>

 

    <beanid="libraryServiceBean"class="com.util.LibrarySerive"></bean>

    <jaxrs:serverid="libraryServer"address="/">

       <jaxrs:serviceBeans>

           <ref bean="libraryServiceBean"/>

       </jaxrs:serviceBeans>

    </jaxrs:server>  

</beans>

 

八、web.xml

<?xmlversion="1.0"encoding="UTF-8"?>

<web-appversion="2.5"

    xmlns="http://java.sun.com/xml/ns/javaee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <display-name></display-name>

  <context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>

          classpath:applicationContext.xml

      </param-value>

  </context-param>

  <listener>

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

  </listener>

  <!--Spring刷新Introspector防止内在泄露-->

  <listener>

    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>

  </listener>

  <servlet>

    <servlet-name>CXFService</servlet-name>

    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

  </servlet>

  <servlet-mapping>

    <servlet-name>CXFService</servlet-name>

    <url-pattern>/*</url-pattern>

  </servlet-mapping>

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

</web-app>

 

九、需导入的jar包

aopalliance-1.0.jar

asm-3.3.1.jar

commons-logging-1.1.3.jar

cxf-core-3.0.7.jar

cxf-manifest.jar

cxf-rt-bindings-soap-3.0.7.jar

cxf-rt-databinding-jaxb-3.0.7.jar

cxf-rt-frontend-jaxrs-3.0.7.jar

cxf-rt-frontend-jaxws-3.0.7.jar

cxf-rt-frontend-simple-3.0.7.jar

cxf-rt-transports-http-3.0.7.jar

cxf-rt-transports-http-jetty-3.0.7.jar

cxf-rt-ws-addr-3.0.7.jar

cxf-rt-ws-policy-3.0.7.jar

cxf-rt-wsdl-3.0.7.jar

geronimo-javamail_1.4_spec-1.7.1.jar

geronimo-jaxws_2.2_spec-1.2.jar

javax.servlet-3.0.jar

javax.ws.rs-api-2.0.1.jar

jaxb-api-2.2.11.jar

jaxb-core-2.2.11.jar

jaxb-impl-2.2.11.jar

jetty-continuation-8.1.15.v20140411.jar

jetty-http-8.1.15.v20140411.jar

jetty-io-8.1.15.v20140411.jar

jetty-security-8.1.15.v20140411.jar

jetty-server-8.1.15.v20140411.jar

jetty-util-8.1.15.v20140411.jar

neethi-3.0.3.jar

slf4j-api-1.7.9.jar

slf4j-jdk14-1.7.9.jar

spring-aop-3.2.14.RELEASE.jar

spring-beans-3.2.14.RELEASE.jar

spring-context-3.2.14.RELEASE.jar

spring-core-3.2.14.RELEASE.jar

spring-expression-3.2.14.RELEASE.jar

spring-web-3.2.14.RELEASE.jar

stax2-api-3.1.4.jar

woodstox-core-asl-4.4.1.jar

wsdl4j-1.6.3.jar

xmlschema-core-2.2.1.jar

 

十、新建ClientWithSpring测试类

package com.test;

 

import org.springframework.context.ApplicationContext;

importorg.springframework.context.support.ClassPathXmlApplicationContext;

 

import com.util.LibrarySerive;

 

publicclass ClientWithSpring {

 

    publicstaticvoid main(String[] args) {

       System.out.println("aaaaa");

       ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

 

       LibrarySerive ls = context.getBean("libraryServiceBean",LibrarySerive.class);

       System.out.println(ls.getBook("web").getBookName());

      

    }

}

启动Tomcat服务器,再运行ClientWithSpring,在客户端会显示: aaaaa

……………

 2016-1-21 14:30:28org.apache.cxf.endpoint.ServerImpl initDestination

信息: Setting the server's publish address to be /

查询方法开始!!

Web开发实战

 

在IE浏览器中输入http://localhost:8080/WbRest/library/books/web/

会显示

  <?xml version="1.0" encoding="UTF-8"standalone="yes" ?>

- <Book>

  <author>张述飞</author>

  <bookName>Web开发实战</bookName>

  <id>web</id>

  <price>12.0</price>

  </Book>

 

十一、    运行完这个以后,手贱又随手运行了一个以前做一个s2sm的实例,这是意外出现了,好好的项目竟然不能运行了,在IE浏览器中显示

HTTP ERROR 404

Problem accessioin/tksm. Reason

Not Found

 

Power by Jetty ://

 

What?

于是,找度娘,天啊,基本上全是英文的,又是设置这,又是改那,不行!我没用Jetty服务器啊。差点把MyEclipse 10, Tomcat卸了重新安装一遍,最后想是不是虚拟目录下的某个工程引起的啊,把tomcat文件夹下的work文件夹清理了一下,奇迹居然行了!

 

 

 

 

 

 

 

代码下载地址:http://download.csdn.net/detail/zhangshufei8001/9413177

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值