Web Service

參考資料:html

1. http://blog.sina.com.cn/s/blog_a00f56270102w2e2.html - WebService簡介+只用JDK實現java

2. http://www.cnblogs.com/linxiaoyang/p/4167016.html - JDK實現+Intellij輔助web

3. http://www.cnblogs.com/wenjingu/p/4094180.html - WebService開發彙總spring

4. 推薦: http://blog.csdn.net/rongbo_j/article/details/50958111瀏覽器

從名字上看,以前一直覺得Web Service就是一般提的Web應用,畢竟兩者都是對外提供web服務的。但實際上仍是有區別的,區別爲Web Service和Web Application比較合適。spring-mvc

Web Service更趨向於後臺服務。mvc

實現Web Service的框架有不少,好比JAX-WS, Axis, Axis2, CXF等,有代碼優先的也有文檔優先的。app

本着簡單+功能強的原則,這裏不涉及具體細節,好比如何編寫wsdl(實際上也不會,也不必會這個),只是單純的實現須要的功能便可。框架

------------------------------------------------   分割線   ------------------------------------------------jsp

Part 1: JDK實現Web Service

JDK提供JAX-WS(Java API for XML Web Service)來實現Web Service。至關之簡單。

直接上代碼!

1. server端

  編寫Web Service

@WebService
public interface HelloJWS {

    @WebMethod
    public String execute(String msg);
}
@WebService(endpointInterface = "server.com.cnblogs.helloyz.HelloJWS")
public class HelloJWSImpl implements HelloJWS {

    @Override
    public String execute(String msg) {
        System.out.println("Welcome! " + msg);
        return "success";
    }
}

  對外發布

public class PublishService {

    public static void main(String[] args) {
        HelloJWS jws = new HelloJWSImpl();
        String address = "http://localhost:9000/ws/HelloJWS";
        Endpoint.publish(address,jws);
        System.out.println("publish success");
    }
}

運行main函數,Web Service發佈成功!是否是很簡單?!

瀏覽器訪問發佈地址:http://localhost:9000/ws/HelloJWS/?wsdl,能夠獲得以下wsdl文檔。

PS: wsdl文檔語法不懂,也不想學這個。

以上方式就屬於所謂的"代碼優先",根據代碼生成wsdl文件。而"文檔優先"方式在適應需求變化,維護等方面要優於"代碼優先"。

不過,不必非採用"文檔優先",只要功能實現就OK,何況不用專門編寫wsdl(也曾想經過xsd生成wsdl,但實際上還要專門編寫xsd...)。

2. client端

爲了方便,將server端和client端弄到一個工程裏了。如下幾步是在建立的client包裏操做。

  生成本地Web Service代碼

  調出命令行窗口,執行wsimport -s . http://localhost:9000/ws/HelloJWS/?wsdl,生成本地client代碼。

  編寫代碼調用Web Service

public class Client {
    public static void main(String[] args) {
        HelloJWSImplService service = new HelloJWSImplService();
        HelloJWS jws = service.getHelloJWSImplPort();
        String result = jws.execute("message from MARS");
        System.out.println("client execute status: " + result);
    }
}

運行main,結果以下:

   

 Source Code get here

 

Part 2: Web容器發佈Web Service

有很多人認爲單純用JDK實現WebService,不便於後期的管理和維護,並且可擴展性也不好。不敢苟同。

根據上面的Demo可知,web service的編寫和發佈都是能夠單獨集中在一塊兒的。好比,在一個@WebService裏,你能夠實現多個@WebMethod;在一個main方法裏,你能夠集中發佈多個Web Service。因此不存在上面提到的問題。

使用Web容器來發布Web Service,我的以爲主要仍是考慮到Web Service做爲Web服務的一種,理應由Web容器來統一管理,跟隨主流。另外,相比於JDK那種經過main方法來發布服務,仍是利用容器管理更穩定些。

廢話少說,直述build過程:(利用Intellij IDEA 14.1.4

1. server端

 

新建WebServices工程,下載21個jar包,同時生成server sample code。包結構以下:

21個jar包在lib中。將Part 1的server端代碼放到src下。設置Tomcat爲WebService容器,並嘗試發佈。

大體梳理下WebService發佈過程:

  1. Tomcat啓動,加載web.xml.

    實例化監聽WSServletContextListener。此過程當中加載/WEB-INF/sun-jaxws.xml

    web.xml

    <listener>
        <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
    </listener>
    <servlet>
        <description>JAX-WS endpoint</description>
        <display-name>WSServlet</display-name>
        <servlet-name>WSServlet</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>WSServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>

    sun-jaxws.xml 

<endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'>

        <endpoint
                name='HelloWorld'
                implementation='com.cnblogs.helloyz.HelloWorld'
                url-pattern='/services/HelloWorld'/>
</endpoints>

  

  接着初始化WSServlet,用於攔截/services/*請求(界定WebService和WebApplication)

  2. 根據加載的sun-jaxws.xml,建立用於發佈WebService的endpoint(此處用於集中管理endpoint)。

2. client端

新建WebServices Client工程,下載21個jar包。和Part 1相似,生成client code。

Source Code get here

 

Part 3: Web Service與Spring集成

又一參考:http://www.springbyexample.org/examples/simple-spring-web-services.html

原本想按照Spring-WS的文檔,實際操做遍。可是通過前先後後一天半的時間發現怎麼都繞不過「文檔優先」的Web Service發佈方式。原覺得經過使用@EndPoint和@PayloadRoot就能夠,但仍是須要預先定義好的wsdl。

同時也發現GitHub上託管的Spring Web Service項目大部分代碼已經兩年多沒更新過,網上的討論也不多,足以說明Spring Web Service並不怎麼經常使用。

不過Web Service和Spring的整合,仍是有必定必要的,好比將Web Service同Spring MVC整合在一塊兒,讓Web Service調用Spring MVC的某些功能。

 

用IDEA建立Spring MVC工程。調整後的結構以下(忽略target)。

 

將Web Service整合到Spring MVC中就要保證兩者均能正常工做,同時能夠交互(好比Web Service調用Spring MVC裏的功能)。

列出一些關鍵點:

  1. spring-mvc-servlet.xml

 1 <context:component-scan base-package="com.cnblogs.helloyz"/>
 2 
 3        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 4               <property name="prefix" value="/WEB-INF/pages/"/>
 5               <property name="suffix" value=".jsp"/>
 6        </bean>
 7 
 8        <bean id="jaxWsServiceExporter" class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
 9               <property name="baseAddress" value="http://localhost:9000/services/"/>
10        </bean>

  在這個xml裏添加SimpleJaxWsServiceExporter,用於發佈Web Service。

  2. HelloWorld.java

@Component
@WebService(serviceName = "hello-service")
public class HelloWorld {

  @Autowired private HelloController helloController;

  @WebMethod
  public String sayHelloWorldFrom(String from) {
    String result = "Hello, world, from " + from;
    System.out.println(result);
    return result;
  }

  @WebMethod
  public String sayHello(String from, String to) {
    String result = from + ":\"Hello\", " + to;
    System.out.println(result);
    System.out.println("------------------");
    helloController.prepareForWebService(); return result;
  }

}

全部WebService必須由Spring容器管理,也才能經SimpleJaxWsServiceExporter對外發布。

此外,注入helloController來驗證Web Service同Spring MVC的交互。

 

啓動Tomcat進行驗證。

1. Spring MVC功能正常。

2. 訪問http://localhost:9000/services/hello-service?wsdl,Web Service發佈成功。

3. 同Part 1,編寫client端代碼。

Client.java
public class Client {
    public static void main(String[] args) {
        HelloService helloService = new HelloService();
        HelloWorld helloWorld = helloService.getHelloWorldPort();
        String result = helloWorld.sayHello("Mars", "Earth");
        System.out.println(result);
        System.out.println("-------------");
        result = helloWorld.sayHelloWorldFrom("Mars");
        System.out.println(result);
    }
}

運行main,結果以下: 

     

Web Service功能正常;Web Service調用Spring MVC功能成功。

Source Code get here

 

Done!

相關文章
相關標籤/搜索