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来操作资源,而不会改变资源标识符,所有的操作都是无状态的!对资源的操作无非是增、删、改、查四种操作,其实只要是软件开发都是这四种操作!

扫描二维码关注公众号,回复: 697629 查看本文章

优点:降低开发的复杂度

提高系统的伸缩性

剩下的自己补充

缺点:安全性没有保证

首先还是要介绍一下开发工具和开发环境,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

猜你喜欢

转载自zhangshufei8001.iteye.com/blog/2377301
今日推荐