• 使用JDK和axis2发布webservice


    最近使用webservice进行远程调用一直很火,自从JDK1.6版本发布后,发布一个webservice项目变得更加简单了

    笔者由于工作的需要针对JDK和axis2如何发布webservice做过相关了解,现整理出来供大家参阅,由于水平所限难免有不足之处,请大家指正!

    JDK发布webservice的方法

    要求环境,jdk1.6以上

    服务端代码:

    import javax.jws.WebMethod;
    import javax.jws.WebService;
    import javax.jws.soap.SOAPBinding;
    import javax.jws.soap.SOAPBinding.Style;


    @WebService(name="pre",targetNamespace="http://www.pre.com")
    @SOAPBinding(style = Style.RPC)
    public class PreService {

    @WebMethod
    public void say(){
    System.out.println("------hello world--------");
    }
    }

    注释:
    name只是确定一个名字,可以自己随便取名,targetNamespace是你的命名空间,也就是调用你这个服务端时要绑定的域名
    SOAP格式,style确定使用哪种方式进行交互,RPC是远程调用

    下面生成客户端:
    cmd命令行下面写下面的代码
    wsimport -keep -p com.demo.client http://localhost:8080/Test/services/preService?wsdl
      命令参数说明:
      -d:生成客户端执行类的class文件的存放目录
      -s:
      -p:定义生成类的包名

    然后把生成的类放入客户端,这样就可以实例化一个服务端类的对象
    public class Client {
    private static URL CRC_WSDL_LOCATION;
    private static QName qName;
    private static Service service;
    private static Pre simp;
    static {
    URL url = null;
    try {
    url = new URL("http://localhost:8080/Test/services/preService?wsdl");
    CRC_WSDL_LOCATION = url;
    qName = new QName("http://www.pre.com", "PreServiceService");
    service = Service.create(CRC_WSDL_LOCATION, qName);
    simp = service.getPort(Pre.class);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

    URL:就是你服务端发布的端口
    QName里面的两个参数:第一个---服务器类的命名空间,第二个---使用wsimport命令生成的客户端类PreServiceService
    wsimport命令会生成两个客户端类,Pre.java和PreServiceService.java,其中Pre.java是接口

    接下来配置文件,有两种方式把服务器端启动起来
    第一种:使用main函数发布,不需要tomcat
    简单的新建一个类,使用了一个main主函数写一个方法
    Endpoint.publish("http://127.0.0.1:8888/preService" , new Pre());

    第二种:使用tomcat发布
    web.xml里面添加如下代码
    <listener>
    <listener-class>
    com.sun.xml.ws.transport.http.servlet.WSServletContextListener
    </listener-class>
    </listener>

    <servlet>
    <servlet-name>PreService</servlet-name>
    <servlet-class>
    com.sun.xml.ws.transport.http.servlet.WSServlet
    </servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>PreService</servlet-name>
    <url-pattern>/preService</url-pattern>
    </servlet-mapping>
    这样需要导入三个jar包,如下:
    webservices-extra-api.jar
    webservices-extra.jar
    webservices-rt.jar

    这三个jar包百度搜索就可以下载下来,笔者这里就不链接下载地址了

    在WEB-INF下面新建一个sun-jaxws.xml文件
    <?xml version="1.0" encoding="UTF-8"?>
    <endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'>
    <endpoint
    name='PreService'
    implementation='com.amarsoft.pre.PreService'
    url-pattern='/preService'/>
    </endpoints>

    第四个属性:binding="http://java.sun.com/xml/ns/jaxws/2003/05/soap/bindings/HTTP/"
    endpoint里面只需三个属性,网上有4个属性的会在生成客户端的时候报SOAP的Binding不是一个标准的
    这样有一个缺点就是不能修改发布端口,靠tomcat发布只能使用tamcat的端口

    ================================================================================================


    使用axis2发布webservice,一样比较简单
    第一步导入axis2的jar包

    服务器端:
    package org.test.service;

    public class HelloWorld {
    public String sayHello(String name){

    return "Hello,my name is:"+name;
    }
    }

    在src目录下面新建一个META-INF文件夹,在META-INF文件夹下面新建一个services.xml文件,注意这里不是service.xml

    <service name="HelloWorldService" >
    <description>
    Please Type your service description here
    </description>
    <messageReceivers>
    <!-- 无返回值 -->
    <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
    <!-- 有返回值 -->
    <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <parameter name="ServiceClass">org.test.service.HelloWorld</parameter>
    </service>


    客户端:

    package testClient;
    import javax.xml.namespace.QName;
    import org.apache.axis2.AxisFault;
    import org.apache.axis2.addressing.EndpointReference;
    import org.apache.axis2.client.Options;
    import org.apache.axis2.rpc.client.RPCServiceClient;

    public class Client {
    public static void main(String[] args) throws AxisFault {
    // 使用RPC方式调用
    RPCServiceClient sc = new RPCServiceClient();
    Options option = sc.getOptions();
    // url
    EndpointReference targetEPR = new EndpointReference(
    "http://localhost:8888/axis2/services/HelloWorldService");
    option.setTo(targetEPR);
    //指定参数
    String[] reqArgs = new String[] {"monk"};
    //指定返回类型
    Class[] clazz = new Class[]{String.class};
    QName qname = new QName("http://service.test.org","sayHello");
    System.out.println(sc.invokeBlocking(qname,reqArgs, clazz)[0]);
    }
    }

    web.xml直接复制axis2里面的web.xml即可
    固定格式即可发布成功

  • 相关阅读:
    4年工作经验,多线程间的5种通信方式都说不出来,你敢信?
    lazarus安装控件遇到的问题
    从零开始配置 vim(7)——自动命令
    从零开始配置 vim(3)—— 键盘映射进阶
    从零开始匹配vim(1)——选项设置
    从零开始配置 vim(8)——文件类型检测
    从零开始配置 vim(4)——键盘映射的一些技巧
    从零开始配置 vim(5)——本地设置与全局设置
    从零开始配置 vim(6)——缩写
    从零开始匹配vim(2)——快捷键绑定
  • 原文地址:https://www.cnblogs.com/zfy-220/p/4977727.html
Copyright © 2020-2023  润新知