发布于 2016-01-02 09:38:54 | 372 次阅读 | 评论: 0 | 来源: PHPERZ
MyEclipse集成开发环境
MyEclipse,是在eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java、Java EE以及移动应用的开发。MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持相当不错。
0 引言
以前都是做javaweb的 最近因工作需要 接触了webservice
关于什么事webservice,与web的区别,soap,跟http的区别,asix1和asix2的区别,为什么不用json 等等等等 这里就不细谈了。等以后有机会会好好探讨下 要不会在心里留下阴影。
这里主要讲的是如何用myeclipse搭建axis1.4版本的webservice 并进行测试 。
网上看了很多 但版本过多没找到合适的 所以在这里把自己弄得小demo拿了出来
好 闲话不说了 上代码
1 搭建项目
在MyEclipse中 新建 Web项目 项目名 wbsDemo
1.0 最终结构
1.1导入jar包
1.2jar包说明
axis.jar SOAP引擎包
commons-discovery-0.2.jar 用来发现、查找和实现可插入式接口,提供一些一般类实例化、单件的生命周期管理的常用方法
commons-logging-1.1.1.jar 日志包
jaxrpc.jar Axis运行所需要的组件包
wsdl4j-1.6.2.jar 用来解析服务的WSDl文件
1.3修改web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<display-name>Apache-Axis Servlet</display-name>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet>
<display-name>Axis Admin Servlet</display-name>
<servlet-name>AdminServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
1.4在lib下添加server-config.wsdd (webservice配置)文件
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<!-- 处理器 -->
<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper" />
<!-- 待添加的服务 -->
<!-- 指定处理器 -->
<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
</requestFlow>
</transport>
</deployment>
好 这样就搭建成功了
然后开始上代码
2 服务端与客户端的数据传输
2.0这里我们分4中情况来实践
情况1 传值:String 返回值: String
情况2 传值:User(自定义对象) 返回值: String
情况3 传值:String 返回值: User(自定义对象)
情况4 传值:User(自定义对象) 返回值: UserInfo(自定义对象)
2.1 情况1 (传值:String 返回值: String)
2.1.1
新建一个实现类 UserService.java 并新建接收方法 showName
package lqb.manage;
public class UserService {
public String showName(String name){
System.out.println("UserService --- showName "+name);
return String.format("name:%s",name);
}
}
2.1.2
然后 在server-config.wsdd文件中添加服务
<!-- provider="java:RPC" webservice是以javabean的形式提供的-->
<service name="userService" provider="java:RPC">
<!-- 指定类名 -->
<parameter name="className" value="lqb.manage.UserService" />
</service>
ok 这样就可以了
2.1.3
然后写客户端我们也再新建个类 Cline.java
并写一个跟这个服务通讯的测试方法 getNameWBSC()
/**
*
* @param: String
* @return: String
*/
public static void getNameWBSC(){
Service service = new Service();
String url="http://127.0.0.1:8080/wbsDemo/services/userService";
String methodName="showName";
String name="李";
System.out.println("Cline -- getNameWBSC");
System.out.println("para String "+name);
try {
Call call=(Call)service.createCall();
call.setTargetEndpointAddress(new URL(url));
call.setOperationName(new QName("", methodName));
//设置要传入参数,如果没有要传入的参数,则不要写这个
call.addParameter("name", XMLType.XSD_STRING, ParameterMode.IN);
//设置返回的类型
call.setReturnType(org.apache.axis.Constants.XSD_STRING);
//执行,调用webservice
String result = (String) call.invoke(new Object[]{name});
System.out.println("返回的结果是:"+result);
} catch (Exception e) {
e.printStackTrace();
}
}
2.1.4
然后运行
客户端显示 服务端显示
ok 测试通过
2.2然后我们来看情况2
2.2.1
为了测试 我们新建一个自定义类 User.Class
package lqb.bean;
public class User {
private String name;
private int age;
/*省略get set 构造函数*/
}
2.2.2
然后在UserService.java中添加 方法
public User showUser(String name){
System.out.println("UserService --- showUser "+name);
User u=new User(name,10);
return u;
}
2.2.3
接着 在配置文件server-config.wsdd中添加服务
<!-- 一个服务 -->
<!-- provider="java:RPC" webservice是以javabean的形式提供的-->
<service name="userService" provider="java:RPC">
<!-- 指定类名 -->
<parameter name="className" value="lqb.manage.UserService" />
<!-- 参数返回值的bean -->
<beanMapping languageSpecificType="java:lqb.bean.User" qname="ns1:User" xmlns:ns1="BeanService"/>
</service>
与情况一不同 这里需要传输bean 所以需要添加一个beanMapping
2.2.4
好 写测试方法 我们还是在Cline.java 中添加 getUserWBSC()
/**
* 需要在wsdd文件中写Mapping
* @param: String
* @return: User
*/
public static void getUserWBSC(){
Service service = new Service();
String url="http://127.0.0.1:8080/wbsDemo/services/userService";
String methodName="showUser";
String qnv="User";
String name="王";
System.out.println("Cline -- getUserWBSC");
System.out.println("para String "+name);
try {
Call call=(Call)service.createCall();
call.setTargetEndpointAddress(new URL(url));
call.setOperationName(new QName("", methodName));
QName qn = new QName(qnv, methodName);
call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class, qn), new BeanDeserializerFactory(User.class, qn));
//设置要传入参数,如果没有要传入的参数,则不要写这个
call.addParameter("name", XMLType.XSD_STRING, ParameterMode.IN);
//设置返回的类型
call.setReturnClass(User.class);
//执行,调用webservice
User u = (User) call.invoke(new Object[]{name});
System.out.println("返回的结果是:"+u.getName()+"-"+u.getAge());
} catch (Exception e) {
e.printStackTrace();
}
}
好 然后运行测试 ...(这里就不再呈现了 和情况1类似 大家脑补下)
2.3然后我们来看情况3
2.3.1
bean还是使用刚才的User
2.3.2
然后在UserService中添加方法 showAge
public String showAge(User u){
System.out.println("UserService --- showAge "+u.getAge());
return String.format("age:%d",u.getAge());
}
2.3.3
swdd文件同第二种情况 (略)
2.3.4
然后是测试方法 还是在Cline.java中添加
/**
*
* @param: User
* @return: String
*/
public static void getAgeWBSC(){
Service service = new Service();
String url="http://127.0.0.1:8080/wbsDemo/services/userService";
String methodName="showAge";
User u=new User("张",10);
System.out.println("Cline -- getAgeWBSC");
System.out.println("para User:"+u.getName()+" - "+u.getAge());
try {
Call call=(Call)service.createCall();
call.setTargetEndpointAddress(new URL(url));
call.setOperationName(new QName("", methodName));
//设置要传入参数,如果没有要传入的参数,则不要写这个
// QName qn = new QName("urn:BeanService", methodName);
QName qn = new QName("User", methodName);
call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class, qn), new BeanDeserializerFactory(User.class, qn));
call.addParameter("name", qn, ParameterMode.IN);
//设置返回的类型
call.setReturnType(Constants.XSD_STRING);
//执行,调用webservice
String result = (String) call.invoke(new Object[]{u});
System.out.println("返回的结果是:"+result);
} catch (Exception e) {
e.printStackTrace();
}
}
好 测试通过 (继续脑补)
2.4最后是第四种情况
2.4.1
为不混淆参数和返回值 我们再new一个自定义的bean UserInfo.Class
package lqb.bean;
public class UserInfo{
private String name;
private String desc;
/*省略get set 构造函数*/
}
2.4.2
然后是服务端 在UserService中添加 方法showUserInfo
public UserInfo showUserInfo(User u){
System.out.println("UserService --- showUserInfo "+u.getName());
UserInfo ui=new UserInfo(u.getName(),"1234");
return ui;
}
2.4.3
这次 对应的配置文件觉有不同 需要再添加一个 beanMapping
<!-- 一个服务 -->
<!-- provider="java:RPC" webservice是以javabean的形式提供的-->
<service name="userService" provider="java:RPC">
<!-- 指定类名 -->
<parameter name="className" value="lqb.manage.UserService" />
<!-- 参数返回值的bean -->
<beanMapping languageSpecificType="java:lqb.bean.User" qname="ns1:User" xmlns:ns1="BeanService"/>
<beanMapping languageSpecificType="java:lqb.bean.UserInfo" qname="ns1:UserInfo" xmlns:ns1="BeanService"/>
</service>
2.4.4
最后还是Cline的测试方法getUserInfoWBSC
/**
*
* @param: User
* @return: UserInfo
*/
public static void getUserInfoWBSC(){
Service service = new Service();
String url="http://127.0.0.1:8080/wbsDemo/services/userService";
String methodName="showUserInfo";
User u=new User("赵",10);
System.out.println("Cline -- getUserInfoWBSC");
System.out.println("para User:"+u.getName()+" - "+u.getAge());
try {
Call call=(Call)service.createCall();
call.setTargetEndpointAddress(new URL(url));
call.setOperationName(new QName("", methodName));
//设置要传入参数,如果没有要传入的参数,则不要写这个
QName qn = new QName("User", methodName);
call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class, qn), new BeanDeserializerFactory(User.class, qn));
QName qn1 = new QName("UserInfo", methodName);
call.registerTypeMapping(UserInfo.class, qn1, new BeanSerializerFactory(UserInfo.class, qn1), new BeanDeserializerFactory(UserInfo.class, qn1));
call.addParameter("name", qn, ParameterMode.IN);
//设置返回的类型
call.setReturnClass(UserInfo.class);
//执行,调用webservice
UserInfo ui = (UserInfo) call.invoke(new Object[]{u});
System.out.println("返回的结果是:"+ui.getName()+" - "+ui.getDesc());
} catch (Exception e) {
e.printStackTrace();
}
}
好 ....通过 继续脑补
2.5 至于其他情况(无传值 或者 无返回值)这里就不多说了 根据上面的例子 大家应该可以写出来
3 demo下载
百度云链接 密码:ybnx