微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

1、准备

这是一个最基本的基于CXF的Java项目
如果仅发布JAX-WS应用则需要以下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、

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

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

 (待续)

3、

CXF发布服务的类:

l      JaxWsServerfactorybean

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

•        它的方法如下:

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

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

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

•        以下是可选方法

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

l      JaxRSServerfactorybean

•        此类用于发布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

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注解

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

 * http://localhost:9004/users?_wadl&_type=xml

 * 注意是_wadl&_type=xml

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

 * @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为年龄

          * 即会保存成功

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

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

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

                   u.setName(name);

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

                   return u;

          * 提供第二种保存方式

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

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

         @POST

         @Path(value="/add/")

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

                   System.err.println("使用POST保存成功"+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、使用HttpClient调用RESTful的web服务:

import org.apache.commons.httpclient.HttpClient;

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

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

 * 使用URLConnection调用RESTful的服务

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

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

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);

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

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

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

          * 以下使用POST方式

         private void save2() throws Exception{

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

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

                   PostMethod pm = new PostMethod(url);

                  pm.setRequestHeader("accept",51); font-family:Arial; font-size:14px; line-height:26px">                    pm.setRequestHeader("Encoding","UTF-8");

                   pm.setParameter("name",name);

                   pm.setParameter("age",age);

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

                   int code = hc.executeMethod(pm);

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

                            String ss =  pm.getResponseBodyAsstring();

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

                   pm.releaseConnection();

                  

                   new UserRsClient();

9、使用Spring的配置文件,发布到Tomcat服务器上:

(待续)

10、使用ajax访问:

(待续)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐