设为首页 收藏本站
查看: 818|回复: 0

[经验分享] 基于CXF的JAX-WS、JAX-RS(RESTful)的webService

[复制链接]
发表于 2017-2-28 08:01:03 | 显示全部楼层 |阅读模式
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 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();  
}  
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-348127-1-1.html 上篇帖子: hadoop1.0 的webhdfs 下篇帖子: Hadoop
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表