这次我们编辑一个返回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