基于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發布服務的類:
lJaxWsServerFactoryBean
?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 //使用 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();
}
}
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!