ゞ沉默是金ゞ

          魚離不開水,但是沒有說不離開哪滴水.
          posts - 98,comments - 104,trackbacks - 0

              上一篇寫了個最簡單的小例子,只是為了說明JAVA6開發Web Service很方便,這一篇稍微深入一點,寫個稍微有點代表性的小例子。

              依然使用 JAX-WS(jdk自帶的實現)方式,這次要在服務中使用一個復雜類型Customer,并實現附件傳輸的功能,這里使用MTOM的附件傳輸方式。MTOM(SOAP Message Transmission Optimization Mechanism)是SOAP 消息傳輸優化機制,MTOM可以在SOAP 消息中發送二進制數據。

          先來看Customer類:


          package org.duke.jaxws.server;

          import java.util.Date;

          import javax.activation.DataHandler;
          import javax.xml.bind.annotation.XmlAccessType;
          import javax.xml.bind.annotation.XmlAccessorType;
          import javax.xml.bind.annotation.XmlMimeType;
          import javax.xml.bind.annotation.XmlRootElement;

          @XmlRootElement(name 
          = "Customer")
          @XmlAccessorType(XmlAccessType.FIELD)
          public class Customer {
              
          private long id;
              
          private String name;
              
          private Date birthday;
              @XmlMimeType(
          "application/octet-stream")
              
          private DataHandler imageData;

              
          public long getId() {
                  
          return id;
              }

              
          public void setId(long id) {
                  
          this.id = id;
              }

              
          public String getName() {
                  
          return name;
              }

              
          public void setName(String name) {
                  
          this.name = name;
              }

              
          public Date getBirthday() {
                  
          return birthday;
              }

              
          public void setBirthday(Date birthday) {
                  
          this.birthday = birthday;
              }

              
          public DataHandler getImageData() {
                  
          return imageData;
              }

              
          public void setImageData(DataHandler imageData) {
                  
          this.imageData = imageData;
              }

          }

               MTOM 方式中要傳輸的附件必須使用javax.activation.DataHandler 類,還要注意必須在類上使用@XmlAccessorType(FIELD)注解,標注JAXB 在進行JAVA 對象與XML 之間進行轉換時只關注字段,而不關注屬性(getXXX()方法),否則發布Web 服務時會報出現了兩個imageData 屬性的錯誤,原因未知,可能是BUG。

              然后使用@XmlMimeType 注解標注這是一個附件類型的數據,這里我們標注imageData 是一個二進制文件,當然你也可以使用具體的MIME類型,譬如:image/jpg、image/gif 等,但要考慮到客戶端是否支持。

          接口類:


          package org.duke.jaxws.server;

          import javax.jws.WebParam;
          import javax.jws.WebService;
          import javax.jws.soap.SOAPBinding;
          import javax.xml.ws.soap.MTOM;

          @WebService(name 
          = "Hello")
          @SOAPBinding(style 
          = SOAPBinding.Style.RPC)
          @MTOM
          public interface Hello {
              
          public void printContext();

              
          public Customer selectCustomerByName(
                      @WebParam(name 
          = "customer") Customer customer);

              
          public Customer selectMaxAgeCustomer(Customer c1, Customer c2);
          }

              @MTOM注解用于開啟MTOM功能。

              @WebService注解中的name屬性標注在接口類上,可以指定wsdl中接口名稱,也就是生成的客戶端代碼中接口類的名字。

              @SOAPBinding(style = SOAPBinding.Style.RPC)指定SOAP消息樣式,有兩個枚舉值:SOAPBinding.Style.DOCUMENT(默認)和 SOAPBinding.Style.RPC,可以對比這兩種方式生成的wsdl會有所不同,而且生成的客戶端代碼也會有所不同。

          實現類:


          package org.duke.jaxws.server;

          import java.io.File;
          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.io.InputStream;
          import java.io.OutputStream;
          import java.text.ParseException;
          import java.text.SimpleDateFormat;
          import java.util.Date;
          import java.util.Set;
          import javax.activation.DataHandler;
          import javax.activation.FileDataSource;
          import javax.annotation.Resource;
          import javax.jws.WebService;
          import javax.xml.ws.WebServiceContext;
          import javax.xml.ws.handler.MessageContext;

          @WebService(serviceName 
          = "Hello", portName = "HelloPort", targetNamespace = "http://server.jaxws.duke.org/", endpointInterface = "org.duke.jaxws.server.Hello")
          public class HelloImpl implements Hello {

              @Resource
              
          private WebServiceContext context;

              @Override
              
          public void printContext() {
                  MessageContext ctx 
          = context.getMessageContext();
                  Set
          <String> set = ctx.keySet();
                  
          for (String key : set) {
                      System.out.println(
          "{" + key + "," + ctx.get(key) + "}");
                      
          try {
                          System.out.println(
          "key.scope=" + ctx.getScope(key));
                      } 
          catch (Exception e) {
                          System.out.println(key 
          + " is not exits");
                      }
                  }
              }

              @Override
              
          public Customer selectCustomerByName(Customer customer) {
                  
          if ("duke".equals(customer.getName())) {
                      customer.setId(
          1);
                      
          try {
                          customer.setBirthday(
          new SimpleDateFormat("yyyy-MM-dd")
                                  .parse(
          "1985-03-14"));
                      } 
          catch (ParseException e) {
                          e.printStackTrace();
                      }
                      customer.setImageData(
          new DataHandler(new FileDataSource(new File(
                              
          "c:" + File.separator + "duke.jpg"))));
                  } 
          else {
                      customer.setId(
          2);
                      customer.setBirthday(
          new Date());
                      customer.setImageData(
          new DataHandler(new FileDataSource(new File(
                              
          "c:" + File.separator + "origin.jpg"))));
                  }
                  
          return customer;
              }

              @Override
              
          public Customer selectMaxAgeCustomer(Customer c1, Customer c2) {
                  
          try {
                      
          // 輸出接收到的附件
                      System.out.println("c1.getImageData().getContentType()="
                              
          + c1.getImageData().getContentType());
                      InputStream is 
          = c2.getImageData().getInputStream();
                      OutputStream os 
          = new FileOutputStream("c:\\temp1.jpg");
                      
          byte[] bytes = new byte[1024];
                      
          int c;
                      
          while ((c = is.read(bytes)) != -1) {
                          os.write(bytes, 
          0, c);
                      }
                      os.close();

                      System.out.println(
          "c2.getImageData().getContentType()="
                              
          + c2.getImageData().getContentType());
                      is 
          = c2.getImageData().getInputStream();
                      os 
          = new FileOutputStream("c:\\temp2.jpg");
                      bytes 
          = new byte[1024];
                      
          while ((c = is.read(bytes)) != -1) {
                          os.write(bytes, 
          0, c);
                      }
                      os.close();
                  } 
          catch (IOException e) {
                      e.printStackTrace();
                  }

                  
          if (c1.getBirthday().getTime() > c2.getBirthday().getTime()) {
                      
          return c2;
                  } 
          else {
                      
          return c1;
                  }
              }
          }

              @WebService注解的serviceName屬性指定wsdl中service節點的name屬性值。portName屬性指定wsdl中 service節點下port節點name屬性值。targetNamespace屬性指定wsdl根節點definitions的 targetNamespace屬性值。endpointInterface屬性指定要發布的WebService接口的全路徑名,當實現類實現了多個接 口時,需要通過此屬性標注哪個類是WebService的服務端點接口(SEI)。

              在這個類中,通過@Resource注解注入了一個WebServiceContext對象,這個對象即是WebService的上下文環境。

           

          發布這個服務:


          package org.duke.jaxws.server;

          import javax.xml.ws.Endpoint;

          public class SoapServer {
              
          public static void main(String[] args) {
                  Endpoint.publish(
          "http://localhost:8080/Service/Hello"new HelloImpl());
              }
          }
          在命令行鍵入“wsimport -s src -p org.duke.jaxws.client -keep http://localhost:8080/Service/Hello?wsdl”生成客戶端代碼,拷貝到工程相應文件夾里,這時,就可以調用這個服務了:

          package org.duke.jaxws.test;

          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.io.InputStream;
          import java.io.OutputStream;
          import java.net.MalformedURLException;
          import java.net.URL;
          import java.text.ParseException;
          import java.text.SimpleDateFormat;
          import java.util.GregorianCalendar;

          import javax.activation.DataHandler;
          import javax.activation.DataSource;
          import javax.activation.FileDataSource;
          import javax.xml.datatype.DatatypeConfigurationException;
          import javax.xml.datatype.DatatypeFactory;
          import javax.xml.namespace.QName;

          import org.duke.jaxws.client.Customer;
          import org.duke.jaxws.client.Hello;
          import org.duke.jaxws.client.Hello_Service;

          public class SoapClient {
              
          public static void main(String[] args) throws ParseException,
                      MalformedURLException {
                  QName qName 
          = new QName("http://server.jaxws.duke.org/""Hello");
                  Hello_Service helloService 
          = new Hello_Service(new URL(
                          
          "http://localhost:8080/Service/Hello?wsdl"), qName);
                  Hello hello 
          = (Hello) helloService.getPort(Hello.class);

                  hello.printContext();

                  System.out.println(
          "########################################");

                  Customer customer 
          = new Customer();
                  customer.setName(
          "duke");
                  DataSource ds 
          = hello.selectCustomerByName(customer).getImageData()
                          .getDataSource();
                  String attachmentMimeType 
          = ds.getContentType();
                  System.out.println(attachmentMimeType);
                  
          try {
                      InputStream is 
          = ds.getInputStream();
                      OutputStream os 
          = new FileOutputStream(
                              
          "c:\\Shawn\\duke-real_temp.jpg");
                      
          byte[] bytes = new byte[1024];
                      
          int c;
                      
          while ((c = is.read(bytes)) != -1) {
                          os.write(bytes, 
          0, c);
                      }
                  } 
          catch (IOException e) {
                      e.printStackTrace();
                  }

                  System.out.println(
          "########################################");

                  Customer c1 
          = new Customer();
                  c1.setId(
          1);
                  c1.setName(
          "duke");
                  GregorianCalendar calendar 
          = (GregorianCalendar) GregorianCalendar
                          .getInstance();
                  calendar.setTime(
          new SimpleDateFormat("yyyy-MM-dd").parse("1985-03-14"));
                  
          try {
                      c1.setBirthday(DatatypeFactory.newInstance()
                              .newXMLGregorianCalendar(calendar));
                  } 
          catch (DatatypeConfigurationException e) {
                      e.printStackTrace();
                  }
                  c1.setImageData(
          new DataHandler(new FileDataSource(
                          
          "c:\\Shawn\\duke1.jpg")));

                  Customer c2 
          = new Customer();
                  c2.setId(
          2);
                  c2.setName(
          "abc");
                  calendar.setTime(
          new SimpleDateFormat("yyyy-MM-dd").parse("1986-03-14"));
                  
          try {
                      c2.setBirthday(DatatypeFactory.newInstance()
                              .newXMLGregorianCalendar(calendar));
                  } 
          catch (DatatypeConfigurationException e) {
                      e.printStackTrace();
                  }
                  c2.setImageData(
          new DataHandler(new FileDataSource(
                          
          "c:\\Shawn\\duke-real_temp.jpg")));

                  Customer c 
          = hello.selectMaxAgeCustomer(c1, c2);
                  System.out.println(c.getName());

              }
          }




          posted on 2012-06-27 14:06 ゞ沉默是金ゞ 閱讀(1277) 評論(2)  編輯  收藏 所屬分類: webservice

          FeedBack:
          # re: JAVA6開發WebService (二)——JAX-WS
          2012-06-27 15:41 | 路人甲
          setBirthday()這邊好像有問題哦。  回復  更多評論
            
          # re: JAVA6開發WebService (二)——JAX-WS[未登錄]
          2012-06-27 17:41 | ゞ沉默是金ゞ
          @路人甲
          什么問題呀  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 鱼台县| 庆安县| 鸡西市| 马鞍山市| 庆元县| 梁河县| 巴彦县| 乐清市| 饶河县| 长宁区| 东海县| 永靖县| 呈贡县| 汨罗市| 东安县| 漳州市| 长白| 会同县| 阜新市| 雷州市| 汉寿县| 盘山县| 稷山县| 沂南县| 北川| 兰西县| 乐昌市| 天水市| 安吉县| 平顶山市| 志丹县| 汉沽区| 灌南县| 平潭县| 白山市| 望奎县| 北川| 冕宁县| 平果县| 乳山市| 绥滨县|