基于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 此包就不用多说了吧。。
如果仅发布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
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串的。
jsr311-api-1.1.1.jar /这是SUN公司发布的WebService的新标准,此JSR311包中包含了在类上应该添加什么注解如@Post
如果需要返回JSON类型的串则再需要加入
jettison-1.3.jar //
因为cxf是用此类解析JSON串的。
 
    (对于一个jax-rs应用,第一个方法必须返回一个JavaBean,
不能没有返回值,且类上必须使用@XmlRootElement注解)
不能没有返回值,且类上必须使用@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 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、使用HttpClient调用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();  
       
 
        }  
       
 
        } 
       
 
      posted on 2013-03-08 14:13 阳光总在风雨后001 阅读(8736) 评论(0) 收藏 举报
 
                     
                    
                 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号 
