如果只是想使用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()); } }