发布复杂的WebService
WebService-CXF ???????? ApacheCXF的是一个开源的服务框架。 CXF帮助您使用前端编程API,如JAX-WS和JAX-RS来建设和开发服务。这些服务可以使用多种协议,如SOAP,XML / HTTPRESTful HTTP,或CORBA,可以以多种传输方式工作,如HTTP,JMS或JBI。 支持多种协议: ???????? SOAP1.1,1,2 ???????? XML/HTTP ???????? CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构,早期语言使用的WS。C,c++,C#) 优点:可以与Spring进行快速无缝的整合 ???????? ? 灵活的部署:可以运行有Tomcat,Jboss,Jetty(内置),IBMWS,BeaWS上面。 jax-ws ???????? jax-ws是Sun公司发布的一套开发WebService服务的标准。早期的标准如jax-rpc已经很少使用(在目前的jdk当中也没有附带这个工具,axis就是使用的这个标准。)。而cxf就是在新标准jax-ws下开发出来的WebService,jax-ws也内置到了jdk1.6当中。 安装CXF 设置以下环境变量: ????JAVA_HOME? ????CXF_HOME ????ANT_HOME ????CATALINA_HOME ????Path = %JAVA_HOME%bin;%CXF_HOME%bin;%CATALINA_HOME%bin;%ANT_HOME%bin ????CLASSPATH=.;%CXF_HOME%libcxf-manifest.jar;.buildclasses Ant工具 ???????? Ant做为一种工具已经广泛被使用,并且历史悠久。使用ant的内置命令,可以编译java源文件(javac),运行java文件(java),给class文件打包(jar、war、ear),也可以创建(mkdir)、删除(del)、拷贝(copy),甚至可以使用ant执行sql文件。由于ant是用xml语言写成的文件,并取默认名为build.xml文件。所以,今后大家应该在见到名为build.xml文件时知道这是一个ant的文件。默认在Eclipse和MyEclipse的对ant有内建的支持。大家可以在MyEclipse中任意项目中建立一个文件叫build.xml文件,你会发现它有不同的图标(上面有个小蚂蚁)。 简单介绍Ant: ???????? 在myeclipse中建立build.xml文件后会变成小蚂蚁标志 <?xml version="1.0"?> <!--对于project来说,需要指定一个default属性,说明入口程序是谁,也就是那个任务的name--> <project default="a"> <!--由多个任务组成--> <target name="a"> <!--对于ant,可以进行拷贝、翻译、下载、打包--> <!--输出hello world--> <echo>hello world</echo> </target> <!--也可以定义变量,变量可以定义到外部文件中,但是必须交build.properties--> <property name="abc">hello world</property> <target name="b"> <echo message="${abc}"></echo> </target> </project> ? Ant发布tomcat工程 1、执行ant clean清除以前生成的代码 2、执行ant war打包此应用。 3、执行ant deploy–Dtomcat=true将项目发布到tomcat的服务器上。 4、启动tomcat服务器 5、打开IE的地址栏输入: http://localhost:9999/helloworld/services/hello_world?wsdl ??????????????????????????? 或:http://localhost:9999/helloworld/services 6、在命令行执行: antclient-servlet –Dbase.url=http://localhost:9999 ?或在MyEclipse的WebServiceExplorer中访问这个WebService 7、停止tomcat服务器。 8、卸载应用:antundeploy –Dtomcat=true 9、清空项目:ant clean ? 用CXF发布webservice 1、导入全部jar包 2、发布webservice需要用到FacotryBean,有两个ServerFactoryBean和JaxWsServerFactoryBean,建议用第二种JaxWsServerFactoryBean,因为JaxWsServerFactoryBean继承了ServerFactoryBean,用ServerFactoryBean发布的webservice即使加上@WebService注解后,生成的wsdl文件也不会全面。但是用JaxWsServerFactoryBean发布的webservice,加上@WebService注解后,生成的wsdl文件全面。 //加入@WebService注解后,生成的wsdl文件全面,并且接口上也要加上@WebService注解 @WebService public class JaxWsHelloWorld { public String sayHello(){ System.out.println("服务已经被调用。。。"); return "HelloWorld!"; } public static void main(String[] args) { //创建实现类实例 JaxWsHelloWorldImpl hw = new JaxWsHelloWorldImpl(); JaxWsServerFactoryBean server = new JaxWsServerFactoryBean(); //设置要发布为webservice的类(传入接口) server.setServiceClass(IJaxWsHelloWorld.class); //设置绑定发布地址 server.setAddress("http://192.168.1.100:9999/helloworld"); //设置发布为webservice的实例 server.setServiceBean(hw); //增加消息拦截器 server.getInInterceptors().add(new LoggingInInterceptor()); server.getOutInterceptors().add(new LoggingOutInterceptor()); //创建webservice server.create(); System.out.println("服务已经被创建。。。"); } } 注:对于同ServerFactoryBean发布的WebService,客户端可用ClientProxyFactoryBean。而用JaxWsServerFactoryBean发布的WebService,客户端可用JaxWsProxyFactoryBean。但是一般不用这种框架客户端的调用方式,应为高度耦合。 ? CXF发布Web工程 由于cxf的web项目已经集成了Spring。所以,cxf的服务类都是在spring的配置文件中完成的。 步骤:第一步:建立一个web项目。 ?第二步:准备所有jar包。将cxf_homelib项目下的所有jar包全部copy到新项目的lib目录下,里面已经包含了spring3.0的jar包。 ?第三步:在web.xml中配置cxf的核心servlet,CXFServlet。 <!-- 配置cxf框架的核心Servlet --> <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>/ws/*</url-pattern> </servlet-mapping> 第四步:创建(最好是Copy)cxf-servlet.xml文件。这是一个spring的配置文件。 <?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" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"> </beans> 配置文件发布第一个webservice 发布一个简单的webservice 在cxf-servlet.xml <!-- 发布一个简单的webservice ?????? * 使用jaxws:endpoint标签来发布 ?????????? * id:标签id,唯一的,必要条件 ?????????? * address:绑定地址,相对地址(相对工程上下文) ?????????? * implementor:绑定需要发布为webservice的类路径 ??? ?--> ?? <jaxws:endpointid="HelloWorld"address="/helloworld"implementor="app.service.HelloWorld"></jaxws:endpoint> /* * 在类上也要加入@WebService注解,这样wsdl文件就全面了。 * 但是不用在接口上加注解,由于在配置文件中我们只加入了类的类名,而没引入接口 */ @WebService public class HelloWorld implements IHelloWorld { public String sayHello(){ System.out.println("服务已经被调用。。。"); return "HelloWorld!"; } } ? 对于客户端的调用也可通过CXF的wsdl2java生成客户代码 在cxf中,也提供了一个用于生成客户端调用代码的工具。它的功能就如同wsimport一样 它包含以下参数:-d参数,指定代码生成的目录。-p参数,指定生成的新的包结构。 需要说明的是,由于wsdl2java是根据jdk1.7生成的本地代码,所以,需要对生成的代码做一点点修改。对于1.7的service类中的构造函数是传入三个参数,但是以前的版本传入两个参数,如果用的是低版本的,执行删除报错地方的第三个参数即可。 ? 发布一个复杂的webservice <!--发布一个复杂的webservice,指定接口--> <jaxws:server id="HelloWorld" address="/helloworld" serviceClass="app.service.IHelloWorld"> <jaxws:serviceBean> <!-- 指明实现类 --> <bean class="app.service.HelloWorld"></bean> </jaxws:serviceBean> </jaxws:server> //这时在类跟接口上都要指定@WebService注解,由于配置文件中都涉及到了 @WebService public class HelloWorld implements IHelloWorld { private List<User> users = new ArrayList<User>(); //增加用户 public void saveUser(User user){ System.out.println(user.getName()); System.out.println(user.getAge()); users.add(user); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |