如果只是想使用Axis2编写一个WebService程序的话,非常简单。
工程的目录结构以及所需要的jar包(这里只是编写一个简单的服务端,因此并没有引入所有的jar,只是必须的一些jar)
A.编写服务器端:
1.新建一个Web工程Axis2Demo02,在WEB-INF目录下面建立services文件夹,并将所需的jar包拷贝到lib目录下
2.修改web.xml文件,添加如下内容:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Apache-Axis2</display-name>
<servlet>
<display-name>Apache-Axis Servlet</display-name>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<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>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
2.编写符合axis2的服务端代码,目录结构如下:
说明:
a)MANIFEST.MF在此可以省略,因为我们在此并不是想弄一个可以执行的jar,而只是一个可发布的服务。
b)services.xml配置,核心文件,必须有,配置如下:
<service name="helloServer" ><!--这个与URL相关:http://localhost:8089/Axis2Demo02/services/helloServer?wsdl--> <description>
Please Type your service description here
</description>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parameter name="ServiceClass">server.HelloServer</parameter> <!--类的全名-->
</service>
c)编写服务类HelloServer,并将eclipse自动编译的class文件放到server目录下 (该步骤可以省略)
package server;
import model.Student;
public class HelloServer {
public String sayHello(String name){
return "Hello, "+name;
}
/**
*
* @param studentNo
* @return student
*/
public Student queryStudentByNo(String stuNo){
Student stu = new Student();
stu.setStuNo(stuNo);
stu.setName("boredStudent");
stu.setAge(22);
return stu;
}
}
c)编写Student,并且将eclipse自动编译生成的class文件放到model中(该步骤可以省略)
package model;
public class Student {
private String stuNo;//学号
private String name;
private int age;
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
e)使用jar命令,打包成helloServer.jar,并将jar文件的后缀名改为helloServer.aar
i) cd HelloServer 进入HelloServer目录
ii) jar cvfM helloServer.jar META-INF 将 META-INF文件夹打包成jar(文件名helloServer),这是不要添加M(大写)选项,不需要帮我们生成MANIFEST.MF文件。因为我们已经有了已经手动创建的MANIFEST.MF文件
jar命令行选项说明:c=创建新的存档;
f=指定存档文件名,在这里为helloServer.jar;
v=生成详细输出到标准输出上,你可以看见生成jar的过程;
M=不产生所有项的清单文件,即MANIFEST.MF文件。如果不配置该参数,则jar命令会自动帮我们生成MANIFEST.MF文件
总结:最后我们可以发现只有b和e步骤是必要的,其他的都可以省略。使用axis2开发webService,我们只需要配置一下services.xml文件就可以了,axis2就会自动将src目录下的HelloServer作为服务类。helloServer.aar的目录结构如下:
4.将helloServer.aar文件放入WEB-INF/services目录下,然后重启服务
5.访问:http://localhost:8089/Axis2Demo02/services/helloServer?wsdl,出现如下内容则说明部署成功
B.编写客户端测试代码:在src目录下新建RPCClient.java
import javax.xml.namespace.QName;
import model.Student;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class RPCClient {
public static void main(String[] args) throws Exception
{
// 使用RPC方式调用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8089/Axis2Demo02/services/helloServer");
options.setTo(targetEPR);
// 指定sayHello方法的参数值
Object[] opAddEntryArgs = new Object[] {"高伟刚"};
// 指定sayHello方法返回值的数据类型的Class对象
Class[] classes = new Class[] {String.class};
// 指定要调用的sayHello方法及WSDL文件的命名空间
QName opAddEntry = new QName("http://server", "sayHello");
//
// 调用sayHello方法并输出该方法的返回值
System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);
// 指定queryStudentByNo方法的参数值
Object[] stuNo = new Object[] {"201004070117"};
// 指定queryStudentByNo方法返回值的数据类型的Class对象
Class[] studentClass = new Class[] {Student.class};
// 指定要调用的queryStudentByNo方法及WSDL文件的命名空间
QName queryStudentEnty = new QName("http://server", "queryStudentByNo");
//
// 调用queryStudentByNo方法并输出该方法的返回值
Student student = (Student)serviceClient.invokeBlocking(queryStudentEnty, stuNo, studentClass)[0];
System.out.println(student.getName());
}
}