`

XFire WebService开发快速起步

阅读更多
 
环境:
XFire-1.2.6
JDK1.5
MyEclipse 6.5
Tomcat-5.5.27
Windows XP Professional简体中文版
 
软件下载地址:
 
有关WebService的概念、原理、数据发现、描述、绑定等过程、方式也不说了。这里就只关注如何快速开发出来一个通用的、易懂的Hello World例子。
 
以下是开发步骤:
 
1、创建工程
 
打开MyEclipse 6.5,新建一个WebService工程。如下图
 
 
然后一路next,直到完成。
 
创建完成后,打开生成的web.xml文件,可以看到,XFire已经配置好了。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     [url]http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd[/url]">
    <servlet>
        <servlet-name>XFireServlet</servlet-name>
        <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>XFireServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>
 
2、创建WebService服务
 
创建两个个包“wstest.server”和“wstest.client”,用来保存服务端和客户端程序。然后开始创建服务端程序,如下图
 
 
 
完成后,生成了一个Service的配置services.xml:
 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">

  <service>
    <name>MyService</name>
    <serviceClass>wstest.server.IMyService</serviceClass>
    <implementationClass>
      wstest.server.MyServiceImpl
    </implementationClass>
    <style>wrapped</style>
    <use>literal</use>
    <scope>application</scope>
  </service>
</beans>
 
也生成了接口和默认实现,改写后如下:
package wstest.server;
//Generated by MyEclipse

public interface IMyService {
    
  public String sayHello(String user);
    
}
 
package wstest.server;
//Generated by MyEclipse

public class MyServiceImpl implements IMyService {
    
  public String sayHello(String user) {
    return "您好,"+user;
  }
    
}
 
至此,服务端代码已经完成。
 
3、测试服务端代码
 
测试依赖与Servlet容器Tomcat,需要将做好的服务端打包部署到tomcat上,然后启动。才可以进行测试。假设你已经配置了Tomcat服务器,并完成了WebService服务端的部署。那么,现在就启动Tomcat,然后:
 
 
 
 
 
 
这样,出现上上面的结果,表明测试成功了。
 
4、生成客户端代码
 
 
 
 
 
很郁闷,这个生成的客户端代码一部分跑到服务端的包里面了。真是垃圾,rubbish!!!
 
但是,这就是MyEclipse的功能,我改变不了。
 
5、客户端测试
 
下面就耐心看怎么用这个客户端代码。
打开生成的代码如下:

package wstest.client;

import java.net.MalformedURLException;
import java.util.Collection;
import java.util.HashMap;
import javax.xml.namespace.QName;
import org.codehaus.xfire.XFireRuntimeException;
import org.codehaus.xfire.aegis.AegisBindingProvider;
import org.codehaus.xfire.annotations.AnnotationServiceFactory;
import org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.jaxb2.JaxbTypeRegistry;
import org.codehaus.xfire.service.Endpoint;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.soap.AbstractSoapBinding;
import org.codehaus.xfire.transport.TransportManager;

public class MyServiceClient {

        private static XFireProxyFactory proxyFactory = new XFireProxyFactory();
        private HashMap endpoints = new HashMap();
        private Service service0;

        public MyServiceClient() {
                create0();
                Endpoint MyServicePortTypeLocalEndpointEP = service0 .addEndpoint(new QName("http://server.wstest", "MyServicePortTypeLocalEndpoint"), new QName("http://server.wstest", "MyServicePortTypeLocalBinding"), "xfire.local://MyService");
                endpoints.put(new QName("http://server.wstest", "MyServicePortTypeLocalEndpoint"), MyServicePortTypeLocalEndpointEP);
                Endpoint MyServiceHttpPortEP = service0 .addEndpoint(new QName("http://server.wstest", "MyServiceHttpPort"), new QName("http://server.wstest", "MyServiceHttpBinding"), "http://localhost:8080/xfire126Demo/services/MyService");
                endpoints.put(new QName("http://server.wstest", "MyServiceHttpPort"), MyServiceHttpPortEP);
        }

        public Object getEndpoint(Endpoint endpoint) {
                try {
                        return proxyFactory.create((endpoint).getBinding(), (endpoint).getUrl());
                } catch (MalformedURLException e) {
                        throw new XFireRuntimeException("Invalid URL", e);
                }
        }

        public Object getEndpoint(QName name) {
                Endpoint endpoint = ((Endpoint) endpoints.get((name)));
                if ((endpoint) == null) {
                        throw new IllegalStateException("No such endpoint!");
                }
                return getEndpoint((endpoint));
        }

        public Collection getEndpoints() {
                return endpoints.values();
        }

        private void create0() {
                TransportManager tm = (org.codehaus.xfire.XFireFactory.newInstance().getXFire().getTransportManager());
                HashMap props = new HashMap();
                props.put("annotations.allow.interface", true);
                AnnotationServiceFactory asf = new AnnotationServiceFactory(new Jsr181WebAnnotations(), tm, new AegisBindingProvider(new JaxbTypeRegistry()));
                asf.setBindingCreationEnabled(false);
                service0 = asf.create((wstest.client.MyServicePortType.class), props);
                {
                        AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://server.wstest", "MyServiceHttpBinding"), "http://schemas.xmlsoap.org/soap/http");
                }
                {
                        AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://server.wstest", "MyServicePortTypeLocalBinding"), "urn:xfire:transport:local");
                }
        }

        public MyServicePortType getMyServicePortTypeLocalEndpoint() {
                return ((MyServicePortType)(this).getEndpoint(new QName("http://server.wstest", "MyServicePortTypeLocalEndpoint")));
        }

        public MyServicePortType getMyServicePortTypeLocalEndpoint(String url) {
                MyServicePortType var = getMyServicePortTypeLocalEndpoint();
                org.codehaus.xfire.client.Client.getInstance(var).setUrl(url);
                return var;
        }

        public MyServicePortType getMyServiceHttpPort() {
                return ((MyServicePortType)(this).getEndpoint(new QName("http://server.wstest", "MyServiceHttpPort")));
        }

        public MyServicePortType getMyServiceHttpPort(String url) {
                MyServicePortType var = getMyServiceHttpPort();
                org.codehaus.xfire.client.Client.getInstance(var).setUrl(url);
                return var;
        }

        public static void main(String[] args) {
                

                MyServiceClient client = new MyServiceClient();
                
    //create a default service endpoint
                MyServicePortType service = client.getMyServiceHttpPort();
                
    //TODO: Add custom client code here
                    //
                    //service.yourServiceOperationHere();
                
    System.out.println("test client completed");
                    System.exit(0);
        }

}
 
看得很晕,不知道啥意思,但是从“TODO”标记处,我知道了:
    //TODO: Add custom client code here
                    //
                    //service.yourServiceOperationHere();
 
现在就在这里添加测试代码吧:
    //TODO: Add custom client code here
                    //
                    //service.yourServiceOperationHere();
                String helloString = service.sayHello("熔岩");
                System.out.println(helloString);
 
添加了很傻蛋的两行代码后,就可以运行起来看看测试代码了。
 
运行结果如下:
您好,熔岩
test client completed
 
终于可以松一口气了。完整的例子跑起来了。
 
6、总结
 
总感觉这个开发过程不爽,其实有更好的工具和开发方式:
 
WebService的编写,比较麻烦的是客户端代码,客户端代码依靠人工去写基本上是不可能的,除非你愿意付出惊人的时间和精力,既便如此也得不偿失。
 
MyEclipse的客户端开发太差,主要是生成的客户端代码混乱,解决办法是将客户端的编写放到单独一个工程里面来做。
 
其实,只要服务端编写好了,就完全可以用别的方式根据wsdl的url去生成客户端代码,在这里不得不将一个强大的工具IDEA8推荐出来,IDEA8自带WebService开发工具,插件非常强大,易用。在后面的篇幅中,我会做专门介绍,敬请关注。
 
当然,MyEclipse也并非一无是处,MyEclipse的服务端调试工具就很不错,很喜欢。提高了开发效率,这也是MyEclipse的过人之处。
分享到:
评论

相关推荐

    XFire_WebService开发快速起步.docx

    总结来说,XFire_WebService开发快速起步主要涉及以下几个知识点: 1. XFire框架:了解其功能、用途和配置方式。 2. WebService基础:理解WebService的基本概念,如WSDL、UDDI等。 3. MyEclipse的使用:掌握在...

    WebService开发快速起步

    ### WebService开发快速起步 #### 一、概述 在当今高度互联的世界中,不同系统间的交互变得越来越重要。Web Service作为一种标准技术,被广泛应用于不同应用程序之间的通信。它允许不同平台上的应用程序通过HTTP...

    XFire开发指南,很详细的书

    #### 三、XFire开发起步 - **安装与配置**:在Eclipse中创建一个新的用户库,包含`xfire-all-1.2.5.jar`和其他依赖的jar包。 - **示例程序开发**: - **简单的WebService**:实现一个简单的WebService接口,例如一...

    建设项目管理-勘查设计管理.ppt

    建设项目管理-勘查设计管理.ppt

    实训商业源码-绿色环保设备网站源码-毕业设计.zip

    实训商业源码-绿色环保设备网站源码-毕业设计.zip

    这篇文章是《2025文化营销10大趋势报告》的内容概述,主要分析了当前文化营销领域的关键趋势和发展方向 以下是文章的主要内容总结:

    内容概要:本文介绍了《2025文化营销10大趋势报告.pdf》的主要内容,涵盖了文化营销的十大趋势,包括触摸手工艺的温度、在地叙事走出「在地」、赛博冲浪抢占前排、女性议题长出「新枝」、品牌入「圈」高亮身份标识、以智性声音唤醒内心力量、文化体验迈向品牌主场、文化景观迎来重构浪潮、文化品牌以「生活」做解法、文化复兴正当时。报告通过具体案例分析了品牌如何利用这些趋势与消费者建立深度连接,如通过非遗民艺、圈层文化、文化热点、女性互助等手段,实现品牌价值和文化认同的双赢。 适用人群:市场营销人员、品牌管理者、广告策划人员、文化研究者。 使用场景及目标:①帮助品牌更好地理解当前文化营销的趋势和消费者心理;②指导品牌制定更具针对性和创新性的营销策略;③通过案例学习,提升品牌的文化营销实践能力。 其他说明:本文不仅提供了对文化营销趋势的深入解析,还强调了品牌在进行文化营销时应注重真诚、深度和长期价值,避免表面化和同质化。同时,报告呼吁品牌在营销中尊重和理解文化内核,积极回应社会议题,以实现与消费者的情感共鸣和精神共振。

    实训商业源码-彩虹代刷-毕业设计.zip

    实训商业源码-彩虹代刷-毕业设计.zip

    基于Python与MySQL的小区物业管理系统.zip

    基于Python与MySQL的小区物业管理系统.zip

    基于Python的Keras卷积神经网络图片分类系统.zip

    基于Python的Keras卷积神经网络图片分类系统.zip

    基于MATLAB的电力系统分段电价需求响应算法实现削峰填谷 - 电力系统

    内容概要:本文介绍了利用MATLAB实现电力系统的分段电价需求响应算法,旨在通过调整不同时段的电价变化率来优化电力系统的负荷分布,达到削峰填谷的效果。文中详细解析了程序的关键步骤,包括参数设置、时段处理、负荷总量守恒以及可视化展示。通过设定电价基准和弹性系数矩阵,程序能够模拟不同电价下各时段的负荷需求变化,并确保总用电量保持不变。此外,还展示了如何使用MATLAB内置函数如plotyy进行结果可视化,使电价与负荷需求的变化关系更加直观。 适合人群:从事电力系统研究、智能电网开发的技术人员,以及对电力市场机制感兴趣的学者和学生。 使用场景及目标:适用于电力公司制定合理的电价政策,评估不同电价策略对电力负荷的影响,从而优化资源配置,提高电力系统的稳定性和效率。 其他说明:该模型提供了一种简单而有效的手段来验证价格策略的可行性,帮助决策者在实施新电价政策之前进行充分的风险评估。未来可以进一步扩展模型,引入更多复杂因素如时滞效应和用户行为随机性,使其更接近实际情况。

    欧姆龙PLC NJ系列模切机程序:12轴EtherCAT伺服运动与张力控制的高级应用 - EtherCAT

    内容概要:本文深入介绍了欧姆龙PLC NJ系列模切机程序的设计与实现,涵盖12轴EtherCAT总线伺服运动控制、张力控制PID算法、隔膜自动纠偏控制以及同步运动控制等核心技术。通过结构化编程和ST语言功能块的应用,确保了系统的高精度和稳定性。文中提供了详细的代码示例和技术解析,帮助读者理解每个功能模块的具体实现。 适合人群:具备PLC基础知识并希望深入了解工业自动化控制技术的工程师和技术人员。 使用场景及目标:适用于需要进行多轴运动控制、张力调节和同步操作的工业设备开发和维护。通过学习本项目,读者能够掌握PLC高端复杂应用的实际操作技能,提升解决实际工程问题的能力。 其他说明:本文不仅提供理论讲解,还附有大量实用的代码片段,便于读者动手实践。此外,项目结构规范、注释详尽,有助于提高代码的可读性和可维护性。

    论文模板-html5工业设备网站源码-实训商业源码.zip

    论文模板-html5工业设备网站源码-实训商业源码.zip

    基于Matlab Simulink的直流配电网仿真:下垂控制与VSC换流器模型的电压电流波形及有功功率分析 电力系统

    内容概要:本文详细介绍了利用Matlab Simulink对直流配电网进行仿真的过程,重点展示了下垂控制仿真模型和换流器(VSC)仿真模型。通过这两个模型,作者分析了电压、电流波形及其稳定性,并研究了不同条件下有功功率的变化。文中还提供了一个简化的Matlab代码示例,帮助读者理解和实现直流配电网的建模与仿真。 适合人群:从事电力系统研究的专业人士、高校师生及相关领域的研究人员。 使用场景及目标:适用于希望深入了解直流配电网运行机制和技术细节的人群,旨在提高他们对该领域的理论认知和实践能力。 其他说明:文章不仅提供了理论解释,还包括具体的操作步骤和代码片段,便于读者动手实验。同时强调了直流配电网在未来能源网络发展中的重要性和潜力。

    西门子智能控制设备调试:程序集成、模拟量与通讯控制双重应用,动态图演示与全套EPLAN图纸齐全 · PLC编程

    内容概要:本文介绍了西门子200SMART程序的成功编写及其在工业自动化项目中的应用。该程序实现了模拟量控制和通讯控制两种方式,涵盖了伺服控制和温控表的通讯。程序经过详细的调试,确保设备能够在复杂环境下稳定运行。同时,配备了西门子触摸屏界面,提供设备工作动图和丰富信息展示,便于用户监控和维护。此外,还提供了全套EPLAN图纸,详细展示了设备的电气原理图、接线图和布局图,为设备的安装、调试、维护和升级提供了重要支持。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程、伺服控制和温控系统有需求的专业人士。 使用场景及目标:适用于需要实现高精度控制和稳定通信的工业自动化项目,旨在提高设备运行效率和稳定性,减少故障率并优化维护流程。 其他说明:本文不仅详细记录了程序编写的技术细节,还强调了实际应用中的关键点,如抗干扰措施、通讯故障处理等,为读者提供了宝贵的实践经验。

    操作系统RHEL10.0官网正式版ISO安装镜像

    对于想要部署或体验RHEL10.0的企业用户和个人开发者来说是非常有用的信息。 适合人群:需要部署企业级服务器环境的企业IT管理员、对RHEL系统感兴趣的个人开发者。 使用场景及目标: ①企业IT管理员准备搭建基于RHEL10.0的操作系统环境时可以据此下载所需镜像; ②个人开发者想要学习研究RHEL10.0特性,构建本地测试环境。 链接: https://pan.baidu.com/s/1C-_N5rkJjBD1r7yPRzTKJg?pwd=d3s6 提取码: d3s6 RedHat-10-HashSum.txt Red_Hat_Enterprise_RHEL_Lightspeed-zh-CN.pdf rhel-10.0-x86_64-boot.iso rhel-10.0-x86_64-dvd.iso rhel-10.0-x86_64-kvm.qcow2 rhel-10.0-x86_64-wsl2.tar.gz rhel-rt-10.0-x86_64-dvd.iso virtio-win-1.9.45.iso VMware-workstation-full-17.6.3-24583834.rar Xshell-8.0.0069p 免费直用.rar beat HashSums.txt rhel-10.0-beta-aarch64-dvd.iso rhel-10.0-beta-x86_64-dvd.iso

    三相PWM整流器Simulink仿真:双闭环PI控制与SVPWM调制策略的应用 电能质量 (05月)

    内容概要:本文详细介绍了基于双闭环PI控制和SVPWM调制策略的三相PWM整流器Simulink仿真模型。三相PWM整流器作为一种电力电子装置,主要用于将交流电转换为直流电。文中首先解释了三相PWM整流器的基本概念及其重要性,接着重点阐述了双闭环PI控制(包括电压外环和电流内环)和SVPWM调制策略的具体实现方法。双闭环PI控制确保系统在面对负载突变等复杂工况时仍能保持稳定,而SVPWM调制策略则提高了电压和电流的波形质量,降低了交流侧的谐波含量。最后,通过对仿真结果的分析,展示了该模型在不同工况下的优异整流效果和良好的电能质量提升能力。 适合人群:从事电力电子、自动化控制等领域研究的技术人员和高校相关专业师生。 使用场景及目标:适用于需要深入了解三相PWM整流器工作原理和技术细节的研究人员,帮助他们掌握Simulink仿真工具的使用技巧,以便更好地应用于实际项目中。 其他说明:本文不仅提供了理论知识,还结合了具体的仿真案例,使读者能够更加直观地理解和掌握所涉及的技术要点。

    婚庆公司网络营销策划书.doc

    婚庆公司网络营销策划书.doc

    Simulink与Carsim联合仿真:基于PID与MPC的自适应巡航控制与紧急避撞车辆动力学模型指导

    内容概要:本文详细介绍了如何利用Simulink和Carsim进行联合仿真,实现基于PID和MPC的自适应巡航控制和紧急避撞功能。主要内容包括Carsim参数设置cpar文件、Matlab S函数编写、Simulink车辆动力学模型构建以及远程指导。首先,Carsim参数设置涵盖了车辆基本参数、道路条件和环境因素,确保仿真的准确性。接着,通过编写Matlab S函数实现了PID和MPC控制算法,用于计算控制信号,如油门开度和刹车力度。然后,在Simulink中构建了车辆动力学模型,模拟汽车行驶过程及其物理特性。最后,提供了远程指导功能,便于实时监控和调整实验过程。 适合人群:对汽车驾驶辅助系统感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于研究和开发自适应巡航控制系统,旨在提高驾驶安全性和舒适性,特别是在复杂交通环境中。 其他说明:随着自动驾驶技术的发展,这种联合仿真的应用前景广阔,能够帮助研究人员更深入地理解和优化汽车行驶过程和动力学特性。

    施工项目管理手册定稿.doc

    施工项目管理手册定稿.doc

    数据处理与分析期末试题A卷.pdf

    数据处理与分析期末试题A卷.pdf

Global site tag (gtag.js) - Google Analytics