WebService学习二(CXF、Ajax)

其实在实际中,我们自定义ws的可能性比较小,一般都是去调用已有的ws较多,除非项目需要发布一个ws。但是为了更好的理解ws,这一篇博文主要来总结一下如何自定义ws,然后如何去调用自定义的ws,内容比较基础,完全针对小白。

1. 自定义webservice

1.1 原生态jdk定义

  使用jdk自定义一个ws只需要做两件事:一是使用注解@WebService,二是调用Endpoint类的静态方法publish创建一个服务端点即可。如下:

<span style="color:#000000"><code class="language-java"><span style="color:#880000">/**
 *<span style="color:#4f4f4f"> @Description</span> 自定义ws,jdk1.7版本及以上才支持soap1.2
 *<span style="color:#4f4f4f"> @author</span> Ni Shengwu
 *
 */</span>
<span style="color:#9b859d">@WebService</span> <span style="color:#880000">//默认静态方法是不能发不成ws服务的</span>
<span style="color:#000088">public</span> <span style="color:#000088">class</span> <span style="color:#4f4f4f">MyWebService</span> {

    <span style="color:#880000">//提供一个方法,供下面测试用的</span>
    <span style="color:#000088">public</span> String <span style="color:#009900">sayHello</span>(String name) {
        <span style="color:#000088">return</span> name + <span style="color:#009900">" 你好!"</span>;
    }

    <span style="color:#000088">public</span> <span style="color:#000088">static</span> <span style="color:#000088">void</span> <span style="color:#009900">main</span>(String[] args) {
        <span style="color:#880000">// 一个端口可以发布多个ws服务,所以后面还有 /+服务名</span>
        String address = <span style="color:#009900">"http://192.168.1.105:6666/ws"</span>;
        String address2 = <span style="color:#009900">"http://192.168.1.105:6666/ws2"</span>;
        <span style="color:#880000">// 创建一个服务端点</span>
        Endpoint.publish(address, <span style="color:#000088">new</span> MyWebService());
        Endpoint.publish(address2, <span style="color:#000088">new</span> MyWebService());
        System.out.println(<span style="color:#009900">"访问WSDL的地址为:"</span> + address + <span style="color:#009900">"?WSDL"</span>);
        System.out.println(<span style="color:#009900">"访问WSDL的地址为:"</span> + address2 + <span style="color:#009900">"?WSDL"</span>);
    }
}</code></span>

  这个192.168.1.105是我的ip地址,6666是自己设定的端口号,后面为啥还要跟个名称ws呢?因为一个端口可以发布多个ws服务,所以可以自己起个名儿,我这里创建了两个ws服务地址,分别命名为ws和ws2。然后通过调用Endpoint类的静态方法publish创建服务端点,传进去刚刚定义好的ws服务地址和自定义ws的类即可。后面两个输出地址是用来根据WSDL生成java代码方便用的。 
  这样的话,一个ws就定义好了,运行一下,控制台会输出两个地址,分别在浏览器中输入这两个地址就会显示两个相同的xml文档,我们待会儿根据这个WSDL来生成java代码。

1.2 使用CXF自定义ws

  CXF是ws的一个框架,使用很方便,想要更多的了解CXF可以去百度或者谷歌一下。为了更加规范点,我将需要发布为ws的类单独写出来,并抽取接口,如下:

<span style="color:#000000"><code class="language-java"><span style="color:#880000">//这是接口</span>
<span style="color:#9b859d">@WebService</span>
<span style="color:#000088">public</span> <span style="color:#000088">interface</span> <span style="color:#4f4f4f">HelloWorld</span> {

    <span style="color:#000088">public</span> String <span style="color:#009900">sayHello</span>(String str);
}

<span style="color:#880000">//这是实现类</span>
<span style="color:#9b859d">@WebService</span>
<span style="color:#000088">public</span> <span style="color:#000088">class</span> <span style="color:#4f4f4f">HelloWorldImpl</span> <span style="color:#000088">implements</span> <span style="color:#4f4f4f">HelloWorld</span>{

    <span style="color:#000088">public</span> String <span style="color:#009900">sayHello</span>(String str) {
        <span style="color:#000088">return</span> <span style="color:#009900">"Hello"</span> + str;
    }

}</code></span>

这里建立的是maven工程,porm.xml需要导入相关的jar包,我导入的是目前最新版的3.1.6。如下:

<span style="color:#000000"><code class="language-xml"><span style="color:#006666"><<span style="color:#4f4f4f">project</span> <span style="color:#4f4f4f">xmlns</span>=<span style="color:#009900">"http://maven.apache.org/POM/4.0.0"</span> <span style="color:#4f4f4f">xmlns:xsi</span>=<span style="color:#009900">"http://www.w3.org/2001/XMLSchema-instance"</span> <span style="color:#4f4f4f">xsi:schemaLocation</span>=<span style="color:#009900">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span>></span>
  <span style="color:#006666"><<span style="color:#4f4f4f">modelVersion</span>></span>4.0.0<span style="color:#006666"></<span style="color:#4f4f4f">modelVersion</span>></span>
  <span style="color:#006666"><<span style="color:#4f4f4f">groupId</span>></span>webservice<span style="color:#006666"></<span style="color:#4f4f4f">groupId</span>></span>
  <span style="color:#006666"><<span style="color:#4f4f4f">artifactId</span>></span>WS_Server<span style="color:#006666"></<span style="color:#4f4f4f">artifactId</span>></span>
  <span style="color:#006666"><<span style="color:#4f4f4f">version</span>></span>0.0.1-SNAPSHOT<span style="color:#006666"></<span style="color:#4f4f4f">version</span>></span>

  <span style="color:#006666"><<span style="color:#4f4f4f">dependencies</span>></span>

    <span style="color:#006666"><<span style="color:#4f4f4f">dependency</span>></span>
        <span style="color:#006666"><<span style="color:#4f4f4f">groupId</span>></span>org.apache.cxf<span style="color:#006666"></<span style="color:#4f4f4f">groupId</span>></span>
        <span style="color:#006666"><<span style="color:#4f4f4f">artifactId</span>></span>cxf-rt-frontend-jaxws<span style="color:#006666"></<span style="color:#4f4f4f">artifactId</span>></span>
        <span style="color:#006666"><<span style="color:#4f4f4f">version</span>></span>3.1.6<span style="color:#006666"></<span style="color:#4f4f4f">version</span>></span>
    <span style="color:#006666"></<span style="color:#4f4f4f">dependency</span>></span>

    <span style="color:#006666"><<span style="color:#4f4f4f">dependency</span>></span>
        <span style="color:#006666"><<span style="color:#4f4f4f">groupId</span>></span>org.apache.cxf<span style="color:#006666"></<span style="color:#4f4f4f">groupId</span>></span>
        <span style="color:#006666"><<span style="color:#4f4f4f">artifactId</span>></span>cxf-core<span style="color:#006666"></<span style="color:#4f4f4f">artifactId</span>></span>
        <span style="color:#006666"><<span style="color:#4f4f4f">version</span>></span>3.1.6<span style="color:#006666"></<span style="color:#4f4f4f">version</span>></span>
    <span style="color:#006666"></<span style="color:#4f4f4f">dependency</span>></span>

    <span style="color:#006666"><<span style="color:#4f4f4f">dependency</span>></span>
        <span style="color:#006666"><<span style="color:#4f4f4f">groupId</span>></span>org.apache.cxf<span style="color:#006666"></<span style="color:#4f4f4f">groupId</span>></span>
        <span style="color:#006666"><<span style="color:#4f4f4f">artifactId</span>></span>cxf-rt-transports-http-jetty<span style="color:#006666"></<span style="color:#4f4f4f">artifactId</span>></span>
        <span style="color:#006666"><<span style="color:#4f4f4f">version</span>></span>3.1.6<span style="color:#006666"></<span style="color:#4f4f4f">version</span>></span>
    <span style="color:#006666"></<span style="color:#4f4f4f">dependency</span>></span>

  <span style="color:#006666"></<span style="color:#4f4f4f">dependencies</span>></span>
<span style="color:#006666"></<span style="color:#4f4f4f">project</span>></span></code></span>

接下来就是创建ws了,如下:

<span style="color:#000000"><code class="language-java"><span style="color:#000088">public</span> <span style="color:#000088">class</span> <span style="color:#4f4f4f">Server</span> {

    <span style="color:#000088">public</span> <span style="color:#000088">static</span> <span style="color:#000088">void</span> <span style="color:#009900">main</span>(String[] args) {
        System.out.println(<span style="color:#009900">"web service start"</span>);
        HelloWorld implementor = <span style="color:#000088">new</span> HelloWorldImpl();
        String address = <span style="color:#009900">"http://192.168.1.105/ws"</span>;

        JaxWsServerFactoryBean factoryBean = <span style="color:#000088">new</span> JaxWsServerFactoryBean();
        factoryBean.setAddress(address); <span style="color:#880000">// 设置暴露地址</span>
        factoryBean.setServiceClass(HelloWorld.class); <span style="color:#880000">// 接口类</span>
        factoryBean.setServiceBean(implementor); <span style="color:#880000">// 设置实现类</span>
        factoryBean.create(); <span style="color:#880000">// 创建webservice接口</span>
        System.out.println(<span style="color:#009900">"web service started"</span>);
        System.out.println(<span style="color:#009900">"请求地址为为:"</span> + address + <span style="color:#009900">"?WSDL"</span>);
    }
}</code></span>

这样就使用CXF创建好了ws了,下面就是调用这个ws服务了,下面的调用我用的是上面原生态jdk生成的ws服务,其实都一样的。

2. 调用自定义的webservice

2.1 使用普通java程序调用

  刚刚已经生成了对应的WSDL了,在调用自定义的ws前,我们需要先通过解析这个WSDL,然后生成一些Java代码,可以看成是我们自定义ws的API。打开命令行,输入 
wsimport -s . -p ws.client.d http://192.168.1.105:6666/ws?WSDL 
  就能生成一个目录ws/client/d/,以及目录中的一些class文件和java文件,删掉class文件,然后拷贝ws目录,直接贴到工程另一个工程中,如下: 
这里写图片描述 
  里面框框圈的都是自定义ws相关的API,然后自己写一个_Main类来调用自定义ws,如下:

<span style="color:#000000"><code class="language-java"><span style="color:#880000">/**
 *<span style="color:#4f4f4f"> @Description</span> 调用自己发布的ws服务
 *<span style="color:#4f4f4f"> @author</span> Ni Shengwu
 *
 */</span>
<span style="color:#000088">public</span> <span style="color:#000088">class</span> <span style="color:#4f4f4f">_Main</span> {

    <span style="color:#000088">public</span> <span style="color:#000088">static</span> <span style="color:#000088">void</span> <span style="color:#009900">main</span>(String[] args) {
        <span style="color:#880000">// 获取ws服务名称(获取一个ws服务)</span>
        MyWebServiceService service = <span style="color:#000088">new</span> MyWebServiceService();
        <span style="color:#880000">//获取服务的类型,有get post soap1.1 soap1.2 jdk1.7及以上才支持soap1.2</span>
        MyWebService port = service.getMyWebServicePort();
        <span style="color:#880000">//调用服务提供的方法</span>
        System.out.println(port.sayHello(<span style="color:#009900">"hello"</span>));
    }   
}</code></span>

  根据上面的代码,即传入一个hello去调用自定义ws中的sayHello方法,所以控制台会打印出 “hello 你好!”。这样自定义ws以及调用就完成了。

2.2 使用Ajax调用  

  使用Ajax调用的话,流程也很简单,从前台发送Ajax请求,然后调用ws服务,再将结果返回给前台。但是Ajax不支持跨域调用,也就是说我们发布的ws服务,如http://192.168.1.105:6666/ws是不行的,Ajax要想正常调用必须通过wsimport命令转化的java bean,换句话说,我们需要在中间加上一个servlet(或者struts,springmvc),在servlet中调用ws服务,把数据返回到前台。写个demo如下: 
servlet:

<span style="color:#000000"><code class="language-java"><span style="color:#000088">public</span> <span style="color:#000088">class</span> <span style="color:#4f4f4f">_MyServlet</span> <span style="color:#000088">extends</span> <span style="color:#4f4f4f">HttpServlet</span> {


    <span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">doGet</span>(HttpServletRequest request, HttpServletResponse response)
            <span style="color:#000088">throws</span> ServletException, IOException {

        response.setCharacterEncoding(<span style="color:#009900">"UTF-8"</span>);
        request.setCharacterEncoding(<span style="color:#009900">"UTF-8"</span>);
        String name = request.getParameter(<span style="color:#009900">"name"</span>);
        <span style="color:#880000">// 创建ws服务</span>
        MyWebServiceService ws = <span style="color:#000088">new</span> MyWebServiceService();
        MyWebService port = ws.getMyWebServicePort();
        String result = port.sayHello(name);

        <span style="color:#880000">// 返回结果</span>
        response.getWriter().write(result);
    }

    <span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">doPost</span>(HttpServletRequest request, HttpServletResponse response)
            <span style="color:#000088">throws</span> ServletException, IOException {

        doGet(request, response);
    }

}</code></span>

这个servlet映射的url为/MyServlet。 
jsp:

<span style="color:#000000"><code class="language-jsp"><%@ page language=<span style="color:#009900">"java"</span> import=<span style="color:#009900">"java.util.*"</span> pageEncoding=<span style="color:#009900">"UTF-8"</span>%>

<span style="color:#4f4f4f"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"></span>
<span style="color:#006666"><<span style="color:#4f4f4f">html</span>></span>
  <span style="color:#006666"><<span style="color:#4f4f4f">head</span>></span>  
  <span style="color:#006666"><<span style="color:#4f4f4f">script</span> <span style="color:#4f4f4f">type</span>=<span style="color:#009900">"text/javascript"</span> <span style="color:#4f4f4f">src</span>=<span style="color:#009900">"jquery-1.3.js"</span>></span><span style="color:#006666"></<span style="color:#4f4f4f">script</span>></span> 
  <span style="color:#006666"></<span style="color:#4f4f4f">head</span>></span> 
  <span style="color:#006666"><<span style="color:#4f4f4f">script</span> <span style="color:#4f4f4f">type</span>=<span style="color:#009900">"text/javascript"</span>></span>
    $(<span style="color:#000088">function</span><span style="color:#4f4f4f">()</span> {
        $(<span style="color:#009900">"#btn"</span>).click(<span style="color:#000088">function</span><span style="color:#4f4f4f">()</span> {
            $.post(<span style="color:#009900">"MyServlet"</span>, {name:$(<span style="color:#009900">"#txt"</span>).val()}, <span style="color:#000088">function</span><span style="color:#4f4f4f">(msg)</span> {
                alert(msg);
            }, <span style="color:#009900">"text"</span>);
        });
    })
  <span style="color:#006666"></<span style="color:#4f4f4f">script</span>></span>


  <span style="color:#006666"><<span style="color:#4f4f4f">body</span>></span>
    <span style="color:#006666"><<span style="color:#4f4f4f">input</span> <span style="color:#4f4f4f">type</span>=<span style="color:#009900">"text"</span> <span style="color:#4f4f4f">id</span>=<span style="color:#009900">"txt"</span> /></span>
    <span style="color:#006666"><<span style="color:#4f4f4f">input</span> <span style="color:#4f4f4f">type</span>=<span style="color:#009900">"button"</span> <span style="color:#4f4f4f">id</span>=<span style="color:#009900">"btn"</span> <span style="color:#4f4f4f">value</span>=<span style="color:#009900">"ajax调用ws服务演示"</span>></span>
  <span style="color:#006666"></<span style="color:#4f4f4f">body</span>></span>
<span style="color:#006666"></<span style="color:#4f4f4f">html</span>></span></code></span>

  jsp中通过发送Ajax请求,将输入的值带给servlet,然后在servlet中获取该值,调用ws获取结果返回给前台显示,完成Ajax调用。

猜你喜欢

转载自blog.csdn.net/u014252478/article/details/82590118