公司要采用WebService作为数据提供平台,经过研究决定使用CXF框架来实现,
网上有多种都是提供了Server和Client两端的代码和配置文件xml, 我学习了几篇之后感觉很是复杂,
其实Client端是用来验证Server正确性的,所以没有必要非用java去实现.由于我们的客户端应用有php部分,
所以我决定对于验证这部分由php去完成, 以下是我的实践步骤仅供参考:
1. 去官方网站下载cxf, apache-cxf-2.2.1.zip
2. 在eclipse中新建web工程, 并导入apache-cxf-2.2.1\lib下所有jar文件
3. 改写web.xml文件
- "1.0" encoding="UTF-8"?>
- "WebApp_ID" version="2.4"
- xmlns="" xmlns:xsi=""
- xsi:schemaLocation=" /web-app_2_4.xsd">
- scm
-
- contextConfigLocation
- classpath:ws-server-beans.xml
-
-
-
- class>org.springframework.web.context.ContextLoaderListenerclass>
-
-
-
- CXFServlet
- class>org.apache.cxf.transport.servlet.CXFServletclass>
-
-
- CXFServlet
- /services/*
-
-
-
scm
contextConfigLocation
classpath:ws-server-beans.xml
org.springframework.web.context.ContextLoaderListener
CXFServlet
org.apache.cxf.transport.servlet.CXFServlet
CXFServlet
/services/*
4. 在src文件夹下建立文件ws-server-beans.xml(当然文件名随便取,只要与web.xml中引入的一致即可.
5. 编辑文件ws-server-beans.xml内容为:
- "1.0" encoding="UTF-8"?>
- ""
- xmlns:xsi="" xmlns:jaxws=""
- xmlns:cxf=""
- xsi:schemaLocation=" /spring-beans-2.5.xsd"
- default-autowire="byType" default-lazy-init="true">
-
- <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" />
-
- "helloWorld"
- implementor="com.genscript.scm.ws.impl.HelloWorldImpl" address="/HelloWorld">
-
-
-
6.新建java package: com.genscript.scm.ws, 和java 类HelloWorld.java内容如下:
- package com.genscript.scm.ws;
-
- import javax.jws.WebService;
-
-
-
-
-
-
-
- @WebService
- public interface HelloWorld {
- String sayHi(String text);
- }
package com.genscript.scm.ws;
import javax.jws.WebService;
/**
* service interface
*
* @author
*
*/
@WebService
public interface HelloWorld {
String sayHi(String text);
}
7.新建包com.genscript.scm.ws.impl和类HelloWorldImpl.java内容为
- package com.genscript.scm.ws.impl;
- import javax.jws.WebService;
- import com.genscript.scm.ws.HelloWorld;
- @WebService
- public class HelloWorldImpl implements HelloWorld {
-
- @Override
- public String sayHi(String text) {
-
- System.out.println("java print: " + text);
- return "Hi: " + text;
- }
-
- }
package com.genscript.scm.ws.impl;
import javax.jws.WebService;
import com.genscript.scm.ws.HelloWorld;
@WebService
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHi(String text) {
// TODO Auto-generated method stub
System.out.println("java print: " + text);
return "Hi: " + text;
}
}
8. 启动tomcat, 依次访问:
,/HelloWorld?wsdl都是可以访问的,说明java服务器端已经正确完成.
9. 布置一个可以运行的php环境(此处省略详细步骤), 新建一个test.php内容如下:
- ini_set("soap.wsdl_cache_enabled", "0");
- $path_to_wsdl = "";
- $client = new SoapClient($path_to_wsdl, array('encoding'=>'UTF-8'));
- try
- {
- $str = "fedex php @ ' = & end";
- $param = array('arg0' => $str);
- $ret = $client->sayHi($param);
- print_r($ret);
- } catch (SoapFault $exception) {
- printFault($exception, $client);
- }
- ?>
'UTF-8'));
try
{
$str = "fedex php @ ' = & end";
$param = array('arg0' => $str);
$ret = $client->sayHi($param);
print_r($ret);
} catch (SoapFault $exception) {
printFault($exception, $client);
}
?>
访问即可, 看到可以正确响应, 注意:由于CXF底层使用反射等原因, 在调用时一定要给形参以arg0, arg1等形式命名和传值, 否则服务器端接收不到值(本人找了很长时间才发现的)
10. 至此php客户端 + java web service(JWS)服务端已经成功整合运行.