posts - 78, comments - 34, trackbacks - 0, articles - 1
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

                 WebService課程由徐培成老師主講,依然發(fā)揚(yáng)傳智播客的特點(diǎn)——深入理論和實(shí)踐。今天老徐講的原理的專業(yè)術(shù)語(yǔ)比較多,但我只做WebService的應(yīng)用總結(jié)。如果你的JavaJavaWeb基礎(chǔ)好些,我想你看到WebService的應(yīng)用,自然就能想到它的實(shí)現(xiàn)原理。

           

                 WebService又是一種高級(jí)應(yīng)用,與之前學(xué)習(xí)的Struts、Spring、Hibernate等框架不同。WebService是面向服務(wù)的架構(gòu)(SOA),看起來(lái)像是比SSH框架要大。那么它到底是做什么用的?什么才是面向服務(wù)的架構(gòu)?

           

                 讓我們來(lái)看一種需求,集團(tuán)公司可能具有多種WEB應(yīng)用。比如,前年開發(fā)了個(gè)進(jìn)銷存系統(tǒng)、去年開發(fā)了一個(gè)ERP、今年又開發(fā)了一個(gè)OA?,F(xiàn)在這家集團(tuán)公司需要將這三個(gè)系統(tǒng)整合,難道需要重新編碼將它們整合嗎?而這三個(gè)系統(tǒng)又是用不同語(yǔ)言編寫的,這種成本對(duì)公司來(lái)說(shuō)無(wú)疑是一種浪費(fèi)。WebService可以很好的解決這種需求。

           

                 WebService是可以進(jìn)行跨語(yǔ)言、跨平臺(tái)、分布式系統(tǒng)間整合的方案,WebService像是一條線將這些系統(tǒng)穿起來(lái)——企業(yè)服務(wù)總線(ESB)。WebService使用簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(SOAP)使用http協(xié)議傳輸xml數(shù)據(jù)(xml是最常用的,也有其他格式數(shù)據(jù)。)來(lái)完成系帶間的整合。

           

                 什么是整合?當(dāng)然是功能和數(shù)據(jù)的整合,也就是一個(gè)系統(tǒng)可以調(diào)用另一個(gè)系統(tǒng)的WebService接口來(lái)完成數(shù)據(jù)的交互。這樣我們就需要知道,提供WebService服務(wù)功能的應(yīng)用公開了哪些接口,我們可以通過(guò)WebService描述文檔(WSDL)得知。WSDL不需要我們手動(dòng)編寫,JavaWebService實(shí)現(xiàn)可以為我們自動(dòng)生成。JDK1.6新增支持WebService,但還不夠成熟。所以我們使用Apache第三方開源組織提供的WebService實(shí)現(xiàn)——Axis

           

                  Axis的當(dāng)前版本是Java版本,它的C++版本正在開發(fā)中。Axis是一個(gè)功能強(qiáng)大的soap引擎,關(guān)于它們的詳細(xì)信息在此就不做介紹了。下面,讓我們來(lái)編寫一個(gè)例子程序,以了解WebService的應(yīng)用流程。

           

          一、編寫支持WebServiceWEB應(yīng)用

                 1.創(chuàng)建工程

                 Project Name:TestWebService

                 Target runtime:Apache Tomcat V6.0

                 其他的默認(rèn)

           

                 2.添加AxisJar

                 axisjar包目錄lib子目錄中的所有jar文件添加到工程中。

           

                 3.配置web.xml

                 axiswebapps子目錄中有一個(gè)axisWeb應(yīng)用,我們直接使用它的web.xml文件內(nèi)容。

           

                 4.添加功能類

          package com.changcheng.webservice;

           

          import com.changcheng.webservice.entity.User;

           

          public class TestWebService {

                   /**

                    * 基本數(shù)據(jù)的遠(yuǎn)程

                    * @param words

                    * @return

                    */

                   public String hello(String words) {

                             return "WebService say: hello " + words;

                   }

                  

                   /**

                    *

                    * @param user

                    * @return

                    */

                   public User update(User user){

                             System.out.println(user);

                             user.setName("new_name_haha");

                             user.setPassword("new_password_123");

                             return user;

                   }

          }

                 其中使用到的User實(shí)體類在此就不列出了。

           

                 5.部署WebService

                 我們可以將需要公開的類文件復(fù)制到WEB應(yīng)用目錄下,并修改文件后綴名為jws。把類文件更名并放到WEB目錄下?這樣做并不好,它被暴露了。

           

                 所以在這里我們使用一個(gè)常量的部署方法,在工程中(根目錄)添加一個(gè)deploy.wsdd文件:

          <!-- 部署描述符 -->

          <deployment xmlns="http://xml.apache.org/axis/wsdd/"

              xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

              <!-- 定義處理器 -->

              <handler name="track" type="java:com.changcheng.webservice.handler.LogHandler">

                  <parameter name="filename" value="d:/MyService.log" />

              </handler>

           

              <!-- 定義服務(wù),并且在服務(wù)中使用處理器 -->

              <service name="HandlerService" provider="java:RPC">

                  <requestFlow>

                      <handler type="track" />

                  </requestFlow>

                  <parameter name="className" value="com.changcheng.webservice.TestWebService" />

                  <parameter name="allowedMethods" value="*" />

              </service>

          </deployment>

           

                 首先將工程部署到Tomcat服務(wù)器上,并啟動(dòng)Tomcat服務(wù)器。然后在工程上右鍵-->Run As...-->Run Configurations...,新建一個(gè)JavaApplication。在main頁(yè)面中,project指定為我們的TestWebServiceMainClass指定為org.apache.axis.client.AdminClient。在Arguments頁(yè)面下設(shè)置Program arguments-l http://localhost:8080/TestWebService/servlet/AxisServlet deploy.wsdd。點(diǎn)擊Run按鈕。

           

                 完成上面的操作后,AdminClient會(huì)為我們部署在TomcatTestWebServiceWEB-INF目錄下生成一個(gè)server-config.wsdd文件,它是提供給Axis使用的配置文件。

           

                 我們需要將向server-config.wsdd文件的HandlerService元素添加一個(gè)beanMapping子元素:

           <service name="HandlerService" provider="java:RPC">

            <requestFlow>

             <handler type="track"/>

            </requestFlow>

            <parameter name="allowedMethods" value="*"/>

            <parameter name="className" value="com.changcheng.webservice.TestWebService"/>

            <beanMapping qname="myNS:User" xmlns:myNS="urn:pojo:ws:changcheng:com" languageSpecificType="java:com.changcheng.webservice.entity.User"/>

           </service>

           

                 其中的添加的處理器是WebService的一項(xiàng)功能,在遠(yuǎn)程調(diào)用指定的方法時(shí),會(huì)先由處理器進(jìn)行處理。

          package com.changcheng.webservice.handler;

           

          import java.io.FileOutputStream;

          import java.io.PrintWriter;

          import java.text.SimpleDateFormat;

          import java.util.Date;

          import org.apache.axis.AxisFault;

          import org.apache.axis.Handler;

          import org.apache.axis.MessageContext;

          import org.apache.axis.handlers.BasicHandler;

           

          /**

           * 日志處理器,類似于web中的filter

           */

          public class LogHandler extends BasicHandler {

                   private static final long serialVersionUID = 3227593680689235885L;

           

                   public void invoke(MessageContext arg0) throws AxisFault {

                             try {

                                      Handler serviceHandler = arg0.getService();

                                      // 提取配置文件(server-config)的配置信息

                                      String filename = (String) getOption("filename");

                                      //

                                      FileOutputStream fos = new FileOutputStream(filename);

                                      PrintWriter writer = new PrintWriter(fos);

                                      // getOption()類似于request.getAttribute("")

                                      // 獲得在handler對(duì)象中存放的訪問(wèn)次數(shù)

                                      Integer numAccesses = (Integer) serviceHandler

                                                         .getOption("accesses");

                                      // 如果首次訪問(wèn)

                                      if (numAccesses == null)

                                               numAccesses = new Integer(0);

                                      // 次數(shù) ++

                                      numAccesses = new Integer(numAccesses.intValue() + 1);

                                      //

                                      Date date = new Date();

                                      // 對(duì)日期進(jìn)行格式化

                                      SimpleDateFormat sdf = new SimpleDateFormat();

                                      sdf.applyPattern("yyyy-MM-dd hh:mm:ss");

                                      String result = sdf.format(date) + ": service "

                                                         + arg0.getTargetService() + " accessed " + numAccesses

                                                         + " time(s).";

                                      // 將訪問(wèn)次數(shù)寫入到handler對(duì)象中(request.setAttribute(..));

                                      serviceHandler.setOption("accesses", numAccesses);

                                      writer.println(result);

                                      writer.close();

                             } catch (Exception e) {

                                      throw AxisFault.makeFault(e);

                             }

                   }

          }

           

           

          二、編寫運(yùn)程調(diào)用WebServiceWEB應(yīng)用的Java工程

                

                 1.添加上面WEB工程中所用到的Axisjar

           

                 2.編寫測(cè)試類:

          package com.changcheng.client;

           

          import java.net.URL;

          import javax.xml.namespace.QName;

          import org.apache.axis.client.Call;

          import org.apache.axis.client.Service;

          import org.apache.axis.encoding.ser.BeanDeserializerFactory;

          import org.apache.axis.encoding.ser.BeanSerializerFactory;

          import org.junit.Test;

          import com.changcheng.webservice.entity.User;

           

          public class TestMain {

           

                   // 測(cè)試一般方法

                   @Test

                   public void hello() throws Exception{

                             Service s = new Service();

                             Call call = (Call) s.createCall();

                             String url = "http://localhost:8080/TestWebService/services/HandlerService";

                             call.setTargetEndpointAddress(new URL(url));

                             call.setOperationName("hello");

                             Object res = call.invoke(new Object[] { "itcast" });

                             System.out.println(res);

                   }

                  

                  

                   // 測(cè)試實(shí)體方法

                   @Test

                   public void update() throws Exception {

                             Service s = new Service();

                             Call call = (Call) s.createCall();

                             String url = "http://localhost:8080/TestWebService/services/HandlerService";

                             call.setTargetEndpointAddress(new URL(url));

                             call.setOperationName("update");

                             // 客戶端同樣需要對(duì)pojo進(jìn)行注冊(cè).以確保也能夠進(jìn)行序列化和反序列化.

                             Class clazz = User.class;

                             // 限定名必須和服務(wù)器端注冊(cè)限定名保持一致,嚴(yán)格區(qū)分大小寫

                             QName qname = new QName("urn:pojo:ws:changcheng:com", "User");

                             // 注冊(cè)類型映射,以便傳遞pojo對(duì)象

                             call.registerTypeMapping(clazz, qname, new BeanSerializerFactory(clazz,

                                               qname), new BeanDeserializerFactory(clazz, qname));

                             //

                             User user = new User();

                             user.setName("itcast");

                             user.setPassword("abcd");

                             Object res = call.invoke(new Object[] { user });

                             System.out.println(res);

                   }

          }

           

                 3.運(yùn)行測(cè)試

           

                 總結(jié)完成!

           


          評(píng)論

          # re: 2010-03-08 傳智播客—WebService(一)  回復(fù)  更多評(píng)論   

          2010-03-15 11:56 by 虎嘯龍吟
          很好。需要這樣的step by step文檔。

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 如东县| 竹山县| 巢湖市| 乌拉特前旗| 阳西县| 玉林市| 平定县| 资源县| 额济纳旗| 黄大仙区| 南康市| 鹤壁市| 轮台县| 汤原县| 德阳市| 沾化县| 罗田县| 华蓥市| 肥西县| 桓台县| 河源市| 类乌齐县| 威宁| 山阳县| 澄城县| 日照市| 合肥市| 黑龙江省| 泗阳县| 岱山县| 吕梁市| 榆中县| 南汇区| 合作市| 上高县| 会同县| 湄潭县| 明水县| 含山县| 获嘉县| 松滋市|