一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Spring-ws示例WebService開(kāi)發(fā)

 江江385 2013-01-21

概述

我們這里要編寫一個(gè)WebService的Endpoint,它可以接收一個(gè)UserRequest對(duì)象,這個(gè)對(duì)象當(dāng)中只包含一個(gè)userCount的參數(shù),Endpoint接收到參數(shù)后,會(huì)產(chǎn)生與userCount相同數(shù)量的User對(duì)象,最后將這個(gè)User對(duì)象的集合放在一個(gè)名為UserResponse的對(duì)象當(dāng)中作為Endpoint的調(diào)用響應(yīng)發(fā)送給調(diào)用這個(gè)WebService的客戶端。接下來(lái)我們先從編寫WebService服務(wù)端開(kāi)始,看看如何實(shí)現(xiàn)這個(gè)WebService示例。

WebService服務(wù)端開(kāi)發(fā)

因?yàn)樵谖覀兊腤ebService服務(wù)端當(dāng)中引入了JAXB2,所以整個(gè)服務(wù)端Endpoint類編寫變的簡(jiǎn)單,同時(shí)Spring-WS2.0支持將XSD文檔自動(dòng)轉(zhuǎn)換成WSDL,這樣我們就不用直接編寫復(fù)雜的WSDL,而只需要編寫好XSD文檔即可實(shí)現(xiàn)WSDL發(fā)布。一般來(lái)說(shuō),一個(gè)WebService的編寫是從定義WSDL開(kāi)始的,對(duì)于我們這里來(lái)說(shuō),因?yàn)槲覀兛梢詫SD自動(dòng)轉(zhuǎn)換成WSDL,所以我們就是從編寫簡(jiǎn)單的XSD開(kāi)始。

關(guān)于XSD文檔的語(yǔ)法規(guī)范,如果您不熟悉,可以從http://www.w3school.com.cn/schema/index.asp上面了解。

我們這里規(guī)定,所有的進(jìn)站參數(shù)在定義XSD時(shí)要以Request結(jié)尾,比如我們這里的UserRequest;所有的出站參數(shù)要以Response結(jié)尾,比如我們這里的UserResponse。了解這些之后就可以定義們的XSD文檔,具體內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www./ws/demo" elementFormDefault="qualified" xmlns="http://www./2001/XMLSchema" xmlns:tns="http://www./ws/demo">
<element name="UserResponse">
<complexType>
<sequence>
<element name="users" type="tns:User" maxOccurs="unbounded"></element>
</sequence>
</complexType>
</element>
<element name="UserRequest">
<complexType>
<all>
<element name="userCount" type="int"></element>
</all>
</complexType>
</element>
<complexType name="User">
<sequence>
<element name="username" type="string"></element>
<element name="birthday" type="date"></element>
<element name="gender" type="boolean"></element>
<element name="email" type="string"></element>
<element name="dept" type="tns:Dept"></element>
</sequence>
</complexType>
<complexType name="Dept">
<sequence>
<element name="deptId" type="string"></element>
<element name="deptName" type="string"></element>
</sequence>
</complexType>
</schema>

XSD文檔的編寫是非常簡(jiǎn)單的,如果您使用的IDE是Eclipse,那么您可以直接使用Eclipse當(dāng)中提供了XSD圖形化編輯器來(lái)編寫這個(gè)XSD文檔。從文檔內(nèi)容中可以看到,我們定義消息的namespace為http://www./ws/demo,同時(shí)定義了一個(gè)名為UserRequest的Element為進(jìn)站參數(shù);一個(gè)名為UserResponse的Element為出站參數(shù)。
XSD文檔編寫完成之后,我們就可以利用Spring-WS提供的配置功能將XSD直接轉(zhuǎn)換成我們需要的WSDL。

因?yàn)槲覀儾捎玫氖荢pring-WS為基礎(chǔ)實(shí)現(xiàn)WebService,所以一旦XSD文檔編寫完成我們就可以通過(guò)配置的方式將XSD轉(zhuǎn)換成WSDL,新建一個(gè)Spring配置文件,在文件當(dāng)中添加如下內(nèi)容:

<?xml version="1.0" encoding="UTF-8"?>
xsi:schemaLocation="http://www./schema/beans http://www./schema/beans/spring-beans-3.0.xsd
http://www./schema/context >
<context:component-scan base-package="com.bstek.bdf.webservice.demo"></context:component-scan>
<sws:dynamic-wsdl id="demo" portTypeName="UserResource" locationUri="/webservice/demo">
<sws:xsd location="classpath:com/bstek/bdf/webservice/demo/demo.xsd" />
</sws:dynamic-wsdl>
</beans>

我們需要關(guān)注的就是這個(gè)配置文件當(dāng)中以sws:dynamic-wsdl開(kāi)頭的配置片斷,這里采用位于classpath下的一個(gè)xsd文檔,發(fā)布成WSDL的ID為demo,同時(shí)客戶端調(diào)用這個(gè)WebService的地址我們定義為/webservice/demo。啟用我們的應(yīng)用,打開(kāi)瀏覽器,可以瀏覽到這個(gè)動(dòng)態(tài)生成的名為demo的wsdl文檔。如下圖所示。

WSDL發(fā)布成功之后,接下來(lái)我們就需要?jiǎng)邮謥?lái)編寫我們的WebService服務(wù)端的Endpoint,由這個(gè)EndPoint來(lái)接收客戶端的調(diào)用請(qǐng)求。
Endpoint實(shí)際上是WebService真正的服務(wù)類,我們只需要按照之前發(fā)布的WSDL規(guī)則來(lái)編寫即可,由它來(lái)接收客戶端請(qǐng)求,同時(shí)將響應(yīng)回寫到客戶端當(dāng)中。因?yàn)镾pring提供了Endpoint的annotation,同時(shí)我們又添加了JAXB2支持,所以Endpoint類編寫是非常簡(jiǎn)單的。下面是我們編寫的與之前發(fā)布的WSDL對(duì)應(yīng)的Endpoint類源碼:

package com.bstek.bdf.webservice.demo;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
@Endpoint
public class UserServiceEndpoint{
@PayloadRoot(namespace=" http://www./ws/demo",localPart="UserRequest")
@ResponsePayload
public UserResponse findUsers(@RequestPayload UserRequest request) throws Exception{
List<User> userList=new ArrayList<User>();
for(int i=0;i<request.getUserCount();i++){
User u=new User();
u.setBirthday(new Date());
u.setGender(true);
u.setUsername("從WS中取到的User "+i);
u.setEmail("bstek.user"+i+".");
userList.add(u);
}
for(int i=0;i<100;i++){
Thread.sleep(50);
}
UserResponse res=new UserResponse();
res.setUsers(userList);
return res;
}
}

可以看到,我們這里采用了四個(gè)annotation,在類上的@Endpoint標(biāo)明我們將這個(gè)類發(fā)布成一個(gè)Endpoint服務(wù)類,findUsers方法上有兩個(gè)annotation:@PayloadRoot用于標(biāo)明findUser可以授受的XML信息,這里取的是XML的namespace為http://www./ws/demo,同時(shí)XML的ROOT為UserRequest的信息;下面的@ResponsePayload標(biāo)明findUsers方法有返回值,返回值需要回寫給Webservice調(diào)用客戶端;參數(shù)中還有一個(gè)@RequestPayload的annotation,它表示從請(qǐng)求負(fù)載中取值作為參數(shù),我們這里因?yàn)椴捎昧薐AXB2,所以可以將負(fù)載的XML消息直接轉(zhuǎn)換成一個(gè)名為UserRequest的Java對(duì)象。
從findUsers方法體中可以看到,其中都是針對(duì)Java對(duì)象的操作,是非常簡(jiǎn)單的。這是因?yàn)槲覀兲砑恿薐AXB2支持的原因,如果沒(méi)有我們這里就只能操作復(fù)雜的XML了。
我們這里涉及到的需要使用JAXB2實(shí)現(xiàn)Java對(duì)象與XML相互轉(zhuǎn)換的類有下面幾個(gè):

  • UserRequest
    package com.bstek.bdf.webservice.demo;
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlRootElement;
    @XmlRootElement(namespace="http://www./ws/demo",name="UserRequest")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class UserRequest {
    private int userCount;
    public int getUserCount() {
    return userCount;
    }
    public void setUserCount(int userCount) {
    this.userCount = userCount;
    }
    }
    UserResponse
    package com.bstek.bdf.webservice.demo;
    import java.util.List;
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlRootElement;
    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class UserResponse {
    private List<User> users;
    public List<User> getUsers() {
    return users;
    }
    public void setUsers(List<User> users) {
    this.users = users;
    }
    }

User

package com.bstek.bdf.webservice.demo;
import java.util.Date;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="User",namespace="http://www./ws/demo")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {
private String username;
private Date birthday;
private boolean gender;
private String email;
private Dept dept;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "User [username=" + username + ", birthday=" + birthday
+ ", gender=" + gender + ", email=" + email + ", dept=" + dept
+ "]";
}
}

可以看到,這三個(gè)類都是非常普通的POJO對(duì)象,它們都用到了@XmlRootElement、@XmlAccessorType,這兩個(gè)annotation都是JAXB2提供,要了解詳情請(qǐng)查看JAXB2相關(guān)文檔。
到這里為止,我們的Endpoint編寫就完成了,因?yàn)槲覀兪褂昧薙pring-WS提供的Endpoint的annotation,所以不需要在Spring配置當(dāng)中進(jìn)行任何配置,唯一需要的就是添加一個(gè)context:component-seca即可,這樣Spring會(huì)自動(dòng)掃描位于base-package屬性指定包下所有的Endpoint類。
可以看到,這三個(gè)類都是非常普通的POJO對(duì)象,它們都用到了@XmlRootElement、@XmlAccessorType,這兩個(gè)annotation都是JAXB2提供,要了解詳情請(qǐng)查看JAXB2相關(guān)文檔。

到這里為止,我們的Endpoint編寫就完成了,因?yàn)槲覀兪褂昧薙pring-WS提供的Endpoint的annotation,所以不需要在Spring配置當(dāng)中進(jìn)行任何配置,唯一需要的就是添加一個(gè)context:component-seca即可,這樣Spring會(huì)自動(dòng)掃描位于base-package屬性指定包下所有的Endpoint類。

<context:component-scan base-package="com.bstek.bdf.webservice.demo"></context:component-scan>

WebService的服務(wù)端我們開(kāi)發(fā)完成,接下來(lái)我們就來(lái)看看客戶端如何對(duì)這個(gè)服務(wù)端進(jìn)行調(diào)用。

WebService客戶端調(diào)用

前面提到過(guò),我們?yōu)榱藢?shí)現(xiàn)快速調(diào)用目標(biāo)WebService服務(wù)端,我們提供了一個(gè)名為WebServiceClient對(duì)象,通過(guò)它可以快速實(shí)現(xiàn)調(diào)用目標(biāo)WebService服務(wù)端;當(dāng)然你也可以使用諸如SOAPUI之類客戶端工具實(shí)現(xiàn)對(duì)目標(biāo)WebService調(diào)用測(cè)試。

我們這里以之前編寫的服務(wù)端為類,看看WebServiceClient對(duì)象如何調(diào)用這個(gè)WebService。具體代碼如下:

package com.bstek.bdf.webservice.demo;
import com.bstek.bdf.webservice.client.WebServiceClient;
public class DemoWebserviceClient {
public static void main(String[] args) throws Exception{
WebServiceClient client=new WebServiceClient();
//設(shè)置目標(biāo)webservice地址,這個(gè)可以在WSDL文檔當(dāng)中看到
//設(shè)置服務(wù)驗(yàn)證方式,我們這里采用Username Token用戶密碼加密方式 ,默認(rèn)我們的服務(wù)端要求用戶名與密碼相同即可通過(guò)認(rèn)證
client.setUsernameToken("admin", "admin", true);
//添加JAXB2支持
client.setMarshallerUnmarshallerClass(new Class[]{User.class,UserResponse.class,UserRequest.class});
UserRequest request=new UserRequest();
request.setUserCount(20);
//向目標(biāo)WebService發(fā)送請(qǐng)求,并將響應(yīng)結(jié)果通過(guò)JAXB2轉(zhuǎn)換成Java對(duì)象
UserResponse response=(UserResponse)client.marshalSendAndReceive(request);
int i=1;
for(User user:response.getUsers()){
//打印響應(yīng)結(jié)果
System.out.println("webservice 產(chǎn)生的用戶"+i+":"+user);
i++;
}
}
}

我們已在代碼當(dāng)中進(jìn)行了注釋,這里就不再解釋。一旦調(diào)用完成(不管是成功還是失敗),我們可以在bdf_webservice_logs表中看到日志記錄情況。同時(shí)在默認(rèn)情況下我們沒(méi)有啟用權(quán)限功能,所以所有用戶名密碼相同的用戶都可以進(jìn)行調(diào)用。

關(guān)于WebServiceClient類還有一個(gè)方法, 詳情可查看WebServiceClient的javadoc。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    欧洲偷拍视频中文字幕| 人妻内射在线二区一区| 欧美日韩成人在线一区| 亚洲精品黄色片中文字幕| 一区二区三区国产日韩| 中文字幕亚洲精品乱码加勒比| 黄色av尤物白丝在线播放网址| 亚洲国产精品肉丝袜久久| 欧美欧美日韩综合一区| 亚洲精品黄色片中文字幕| 亚洲精品成人午夜久久| 日本欧美视频在线观看免费 | 微拍一区二区三区福利| 日本在线不卡高清欧美 | 成人精品欧美一级乱黄| 日本三区不卡高清更新二区| 黄片三级免费在线观看| 亚洲中文字幕熟女丝袜久久| 婷婷伊人综合中文字幕| 在线日本不卡一区二区| 亚洲精品美女三级完整版视频 | 日韩高清中文字幕亚洲| 一个人的久久精彩视频| 99久久国产精品成人观看| 欧美日韩国产亚洲三级理论片| 日韩成人高清免费在线| 欧美成人精品国产成人综合| 日本欧美一区二区三区在线播| 亚洲另类女同一二三区| 国产精品一区二区有码| 偷自拍亚洲欧美一区二页| 中文文精品字幕一区二区| 久久国产精品亚州精品毛片| 亚洲最新av在线观看| 欧美日韩精品久久亚洲区熟妇人| 国产一级精品色特级色国产| 亚洲中文字幕在线乱码av| 99久久精品午夜一区| 国产精品一区二区三区欧美| 国产日产欧美精品视频| 日本加勒比系列在线播放|