package com.kevinGQ.service.axis.service;
import com.kevinGQ.service.axis.model.Student;
public class GetStudentService {
public Student getAStudent(String name){
Student a = new Student("a","10001","I'm A");
return a;
}
}
3、部署axis及部署service
a. 从axis-1_1.zip中将axis-1_1/webapps/axis 文件夹拷贝到Tomcat 5.0.x/webapps/
b. 打开webapps/axis/WEB-INF/server-config.wsdd进行编辑,在<deployment>标签下插入如下片断
<service name="StudentInfoService" provider="java:RPC">
<parameter name="className" value="com.kevinGQ.service.axis.service.GetStudentService"/>
<parameter name="allowedMethods" value="*"/>
<beanMapping qname="myNS:Student" xmlns:myNS="urn:StudentInfoService" languageSpecificType="java:com.kevinGQ.service.axis.model.Student"/>
</service>
片断中StudentInfoService是这个web service的名字,在客户端编码的时候需要用到。
<parameter name="className" value="com.kevinGQ.service.axis.service.GetStudentService"/>
中说明了这个服务提供的类,包括package的完整类名。
<parameter name="allowedMethods" value="*"/>中说明这个服务中可供给外部调用的方法有哪些,*表示全部函数,现在也可以把*改成getAStudent.
<beanMapping qname="myNS:Student" xmlns:myNS="urn:StudentInfoService" languageSpecificType="java:com.kevinGQ.service.axis.model.Student"/>中说明对于这个JavaBean的传输需要如何对它进行serializing和de-serializing,说明的目的在于绑定JavaBean的对象类别。注意标签中说明的名字空间。这个标签其实是如下标签的一个简写:
<typeMapping qname="myNs:Student" xmlns:ns="urn:StudentInfoService"
languageSpecificType="java: com.kevinGQ.service.axis.model.Student "
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory "
deserializer=" org.apache.axis.encoding.ser.BeanDeserializerFactory "
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
c. 把编译好的Student.class 和 GetStudentService.class(在它们各自的包内) 放到axis/WEB-INF/classes/.
4、启动Tomcat, 访问http://localhost:8080/axis/admin.html,查看你部署的服务
5、编写客户端
我是在Eclipse里完成代码的编写,编译及运行需要把axis-1_1/lib/ 除了axis_ant.jar外7个jar文件导入到classpath.
package com.kevinGQ.service.axis.client;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import com.kevinGQ.service.axis.model.Student;
public class GetAStudentClient {
public static void main(String [] args) throws Exception
{
Service service = new Service();
Call call = (Call) service.createCall();
QName qn = new QName("urn:StudentInfoService","Student");
call.registerTypeMapping(Student.class,qn,
new BeanSerializerFactory(Student.class, qn),
new BeanDeserializerFactory(Student.class, qn)
);
try{
call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/services/StudentService"));
call.setOperationName(new QName("StudentInfoService","getAStudent"));
call.addParameter("arg1",XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnClass(Student.class);
Student a = (Student) call.invoke(new Object[]{"a"});
System.out.println(a.getId());
}catch(Exception e) {
System.out.println( "Error : " + e.toString());
}
}
}
红色代码部分表明任意的一个字符串,因为getAStudent方法的参数对返回的结果没有影响,这里只是象征性的传递一个参数。加粗的部分是需要在Client端说明要serialize和de-serialize的JavaBean类别,参数的说明可参考axis api 文档。
要得到运行的结果,客户端这边需要得到Student.class文件,可是如果对于一个不在本机的服务,如何得到这个Student.class呢?——你需要阅读一下这个WebService的wsdl文档,里面有对这个JavaBean对象中各个域的说明,根据JavaBean的编码规范,你自己编写编译就得到了Student.class文件。
二、稍微深入
我想得到的是一个Student的数组怎么办呢?
你只有稍做修改:
1、服务端的一个新类 StudentLib.java
package com.kevinGQ.service.axis.model;
import java.util.ArrayList;
public class StudentLib {
ArrayList studentLib = null;
public StudentLib(){
studentLib = new ArrayList();
}
public void addStudent(Student s){
studentLib.add(s);
}
public ArrayList getStudents(String name, String id){
ArrayList list = new ArrayList();
for(int i = 0; i < studentLib.size(); i++){
if(this.get(i).getName().equals(name)
&& this.get(i).getId().equals(id)){
list.add(this.get(i));
}
}
return list;
}
public Student get(int index){
return (Student)studentLib.get(index);
}
}
这个类只不过是为了实现稍微复杂点的逻辑功能而写。注意getStudents方法返回的是ArrayList类型的引用。因为SOAP中支持的数据类型包含java中ArrayList,所以用这个类型会方便很多。
2、扩展Service程序
package com.kevinGQ.service.axis.service;
import java.util.ArrayList;
import com.kevinGQ.service.axis.model.Student;
import com.kevinGQ.service.axis.model.StudentLib;
public class GetStudentService {
public ArrayList getStudent(){
ArrayList students = new ArrayList();
Student a = new Student("a","10001","I'm A");
Student b = new Student("a","10002","I'm B");
Student c = new Student("a","10001","I'm A, I'm not C");
StudentLib lib = new StudentLib();
lib.addStudent(a);
lib.addStudent(b);
lib.addStudent(c);
students = lib.getStudents("a","10001");
return students;
}
public Student getAStudent(String name){
Student a = new Student("a","10001","I'm A");
return a;
}
}
相关推荐
在本文中,我们将深入探讨如何使用Apache CXF框架来处理JavaBean式的复合类型以及List集合类型的参数和返回值。CXF是一个开源的、强大的Web服务框架,它支持多种Web服务标准,包括SOAP、RESTful等,并且允许开发者以...
5. **调用Web服务**:在客户端,你可以创建javabean实例,设置其属性,然后通过生成的stub调用Web服务方法,将javabean作为参数传递。服务端接收到请求后,会解析XML并还原javabean,执行相应业务逻辑,最后将结果...
通过JAX-WS,EJB可以直接转换为Web服务,同时也可以调用外部的SOAP或RESTful Web服务。 综上所述,Enterprise JavaBean 3.0 提供了一套全面的企业级应用开发框架,通过简化API、注解驱动和强大的服务支持,极大地...
很多很好的一些例子. 第1章 Java图形用户界面编程 1 实例1 布局管理 2 实例2 设计软件启动界面 9 实例3 实现多色窗口 11 实例4 切分窗口 13 实例5 丰富多彩的按钮 15 ...实例150 构造Jsp/javabean开发和发布环境 537
- 定义了XML数据类型与Java数据类型之间的映射规则,包括简单的数据类型、复杂的结构体以及数组等。 - 规范了服务器端的编程模型及API,确保其与Web Services Interoperability organization (WS-I) Basic Profile...
在该项目中,需要在调用本地方法前后进行JavaBean的初始化和日志记录。由于SOAP服务端的代码是自动生成的,当增加新的功能需求时,需要对每个方法进行修改,这导致了大量的重复代码。为了解决这个问题,引入了动态...
2. **复合类型数据的传递**: Axis2支持复杂的数据类型传输,如自定义对象,这在处理业务逻辑时非常有用。 3. **services.xml文件发布WebService**: 通过services.xml文件,可以方便地管理和配置服务,包括服务的...
JSR 109则是J2EE环境中的Web服务编程模型和架构标准,它建立在SOAP 1.1和WSDL 1.1之上,定义了J2EE应用服务器中的部署模型。JSR 109与JAX-RPC紧密配合,为J2EE环境下的Web服务客户端和服务器端提供了一致的框架。 ...
- 调用服务:客户端通过SOAP请求调用服务,解析返回的XML响应。 3. **WebLogic Server与WebService** - WebLogic是Oracle公司的一个企业级应用服务器,支持WebService的发布和消费。 - 在WebLogic中发布...
在这个实例中,`MyEclipse下XFire开发Webservice实例.doc`文件应该包含了详细的步骤说明和源码示例,帮助读者更好地理解和实践这个过程。通过阅读文档和动手操作,开发者可以快速掌握XFire的使用技巧,从而在实际...
本文主要介绍如何使用Axis2.x进行Web服务的开发,包括基本的准备、实例、复杂类型处理、会话管理、发布与调用方法、多服务会话控制、Spring集成、异步调用以及使用SoapMonitor监控请求和响应。 一、开发准备 在...
通过JavaBean或JAXB(Java Architecture for XML Binding)来定义数据模型,然后在服务接口中使用这些类型作为参数或返回值。CXF会自动处理对象到XML和XML到对象的转换。 ### 五、CXF与Spring的整合 CXF可以轻松地...
教程可能会介绍如何创建、配置和使用JavaBean,以及在JSP中通过EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)调用Bean的方法。 4. **EJB(Enterprise JavaBeans)**:EJB是J2EE的核心...
Java调用WebService接口是开发中常见的一种交互方式,主要用于不同系统间的通信。本文将详细介绍两种在Java中调用WebService的方法。 ### 方法一:使用JDK Web服务API JDK提供了基本的Web服务支持,可以创建和消费...
这里边包括:第1章 Java图形用户界面编程 1 实例1 布局管理 2 实例2 设计软件启动界面 9 实例3 实现多色窗口 11 实例4 切分窗口 13 实例5 丰富多彩的按钮 15 实例6 在窗口中显示背景图 16 实例...
另外,Axis2还可以将Spring框架管理的JavaBean发布为WebService,这为Java开发者提供了更多的便利性和灵活性。在异步调用方面,Axis2提供了异步调用WebService的能力,允许客户端异步发送请求,提高系统效率和响应...