1.下载CXF(我下载的是2.4.6)
http://cxf.apache.org/download.html
?
2.新建一个web项目,项目结构如附件所示。
为了方便,我们将下载的CXF包lib文件夹下的jar包全部导入到工程中。
(实际用到的jar包可看附件图)
?
3.服务端
?
?? a.建一个服务接口???? IHelloWorld.java
package com.royal.service; import java.util.List; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface IHelloWorld { public String sayHi(@WebParam(name = "text") String text); public int getNumber(); public String getNameAndAge(@WebParam(name = "nameid") String nameid, @WebParam(name = "number") int number); public List getList(); }
?? 其实我测试过了,不用@WebParam("")声明也行。
?
?? b.服务接口的实现类?????? HelloWorldImpl.java
?
package com.royal.serviceImpl; import java.util.ArrayList; import java.util.List; import javax.jws.WebService; import com.royal.service.IHelloWorld; /** * 接口实现 * * @author Royal 注意:@webservice自动注入一定要写 * */ @WebService(endpointInterface = "com.royal.service.IHelloWorld", serviceName = "HelloWorldService") public class HelloWorldImpl implements IHelloWorld { public String sayHi(String text) { return text + "Hi"; } public int getNumber() { return 100; } public String getName(String nameid) { return nameid; } public List getList() { List list = new ArrayList<String>(); list.add("萧瑟"); ?list.add(10); return null; } }
?
?? c.服务接口集合spring的配置????? beanRefServer.xml
?
<?xml version="1.0" encoding="UTF-8"?> <!-- START SNIPPET: beans --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- Import Apache CXF Bean Definition --> <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" /> <!-- implementor :接口类的实现类 address: 要和注释里面神秘的服务名对应, --> <jaxws:endpoint id="helloWorld" implementor="com.royal.serviceImpl.HelloWorldImpl" address="/HelloWorldService" /> </beans>
?
?? d.web.xml的配置????? web.xml
?
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- Spring Config Location --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/beanRefServer.xml</param-value> </context-param> <!-- Spring ContextLoaderListener --> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!-- Apache CXFServlet --> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class> org.apache.cxf.transport.servlet.CXFServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- CXFServlet Mapping --> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>?
? OK,这样服务端的配置就完成了,启动tomcat。
?
4.在浏览器中输入:http://localhost:服务器端口/项目名/services
???? 如果看见 :WSDL : {http://serviceImpl.royal.com/}HelloWorldService? , 则代表成功。
??? 点击WSDL链接,可看见WSDL文件内容。
?
?
=========================================================
小结:
? 其配置流程步骤可认为
?
------sevlet:? 拦截??? 注意name及mapping
<servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class> org.apache.cxf.transport.servlet.CXFServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- CXFServlet Mapping --> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>
?
------新增自定义xml文件:
?????? 作用:声明地址访问信息,根据指定的地址找到实现类
<!-- implementor :接口类的实现类 address: 要和注释里面神秘的服务名对应, --> <jaxws:endpoint id="xxxxxxx" implementor="xxxxxxxxx.xxxImpl" address="/xxxxxx" />
?????? (之后将该文件配置进web.xml,这样服务启动的时候就被加入了)
?-------实现类:
??????? 作用:匹配自定义xml文件中的地址名
???????????????? 可切入一个接口,暴露提供给用户
@WebService(endpointInterface = "xxxxx", serviceName = "xxxxxx") public class xxxxxImpl implements xxxxxx { }
?
这部分当做个人小结,可无视。
==================================================================
?
?
5.客户端
? 写一个客户端测试类???? CXFClient.java
?
package com.royal.client; import java.util.List; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import com.royal.service.IHelloWorld; public class CXFClient { public CXFClient(){ } public static void main(String args[]) throws Exception { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.getInInterceptors().add(new LoggingInInterceptor()); factory.getOutInterceptors().add(new LoggingOutInterceptor()); factory.setServiceClass(IHelloWorld.class); factory.setAddress("http://localhost:8090/cxf_webservice/services/HelloWorldService"); IHelloWorld client = (IHelloWorld) factory.create(); String hi = client.sayHi("萧_瑟"); int number = client.getNumber(); String NameAge = client.getNameAndAge("萧_瑟",18); List list = client.getList(); System.out.println("hi----" + hi); System.out.println("number----" + number); System.out.println("NameAge----" + NameAge); System.out.print("list----"); for(int i = 0; i < list.size(); i++){ System.out.print(list.get(i) + ","); } } }
?
6.? 打印结果:
hi----萧_瑟 Hi
number----100
NameAge----萧_瑟18
list----10,萧_瑟,
?
参考:http://rargers.iteye.com/blog/196121
?
android端代码
package com.royal.cxf_webservice; import java.util.List; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class Cxf_webservice_androidActivity extends Activity { private static String NAMESPACE = "http://service.royal.com/"; // webService地址 private static String URL = "http://10.0.2.2:8090/cxf_webservice/services/HelloWorldService"; // private static String URL = // "http://192.168.17.76:8090/cxf_webservice/services/HelloWorldService"; private String method_name = null; private Button okButton; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); okButton = (Button) findViewById(R.id.ok); okButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { showTest(); } }); } private void showTest() { method_name = "sayHi"; String text = "萧_瑟"; sayHi(method_name, text); method_name = "getNumber"; getNumber(method_name); method_name = "getNameAndAge"; String name = "萧_瑟"; int age = 18; getNameAndAge(method_name,name,age); method_name = "getList"; getList(method_name); } private void sayHi(String method_name, String text) { // (1) 指定webservice的命名空间和调用的方法名 SoapObject rpc = new SoapObject(NAMESPACE, method_name); /** * (2) 设置调用方法的参数值,如果没有参数,可以省略。 要注意的是,参数必须和服务声明的@WebParam里面的变量名对应 */ rpc.addProperty("text", text); // (3) 生成调用Webservice方法的SOAP请求信息。该信息由SoapSerializationEnvelope对象描述 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); // envelope.bodyOut = rpc; envelope.dotNet = false; envelope.setOutputSoapObject(rpc); // (4)创建HttpTransportsSE对象。通过AndroidHttpTransport类的构造方法可以指定WebService的WSDL文档的URL HttpTransportSE ht = new HttpTransportSE(URL); try { // (5)使用call方法调用WebService方法 ht.call(NAMESPACE + method_name, envelope); // (6)使用getResponse方法获得WebService方法的返回结果 if (envelope.getResponse() != null) { System.out.println(envelope.getResponse()); String result = String.valueOf(envelope.getResponse()); Toast.makeText(Cxf_webservice_androidActivity.this, result, Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); } } private void getNumber(String method_name) { SoapObject rpc = new SoapObject(NAMESPACE, method_name); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); envelope.dotNet = false; envelope.setOutputSoapObject(rpc); HttpTransportSE ht = new HttpTransportSE(URL); try { ht.call(NAMESPACE + method_name, envelope); if (envelope.getResponse() != null) { System.out.println(envelope.getResponse()); Integer result = Integer.valueOf(String.valueOf(envelope.getResponse())); Toast.makeText(Cxf_webservice_androidActivity.this, result.toString(), Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); } } private void getNameAndAge(String method_name,String name,int age) { SoapObject rpc = new SoapObject(NAMESPACE, method_name); rpc.addProperty("name",name); rpc.addProperty("age", age); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); envelope.dotNet = false; envelope.setOutputSoapObject(rpc); HttpTransportSE ht = new HttpTransportSE(URL); try { ht.call(NAMESPACE + method_name, envelope); if (envelope.getResponse() != null) { System.out.println(envelope.getResponse()); String result = String.valueOf(envelope.getResponse()); Toast.makeText(Cxf_webservice_androidActivity.this, result, Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); } } private void getList(String method_name) { SoapObject rpc = new SoapObject(NAMESPACE, method_name); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); envelope.dotNet = false; envelope.setOutputSoapObject(rpc); HttpTransportSE ht = new HttpTransportSE(URL); try { ht.call(NAMESPACE + method_name, envelope); if (envelope.getResponse() != null) { System.out.println(envelope.getResponse()); List result = (List)envelope.getResponse(); for(int i = 0; i < result.size(); i++){ System.out.println(result.get(i).toString()); Toast.makeText(Cxf_webservice_androidActivity.this, result.get(i).toString(), Toast.LENGTH_SHORT).show(); } } } catch (Exception e) { e.printStackTrace(); } } }
?记得开启网络权限
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.royal.cxf_webservice" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".Cxf_webservice_androidActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.INTERNET"/> </manifest>
?记得导入KSOAP包
?
?