基于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) ?设置服务对象实现的接口类
。
lJaxRsServerFactoryBean
?此类用于发布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 = new JaxWsServerFactoryBean(); //使用 jaxWs对其进行发布
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.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); } 代码2部分 /** * 以下代码,请在地址栏这样访问: * 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; } 代码3部分 /** * 提供第二种保存方式 * 使用@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; }
JAXRSServerFactoryBean bean =new JAXRSServerFactoryBean(); //声明JAXRS服务对象 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启动成功...."); } } 代码4部分 /** * 提供第二种保存方式 * 使用@FormParam方式设置接收表单的参数 * 通过HttpClient调用,并设置请求参数 */ @POST @Path(value="/add/") public User add(@FormParam("name")String name,@FormParam("age")Stringage){ User u = new User(); u.setAge(Integer.parseInt(age)); u.setName(name); System.err.println("使用POST保存成功"+u); users.add(u); return u; }
JAXRSServerFactoryBean bean = new JAXRSServerFactoryBean(); //声明JAXRS服务对象 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.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(); } 代码5部分 /** * 保存一条信息,仍然使用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(); } 代码6部分 /** * 以下使用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();
new UserRsClient(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |