<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ゞ沉默是金ゞ

    魚離不開水,但是沒有說不離開哪滴水.
    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 ゞ沉默是金ゞ 閱讀(1275) 評論(2)  編輯  收藏 所屬分類: webservice

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

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


    網站導航:
     
    主站蜘蛛池模板: 成年大片免费视频| 亚洲国产91精品无码专区| 亚洲日本中文字幕天天更新 | 国产三级免费电影| 精品人妻系列无码人妻免费视频| 亚洲午夜精品久久久久久人妖 | 久久亚洲免费视频| 啦啦啦中文在线观看电视剧免费版 | 色欲色香天天天综合网站免费| 亚洲国产91在线| 国产精品亚洲美女久久久| 最近中文字幕免费mv在线视频| 精品久久久久久亚洲中文字幕| 亚洲一卡2卡三卡4卡有限公司| 午夜免费福利网站| 无码av免费一区二区三区试看| 亚洲第一se情网站| 亚洲一级毛片免费观看| 亚洲一区视频在线播放| 国产成人免费高清激情视频| www在线观看播放免费视频日本| 亚洲国产成人91精品| 亚洲久本草在线中文字幕| 女人张腿给男人桶视频免费版| 中文字幕的电影免费网站| 亚洲13又紧又嫩又水多| 国产亚洲日韩在线三区| 好吊妞在线成人免费| 99久久久国产精品免费蜜臀| 亚洲av色香蕉一区二区三区蜜桃| 亚洲AV无码成人专区片在线观看| 免费一级一片一毛片| 国语成本人片免费av无码| 美丽姑娘免费观看在线观看中文版| 黄色a三级三级三级免费看| 亚洲AV无码一区二区三区牛牛| 亚洲综合婷婷久久| 国产成人亚洲综合无码精品| 免费人成在线观看网站品爱网日本| 91网站免费观看| 91av免费观看|