加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 23:32:02 所属栏目:安全 来源:网络整理
导读:1、准备 这是一个最基本的基于CXF的Java项目 如果仅发布JAX-WS应用则需要以下jar文件 : cxf-2.4.2.jar???????????????????????????????? 这是CXF的核心包 xmlschema-core-2.0.jar????????????? 这是解析XMLSchema的apache包 neethi-3.0.1.jar??????????????
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)? ?设置服务对象实现的接口类。
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文件说明书
?* @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();
}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读