這次我們編輯一個返回User對象、List<User>、Map<String, User>、User[]的形式,并且用axis2的工具完成發布WebService。不再復制class到axis2的工程目錄下。
下面看看服務器端WebService代碼:
代碼
package
com.hoo.service;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;
import
java.util.Random;
import
com.hoo.entity.User;
/** * <b>function:</b>傳遞User對象類型的List、Map、User、Array等數據方法的WebService * @author hoojo * @createDate 2011-1-13 下午03:50:06 * @file ManagerUserService.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */
public
class
ManagerUserService {
/** * <b>function:</b>傳遞User對象,返回User對象 * @author hoojo * @createDate 2011-1-13 下午03:54:36 * @param user * @return User */
public
User editUser(User user) {
user.setId(
new
Random().nextInt(100));
return
user;
}
/** * <b>function:</b>返回List<User>的數據類型 * @author hoojo * @createDate 2011-1-13 下午03:57:19 * @param j * @return List<User> */
public
List<User> getUsers(
int
j) {
List<User> users =
new
ArrayList<User>();
for
(
int
i = 0; i < j; i++) {
User user =
new
User();
user.setAddress("
china
");
user.setEmail("
hoojo_@126.com
");
user.setName("
hoojo
");
user.setId(22 + i);
users.add(user);
}
return
users;
}
/** * <b>function:</b>返回Map<String, User>類型的數據 * @author hoojo * @createDate 2011-1-13 下午04:03:41 * @param j * @return Map<String, User> */
public
Map<String, User> getUser4Map(
int
j) {
Map<String, User> users =
new
HashMap<String, User>();
for
(
int
i = 0; i < j; i++) {
User user =
new
User();
user.setAddress("
china
");
user.setEmail("
amy@223.com
");
user.setName("
amy
");
user.setId(22 + i);
users.put("
user#
"+ i, user);
}
return
users;
}
/** * <b>function:</b>返回User的數組數據 * @author hoojo * @createDate 2011-1-13 下午04:05:23 * @param j * @return User[] */
public
User[] getUser4Array(
int
j) {
User[] users =
new
User[j];
for
(
int
i = 0; i < j; i++) {
User user =
new
User();
user.setAddress("
china
");
user.setEmail("
tom@223.com
");
user.setName("
tom
");
user.setId(22 + i);
users[i] = user;
}
return
users;
}
}
A
、下面用axis2的工具生成aar文件,然后完成發布WebService。
1、 點擊工作空間WorkSpace,右鍵New選擇Other
2、 選擇Axis2 Service Archiver,點擊Next
3、 然后點擊Browser選擇你當前的工程的classes目錄
點擊Next
4、 沒有WSDL,選擇第一項,點擊Next,然后再Next一次
5、 不用設置service.xml,直接Next
6、 最關鍵一步,填寫WebService的Name,設置class路徑點擊Load你就可以看到當前class的方法
勾中的方法表示將會被暴露到客戶端可以調用的方法,然后點擊Next
7、 設置aar文件的名稱和保持的目錄
點擊Finish你可以看到提示successfully的提示。
8、 刷新當前工程可以看到ManangerUserService.aar文件了
9、 下面我們在瀏覽器中訪問這個地址:
http://localhost:8080/axis2/
點擊Admin這個鏈接,可以看到要輸入用戶名和密碼,用戶名和密碼在
Tomcat_Home\webapps\axis2\WEB-INF\conf下的axis2.xml中可以找到
<parameter name="userName">admin</parameter>
<parameter name="password">axis2</parameter>
10、 輸入密碼進入管理頁面后可以看到
下面介紹下上面常用的功能
Upload Service當然是上傳aar的文件,完成發布WebService的工具了
Available Service是查看當前發布的Service詳細信息
Available Service Groups是Service組
Global Chains是可以用的全局的Chain
Operation Specific Chains是某個具體操作的chain
Deactivate Service 是取消某個Service
Activate Service 是將取消發布的Service再發布出去
Edit Parameters是修改WebService類的參數
11、 我們這里用Upload Service這個工具,然后選擇我們剛才用axis2的工具生成aar文件。
其實這一步我們可以直接將ManagerUserService.aar文件copy到
tomcat-home\webapps\axis2\WEB-INF\services這個目錄下。
12、 然后點擊Available Service就可以看到ManagerUserService這個Service了
B
、現在我們要用axis2的工具生成wsdl文件
1、點擊WorkSpace,右鍵New選擇Other。然后選擇客戶端代碼生成工具
2、點擊Next,你可以看到讓你選擇wsdl。選擇第一個,然后點擊Next
上面是根據Java class代碼生成wsdl文件
3、填寫你的WebService的classpath,然后選擇你當前class所在工程的class目錄
然后點擊Add Folder選擇你的工程的classes 或 bin目錄,也就是你填寫的class所在的目錄,然后點擊Test 測試是否正確。
點擊Next繼續下一步
4、可以看到即將發布的WebService名稱和命名空間
5、繼續Next,選擇wsdl文件保存目錄
這樣services.wsdl文件就生成了。
C
、用axis2的工具生成客戶端調用的代碼
1、右鍵workspace,點擊New選擇Other,然后選擇aixs2的生成代碼工具
2、選擇第一項,根據wsdl文件生成Java代碼,然后Next
3、然后選擇剛才上面生成好的wsdl文件
如果你有向tomcat中發布過你的WebService,那么你可以通過WebBrowser訪問
http://localhost:8080/axis2/
點擊Services鏈接,就可以看到你的WebService。點擊你的WebService
樣你也可以看到wsdl內容
這樣你也可以在上面的WSDL file location中填寫:
http://localhost:8080/axis2/services/ManagerUser?wsdl
這個地址也是可以的
4、點擊Next,就可以看到你要生成指定方法的代碼的選項了
注意的是在選擇PortName的時候,不同的選項將會生產不同的調用代碼。其調用方式也略有不同。但你可以看生成的源代碼進行詳細的了解。
5、點擊Next,選擇代碼輸出保存的目錄,然后點擊Finish
刷新目錄后發現多了2個文件
D、
編寫客戶端代碼
代碼
package
com.hoo.service;
import
java.rmi.RemoteException;
import
com.hoo.service.ManagerUserStub.EditUserResponse;
/** * <b>function:</b>ManagerUserService客戶端調用代碼 * @author hoojo * @createDate 2011-1-14 下午03:17:31 * @file ManagerUserServiceClient.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */
public
class
ManagerUserServiceClient {
public
static
void
main(String[] args)
throws
RemoteException {
String target = "
http://localhost:8080/axis2/services/ManagerUser
";
ManagerUserStub stub =
new
ManagerUserStub(target);
/** * 調用User Bean模式: * EditUser、User是內部靜態類,axis2會幫我們進行參數封裝 */
ManagerUserStub.EditUser editUser =
new
ManagerUserStub.EditUser();
ManagerUserStub.User u =
new
ManagerUserStub.User();
u.setAddress("
china
");
u.setEmail("
axis2@axis2.com
");
u.setName("
axis2
");
u.setId(222);
editUser.setUser(u);
//返回值也被封裝
EditUserResponse eur = stub.editUser(editUser);
ManagerUserStub.User returnUser = eur.get_return();
//returnUser.getId()在服務器端動態重置過
System.out.println(returnUser.getId() + "
#
" + returnUser.getName() + "
#
" + returnUser.getEmail() + "
#
" + returnUser.getAddress());
/** * User數組模式 */
ManagerUserStub.GetUser4Array userArray =
new
ManagerUserStub.GetUser4Array();
userArray.setJ(3);
ManagerUserStub.GetUser4ArrayResponse userArrResponse = stub.getUser4Array(userArray);
ManagerUserStub.User[] userArr = userArrResponse.get_return();
for
(ManagerUserStub.User user : userArr) {
System.out.println(user.getId() + "
#
" + user.getName() + "
#
" + user.getEmail() + "
#
" + user.getAddress());
}
/** * Map User模式,不支持Map、List */
/*ManagerUserStub.GetUser4Map userMap = new ManagerUserStub.GetUser4Map(); userMap.setJ(3); ManagerUserStub.GetUser4MapResponse userMapResponse = stub.getUser4Map(userMap); ManagerUserStub.Map map = userMapResponse.get_return(); System.out.println(map);*/
/** * GetUsers是ManagerUserStub的內部類,axis2的代碼生成工具會幫我們把參數更具wsdl文件的內容進行封裝 */
/*ManagerUserStub.GetUsers getUsers = new ManagerUserStub.GetUsers(); getUsers.setJ(3);//服務器的參數int j ManagerUserStub.GetUsersResponse usersResponse = stub.getUsers(getUsers); System.out.println(usersResponse.get_return());*/
}
}
運行后發現不支持Map、List,不能讀取數據類型。Wsdl文件中是anyType,可能需要自己用配置描述返回類型。【有待跟進、解決】
四、 用axis2的輔助工具發布、調用WebService