轉
一、CXF的介紹
Apache CXF是一個開源的WebService框架,CXF大大簡化了Webservice的創建,同時它繼承了XFire的傳統,一樣可以和spring天然的進行無縫的集成。CXF框架是一種基於servlet技術的SOA應用開發框架,要正常運用基於CXF應用框架開發的企業應用,除了CXF應用本身之外,還需要JDK和servlet容器的支持。
二、CXF的准備條件
所需要的jar包:
xmlbeans-2.4.0.jar
wss4j-1.5.9.jar
jetty-server-7.1.6.v20100715.jar
jetty-util-7.1.6.v20100715.jar
geronimo-ws-metadata_2.0_spec-1.1.3.jar
geronimo-activation_1.1_spec-1.1.jar
geronimo-servlet_3.0_spec-1.0.jar
velocity-1.6.4.jar
jaxb-xjc-2.2.1.1.jar
xml-resolver-1.2.jar
wsdl4j-1.6.2.jar
cxf-2.3.0.jar
XmlSchema-1.4.7.jar
jaxb-api-2.2.1.jar
jaxb-impl-2.2.1.1.jar
neethi-2.0.4.jar
geronimo-annotation_1.0_spec-1.1.1.jar
geronimo-stax-api_1.0_spec-1.0.1.jar
下載地址:http://download.csdn.net/detail/ch656409110/5748183 (取自己需要的jar包)
三、創建webservice服務端
1、先將jar包放入lib目錄
2、在web.xml中配置CXF框架的核心servlet
- <!-- CXF -->
- <servlet>
- <servlet-name>CXFServlet</servlet-name>
- <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>CXFServlet</servlet-name>
- <url-pattern>/services/*</url-pattern>
- </servlet-mapping>
3、在applicationContext.xml中導入xml,並且發布webservice服務。
- <?xml version="1.0" encoding="UTF-8"?>
- <beans
- xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:jaxws="http://cxf.apache.org/jaxws"
- xmlns:jaxrs="http://cxf.apache.org/jaxrs"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- http://cxf.apache.org/jaxws
- http://cxf.apache.org/schemas/jaxws.xsd
- http://cxf.apache.org/jaxrs
- http://cxf.apache.org/schemas/jaxrs.xsd
- "
- default-autowire="byName"
- >
- <import resource="classpath:META-INF/cxf/cxf.xml" />
- <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
- <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
- <!-- <jaxws:endpoint id="facelookWebService" address="/facelookWebService" implementor="com.facelook.webservice.server.FacelookWebServiceImpl"></jaxws:endpoint> -->
- <!-- 不知道為什么,這里的webservice配置,只能用bean來實現,否則 注入的service為空。但是之前有個項目卻可以,百思不得其解。。 -->
- <bean id="facelookWebService" class="com.facelook.webservice.server.FacelookWebServiceImpl"/>
- <jaxws:endpoint id="facelookWebService1" address="/facelookWebService" implementorClass="com.facelook.webservice.server.FacelookWebServiceImpl">
- <jaxws:implementor ref="facelookWebService"/>
- </jaxws:endpoint>
- </beans>
4、定義webservice接口FacelookWebService 和 實現類FacelookWebServiceImpl。
- @WebService
- public interface FacelookWebService {
- /**
- * 根據傳遞的條件獲取相冊信息
- * xml的格式規范
- * <?xml version=\"1.0\" encoding=\"UTF-8\"?>
- * <facelook>
- * <condition>
- * <name></name>
- * <description></description>
- * <pageno></pageno>
- * <pagesize></pagesize>
- * </condition>
- * </facelook>
- * 這里的WebParam必須指定,否則調用的時候返回null
- * @return
- */
- public String getAlbumList(@WebParam(name="xmlStr") String xmlStr);
- }
- @WebService
- //這后面的可以不寫注釋后面的配置,在applicationContext配置也一樣(serviceName="facelookWebService",endpointInterface="com.facelook.webservice.server.FacelookWebService")
- public class FacelookWebServiceImpl implements FacelookWebService{
- @Autowired
- private AlbumService albumService;
- @Override
- public String getAlbumList(String xmlStr) {
- try {
- List<Album> albumList = getAlbumPage(xmlStr);
- JSONArray jsonArray = JSONArray.fromObject(albumList);
- return jsonArray.toString();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
這樣子,基本上就可以了。
5、保存代碼,發布項目,啟動tomact。
在地址欄輸入:http://localhost:8080/house/services/houseWebService?wsdl 即可看到發布的服務端的明細。
顯示如下:
這就表示CXF發布的webservice服務端成功了。
6、通過客戶端調用服務端webservice。
axis的客戶端訪問:
- public static void main(String[] args) throws ServiceException, RemoteException, MalformedURLException {
- String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
- + " <facelook>"
- + " <condition>"
- + " <name>家</name>"
- + " <description></description>"
- + " <pageno></pageno>"
- + " <pagesize></pagesize>"
- + " </condition>"
- + " </facelook>";
- Service service = new Service();
- Call call = (Call) service.createCall();
- call.setTargetEndpointAddress("http://localhost:8080/facelook/services/facelookWebService?wsdl");
- QName qName = new QName("http://server.webservice.facelook.com/", "getAlbumList");
- call.setOperationName(qName);
- call.setUseSOAPAction(true);
- //這下面兩行一定要加上,否則接收在服務器端收不到。
- call.addParameter("xmlStr", XMLType.XSD_STRING, ParameterMode.IN);
- call.setReturnType(XMLType.XSD_STRING);
- String result = (String) call.invoke(new Object[] { xmlStr });
- System.out.println(result);
- //將返回的字符串轉換成list集合
- //JSONArray array = JSONArray.fromObject(result);
- //List<Album> list = JSONArray.toList(array,Album.class);
- }
CXF客戶端訪問:
- public static void main(String[] args) throws Exception {
- //這個是用cxf 客戶端訪問cxf部署的webservice服務
- //千萬記住,訪問cxf的webservice必須加上namespace ,否則通不過
- //現在又另外一個問題,傳遞過去的參數服務端接收不到
- JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
- org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:8080/facelook/services/facelookWebService?wsdl");
- //url為調用webService的wsdl地址
- QName name=new QName("http://server.webservice.facelook.com/","getAlbumList");
- //namespace是命名空間,methodName是方法名
- String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
- + " <facelook>"
- + " <condition>"
- + " <name>家</name>"
- + " <description></description>"
- + " <pageno></pageno>"
- + " <pagesize></pagesize>"
- + " </condition>"
- + " </facelook>";
- //paramvalue為參數值
- Object[] objects=client.invoke(name,xmlStr);
- //調用web Service//輸出調用結果
- System.out.println(objects[0].toString());
- }
在這里面傳遞的xml規范由 服務端自己規范好了,然后去解析、獲取參數,執行相應的操作,返回想要的結果給調用的客戶端。。