第一步:在myeclipse中新建一个web项目名为webservicetest,并导入依赖的jar包(cxf,spring,apache-commons相关)
commons-logging-1.0.4.jar
cxf-2.6.2.jar
geronimo-jaxws_2.2_spec-1.0.jar
geronimo-ws-metadata_2.0_spec-1.1.3.jar
neethi-3.0.2.jar
cxf结合spring时所需jar包,此例子也需要这些,用到了spring上下文加载:
spring-asm-3.0.7.RELEASE.jar
spring-beans-3.0.7.RELEASE.jar
spring-context-3.0.7.RELEASE.jar
spring-core-3.0.7.RELEASE.jar
spring-expression-3.0.7.RELEASE.jar
spring-aop-3.0.7.RELEASE.jar
spring-web-3.0.7.RELEASE.jar
xmlschema-core-2.0.3.jar
jaxb-api-2.2.6.jar
wsdl4j-1.6.1.jar
jsr173_api-1.0.jar
common-annotations.jar
jaxb-impl-2.0.1.jar
stax-api-1.0.0.jar
wstx-asl-3.2.0.jar
jetty-util-7.5.4.v20111024.jar
jetty-continuation-7.5.4.v20111024.jar
jetty-http-7.5.4.v20111024.jar
jetty-io-7.5.4.v20111024.jar
jetty-security-7.5.4.v20111024.jar
jetty-server-7.5.4.v20111024.jar
@WebService和@WebMethod是WSDL映射Annotation.这些Annotation将描述Web Service的WSDL文档元素和JAVA源代码联系在一起。
@WebService annotation的元素name,serviceName和targetNamespace成员用来描述wsdl:protType,wsdl:service,和targetNameSpace生成WebService中的WSDL文件。
@SOAPBinding是一个绑定的annotation,用来说明网络协议和格式
@SOAPBinding是一个用来描述SOAP格式和RPC的协议的绑定Annotation.
@WebMethod Annotation的operationName成员描述了wsdl:operation,而且它的操作描述了WSDL文件中的SOAPAction头部,这是客户端必须要放入到SOAPHeader中的数值,SOAP1.1中的一种约束。
@WebParam Annotation的partName成员描述了WSDL文档中的wsdl:part.
@WebResult Annotation的partName成员描述了wsdl:part用来返回WSDL文档的值。
第二步:创建webservice接口及实现类(下面为Java代码)
创建HelloWorld接口
View Code
@WebService
public interface HelloWorld {
@WebMethod
String sayHi(@WebParam(name="text")String text);
@WebMethod
String sayHiToUser(User user);
@WebMethod
String[] SayHiToUserList(List<User> userList);
}
第三步:创建HelloWorldImpl实现类
@WebService(endpointInterface = "demo.spring.service.HelloWorld", serviceName = "HelloWorld") //endpointInterface表示该类就必须实现此接口所有方法,serviceName表示webservice的服务名称 public class HelloWorldImpl implements HelloWorld { Map<Integer, User> users = new LinkedHashMap<Integer, User>(); @WebMethod public String sayHi(String text) { return "Hello " + text; } @WebMethod public String sayHiToUser(User user) { users.put(users.size() + 1, user); return "Hello " + user.getName(); } @WebMethod public String[] SayHiToUserList(List<User> userList) { String[] result = new String[userList.size()]; int i = 0; for (User u : userList) { result[i] = "Hello " + u.getName(); i++; } return result; } }
第四步:启动webserviceApp.java,访问http://localhost:8080/helloWorld?WSDL
View Code
public class WebServiceApp {
public static void main(String[] args) {
System.out.println("web service start");
HelloWorldImpl implementor= new HelloWorldImpl();
String address="http://localhost:8080/helloWorld";
Endpoint.publish(address, implementor);
System.out.println("web service started");
}
}
第五步:在web.xml中加入cxf相应配置,内容如下:
View Code
<!--cxf start-->
<!--用于加载applicationContext.xml配置信息-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<!--使用spring ContextLoaderListener 加载applicationContext.xml-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置CXFServlet-->
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-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可自定义配置,用于CXFServlet请求地址拦截,访问会用到 -->
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping>
<!--cxf end -->
第六步:在src中创建基本的applicationContext.xml内容如下(作用:主要做webservice接口属性配置,通过web.xml配置加载)
View Code
<?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: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 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" />
<!--id:名称(随意配),implementor:指定接口具体实现类,address:随意配-->
<jaxws:endpoint id="helloWorld" implementor="demo.spring.service.HelloWorldImpl" address="/HelloWorld" />
<!-- WebService 客户端 spring 配置文件 cxf与Spring集成,cxf里提供了一个工厂类org.apache.cxf.jaxws.JaxWsProxyFactoryBean,可以方便实现的调用WebService。 serviceClass属性是接口类,address是webService的路径 在其他bean里如果要调用webservice,只要将client这个bean注入到需要使用的bean里。 -->
<bean id="client" class="demo.spring.service.HelloWorld" factory-bean="clientFactory" factory-method="create" />
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="demo.spring.service.HelloWorld" />
<property name="address" value="http://localhost:8080/webservices/HelloWorld" />
</bean>
</beans>
第七步:发布webservice到tomcat
Java代码,验证WSDL是否发布成功:
如果项目发布放在/webapps/ROOT下时:
访问http://IP地址:端口/webservices/{applicationContent.xml中配置的address}?wsdl
//webservices对应web.xml中的<url-pattern>/webservices/*</url-pattern>验证是否能正常看到xml格式的页面
第八步:测试
View Code