基于CXF的JAX-WS、JAX-RS(RESTful)的webService

原文链接:[url]http://www.open-open.com/lib/view/open1328150536796.html[/url]

1、准备

这是一个最基本的基于CXF的Java项目
如果仅发布[b][size=large]JAX-WS[/size][/b]应用则需要以下jar文件 :
cxf-2.4.2.jar                                 这是CXF的核心包
xmlschema-core-2.0.jar 这是解析XMLSchema的apache包
neethi-3.0.1.jar apache的WebService策略包
wsdl4j-1.6.2.jar wsdl文件生成包
servlet-api.jar 此包就不用多说了吧。。

jetty-util-7.4.5.v20110725.jar //因为CXF使用内嵌的jetty服务器,以下都是jetty服务器包。
jetty-server-7.4.5.v20110725.jar
jetty-http-7.4.5.v20110725.jar
jetty-io-7.4.5.v20110725.jar
jetty-continuation-7.4.5.v20110725.jar




2、

如果需要使用[size=large][b]JAX-RS[/b][/size]发布[color=red]RESTful[/color]的服务则再添加以下jar文件 :
jsr311-api-1.1.1.jar /这是SUN公司发布的WebService的新标准,此JSR311包中包含了在类上应该添加什么注解如@Post
如果需要返回JSON类型的串则再需要加入
jettison-1.3.jar //
因为cxf是用此类解析JSON串的。

(对于一个jax-rs应用,第一个方法必须返回一个JavaBean,
不能没有返回值,且类上必须使用@XmlRootElement注解)



(待续)



3、
CXF发布服务的类:


[color=red]lJaxWsServerFactoryBean[/color]

•JaxWsServerFactoryBean用于发布一个服务,可以通过默认构造实例此类。

•它的方法如下:

•setServiceBean(Object) – 设置一个服务对象 - *

•setAddress(String url) – 绑定一个地址和端口 - *

•create() - 在JavaSE环境下,使用jetty发布WebService. - *

•以下是可选方法 :

•setServiceClass(Class cls) – 设置服务对象实现的接口类。

[color=red]lJaxRsServerFactoryBean [/color]

•此类用于发布RESTful风格的webService.

•RESTful风格是以普通get,post请求为标准的,并可以请求和响应json数据。



4、使用CXF发布一个服务




package cn.leaf.one; 

import javax.jws.WebService;

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

/**

* 使用CXF发布一个服务

* 必须要添加WebService注解。否则不会对外暴露任何一个方法

* @author 王健

*/

@WebService

public class OneService {

public String sayHi(){ ///此方法将会对外公布

return "Good";

}

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

JaxWsServerFactoryBean bean //使用jaxWs对其进行发布

= new JaxWsServerFactoryBean();

bean.setServiceBean(new OneService());

bean.setServiceClass(OneService.class);

bean.setAddress("http://localhost:4444/one");

bean.create(); //内部使用jetty服务器做为支持

System.err.println("服务启动成功。。");

//Thread.sleep(1000*60*60);

//System.exit(0);

}

}



5、获取上面的wsdl文件:http://localhost:4444/one?wsdl[color=red][/color]

6、使用wsimport或是wsdl2java生成客户端调用代码,略。

7、发布一个RESTful的webService



package cn.itcast.ws3;

import java.util.ArrayList;

import java.util.List;

import javax.ws.rs.FormParam;

import javax.ws.rs.GET;

import javax.ws.rs.POST;

import javax.ws.rs.Path;

import javax.ws.rs.PathParam;

import javax.ws.rs.Produces;

import javax.ws.rs.core.MediaType;


import org.apache.cxf.interceptor.LoggingInInterceptor;

import org.apache.cxf.interceptor.LoggingOutInterceptor;

import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;

import cn.itcast.domain.User;

/**

* 一个基于JAX-RS的服务

* JAX-RS是无状态的服务

* 注意,必须要在JavaBean上添加@XMLRootElemet注解

* 此项目启动成功以后,可以通过以下方式访问:

[color=red] * http://localhost:9004/users?_wadl&_type=xml [/color]

* 注意是_wadl&_type=xml

* 将返回一个如何调用RESTful ws的wsdl文件说明书

* @author 王健

* @version 1.0 2011-11-18

*/

@Path(value="/users/") //声明uri路径

@Produces(value={MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})//声明支持的类型

public class UserServiceRS {

private List<User> users = new ArrayList<User>();

public UserServiceRS(){

User u = new User();

u.setAge(90);

u.setName("大家好");

users.add(u);

}


/**

* 以下代码,请在地址栏这样访问:

* http://localhost:9004/users/all/

* 即会以XML形式显示所有用户信息

* @return

*/

@GET

@Path(value="/all/")

public List<User> getUsers(){

System.err.println("调用了users方法");

return users;

}

/**

* 以下在地址栏输入:

* http://localhost:9004/users/save/Tom/34

* 其中:Tom为要保存的用户名,34为年龄

* 即会保存成功

*/

@GET

@Path(value="/save/{name}/{age}/")

public User save(@PathParam("name")String name,@PathParam("age")String age){

User u = new User();

u.setAge(Integer.parseInt(age));

u.setName(name);

System.err.println("保存成功"+u);

users.add(u);

return u;

}


/**

* 提供第二种保存方式

* 使用@FormParam方式设置接收表单的参数

* 通过HttpClient调用,并设置请求参数

*/

@POST

@Path(value="/add/")

public User add(@FormParam("name")String name,@FormParam("age")String age){

User u = new User();

u.setAge(Integer.parseInt(age));

u.setName(name);

System.err.println("使用POST保存成功"+u);

users.add(u);

return u;

}


public static void main(String[] args) {

JAXRSServerFactoryBean bean = //声明JAXRS服务对象

new JAXRSServerFactoryBean();

bean.setServiceBean(new UserServiceRS());//加载服务类

bean.setAddress("http://localhost:9004/");//声明地址,注意只声明地址和端口即可

bean.getInInterceptors().add(new LoggingInInterceptor());

bean.getOutInterceptors().add(new LoggingOutInterceptor());

bean.create();//启动

System.err.println("JAX-RS启动成功....");

}

}


8、使用[color=red]HttpClient[/color]调用RESTful的web服务:



package cn.itcast.ws3;


import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient.methods.GetMethod;

import org.apache.commons.httpclient.methods.PostMethod;


/**

* 使用URLConnection调用RESTful的服务

* 此外建议使用httpClient读取,将会更快

* 使用urlConnection可能没有返回结果

* @author 王健

* @version 1.0 2011-11-18

*/

public class UserRsClient {

UserRsClient() throws Exception{

save2();

all();

}

/**

* 查询所有信息

* @throws Exception

*/

private void all() throws Exception{

GetMethod get = new GetMethod("http://localhost:9004/users/all");

get.setRequestHeader("accept","application/json");

HttpClient hc = new HttpClient();

hc.getParams().setContentCharset("UTF-8"); //设置编码

int code = hc.executeMethod(get);

System.err.println("返回的状态码:"+code);

if(code==200){

String str = get.getResponseBodyAsString();

System.err.println("返回信息:\n"+str);

}

get.releaseConnection();

}



/**

* 保存一条信息,仍然使用GET方式

*/

private void save() throws Exception{

String name = "Jack";//因为是get类型,所以不能包含中文

String age = "35";

String url = "http://localhost:9004/users/save/"+name+"/"+age;

GetMethod get = new GetMethod(url);

get.setRequestHeader("accept","application/json");

HttpClient hc = new HttpClient();

hc.getParams().setContentCharset("UTF-8"); //设置编码

//.setRequestHeader("Content","text/html;charset=UTF-8");

int code = hc.executeMethod(get);

System.err.println("返回的状态码是:"+code);

if(code==200){

String str = get.getResponseBodyAsString();

System.err.println("返回的信息是:\n"+str);

}

get.releaseConnection();

}



/**

* 以下使用POST方式

*/

private void save2() throws Exception{

String name = "王健";//因为是get类型,所以不能包含中文

String age = "35";

String url = "http://localhost:9004/users/add/";

PostMethod pm = new PostMethod(url);

pm.setRequestHeader("accept","application/json");

pm.setRequestHeader("Encoding","UTF-8");

pm.setParameter("name",name);

pm.setParameter("age",age);

HttpClient hc = new HttpClient();

hc.getParams().setContentCharset("UTF-8");//设置编码,否则会返回中文乱码//TODO:切记

int code = hc.executeMethod(pm);

System.err.println("Post方式的返回值是:"+code);

if(code==200){

String ss = pm.getResponseBodyAsString();

System.err.println(">>:"+ss);

}

pm.releaseConnection();


}


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

new UserRsClient();

}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值