Eclipse+CXF开发Web服务、Tomcat部署
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、下载CXF包,apache-cxf-2.6.1.tar.gz,解压后得到文件夹apache-cxf-2.6.1
图1
二、创建服务端
1、新建Dynamic Web Project
File—New—Project—Web—Dynamic Web Project;
工程命名后Next,将“Default output folder”改为WebContent/WEB-INF/classes,Next;
勾选“Generate web.xml deployment discriptor”。
图2
图3
图4
2、将解压后apache-cxf-2.6.1文件夹lib文件夹中的JAR文件导入工程下WebContent/WEB-INF/lib中,或直接复制到相应文件夹下,刷新工程。
3、创建服务接口
工程右键—New—Interface,添加代码:
package com.yxj;
import javax.jws.WebService;
import javax.jws.WebParam;
import javax.jws.WebMethod;
@WebService
public interface IcxfWB {
@WebMethod
String sayHello(@WebParam(name="name") String name);
}
说明:“@WebService”标记表示该接口是一个WebService服务,@ WebMethod标记表示WebService中的方法;@WebParam(name="paramName")
表示方法中的参数,name属性限制了参数的名称,若没有指定该属性,参数将会被重命名。
4、创建服务实现类
package com.yxj;
public class CxfWBImpl implements IcxfWB {
public String sayHello(String name) {
return"Hello "+name;
}
}
5、编辑WebContent/WEB-INF下web.xml文件
<?xml version="1.0"encoding="UTF-8"?>
<web-app xmlns:xsi="/2001/XMLSchema-instance"
xmlns="/xml/ns/javaee"
xmlns:web="/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="/xml/ns/javaee
/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID"
version="3.0">
<display-name>CXFService</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/service-beans.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</li
stener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
其中,<context-param>指定了spring的相应配置,在<param-value>中指定了配置文件的位置;<servlet-mapping>下的<url-pattern>指明了服务访问时地址的形式,“/*”代表URL地址中,包名称后直接跟服务endpoint地址,若指明<url-pattern>为“/webservice/*”,则URL为包名/ webservice/endpoint?wsdl。
6、在WebContent/WEB-INF下创建刚才指定的service-beans.xml文件,添加内容如下:
<?xml version="1.0"encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:jaxws="/jaxws"
xsi:schemaLocation="
/schema/beans
/schema/beans/spring-beans.xsd
/jaxws /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"/>
<bean id="SayHello"class="com.yxj.CxfWBImpl"/>
<jaxws:endpoint id="sayHello"implementor="#SayHello"
address="/sayHello"/>
</beans>
<jaxws:endpoint>定义了一个Webservice,implementor是webservice的处理类,值为在<bean>中指定的id,其具体实现类在class中指明,address是它的访问路径,就是刚才提到的将要在URL中显示的endpoint的名称。
三、部署服务到Tomcat
1、打包工程
右键工程—Export—WAR file,指定输出路径,设置Target runtime(图5)后Finish。
则在相应路径下会生成war文件,如图6。
图5
图6
2、将war文件移动至apache-tomcat\webapps下:
图7
启动Tomcat,在浏览器中输入http://localhost:8080/CXFService,可以看到如图8界面,说明服务部署成功。
打开服务WSDL如图9所示,可以看出URL地址为localhost:8080/war包名/service-beans.xml中设置的endpoint的address。
另外,sayHello方法的参数名称为指定的“name”,如果在接口方法定义“String sayHello(@WebParam(name="name") String name);”中没有在括号中指明name属性,则该处参数名称name会被重定义为arg0。
图8
图9
四、客户端实现(以Spring调用为例)
1、生成Stub
CXF 发行版提供了一个名为“wsdl2java.bat”的工具,该工具可以通过WSDL 为特定的服务创建stub。
参数介绍:
-p 指定其wsdl的命名空间,即要生成代码的包名
-d 指定要产生代码所在目录
-client 生成客户端测试web service的代码
-server 生成服务器启动web service的代码
-impl 生成web service的实现代码
-ant 生成build.xml文件
-compile 生成代码后编译
-quient 静默模式,不输出警告与错误信息
-all 生成所有开始端点代码:types, service proxy, service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
一般用到命令wsdl2java –p 生成代码的包名–d 生成代码的路径wsdl地址,例如:.../apache-cxf-2.6.1/bin/wsdl2java -p com.yxj.client -d /home/administrator/src http://localhost:8080/CXFService/sayHello?wsdl
执行命令后,在指定位置/home/administrator/src下即生成了一些java文件。
2、创建客户端工程
1)新建Java Project,将第一步中生成的src文件夹下的所有java文件移至工程src 下,刷新工程。
2)添加CXF包,右键工程—Build Path—Configure Build Path—Libraries—Add External JARs,添加下载解压得到的CXF相关jar文件。
图10
3)新建包含有main方法的Class,添加代码:
package com.yxj.client;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.yxj.client.IcxfWB;
public class ClientCall {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
ClassPathXmlApplicationContext context
= new ClassPathXmlApplicationContext(new String[]
{"com/yxj/client/client-beans.xml"});
IcxfWB client = (IcxfWB)context.getBean("sayHello2");
String response = client.sayHello("Joe");
System.out.println("Response: " + response);
System.exit(0);
}
}
4)在类ClientCall同级目录,即com/yxj/client下新建client-beans.xml配置文件:
<?xml version="1.0"encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:jaxws="/jaxws"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd /jaxws /schemas/jaxws.xsd">
<jaxws:client id="sayHello2"serviceClass="com.yxj.client.IcxfWB"
address="http://localhost:8080/CXFService/sayHello?wsdl"/>
</beans>
该方式访问ws服务是利用spring的依赖注入法,其中id是spring IOC容器唯一标识符,在代码中也是通过id获得服务对象的(context.getBean("sayHello2"));serviceClass是Webservices服务接口;address是服务的wsdl地址。
运行,控制台输出:。