这次我们编辑一个返回User对象、List、Map、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;
/**
* function:传递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 {
/**
* function:传递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;
}
/**
* function:返回List<User>的数据类型
* @author hoojo
* @createDate 2011-1-13 下午03:57:19
* @param j
* @return List<User>
*/
public List getUsers(int j) {
List users = new ArrayList();
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;
}
/**
* function:返回Map<String, User>类型的数据
* @author hoojo
* @createDate 2011-1-13 下午04:03:41
* @param j
* @return Map<String, User>
*/
public Map getUser4Map(int j) {
Map users = new HashMap();
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;
}
/**
* function:返回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、 下面我们在浏览器中访问这个地址:
点击Admin这个链接,可以看到要输入用户名和密码,用户名和密码在
Tomcat_Home\webapps\axis2\WEB-INF\conf下的axis2.xml中可以找到
admin
axis2
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访问
点击Services链接,就可以看到你的WebService。点击你的WebService
样你也可以看到wsdl内容
这样你也可以在上面的WSDL file location中填写:
这个地址也是可以的
4、点击Next,就可以看到你要生成指定方法的代码的选项了
注意的是在选择PortName的时候,不同的选项将会生产不同的调用代码。其调用方式也略有不同。但你可以看生成的源代码进行详细的了解。
5、点击Next,选择代码输出保存的目录,然后点击Finish
刷新目录后发现多了2个文件
D、 编写客户端代码
代码package com.hoo.service;
import java.rmi.RemoteException;
import com.hoo.service.ManagerUserStub.EditUserResponse;
/**
* function: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 = "";
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,可能需要自己用配置描述返回类型。【有待跟进、解决】