Webservice实践(四)基于AXIS2的服务端开发 你的名字 2022-07-11 07:22 169阅读 0赞 AXIS2 也是Webservice服务开发的一个优良框架。 \--------------以下AXIS2 特性说明 摘自百度百科----------------------- Axis2是下一代 Apache Axis。Axis2 虽然由 Axis 1.x 处理程序模型提供支持,但它具有更强的灵活性并可扩展到新的[体系结构][Link 1]。Axis2 基于新的体系结构进行了全新编写,而且没有采用 Axis 1.x 的常用代码。支持开发 Axis2 的动力是探寻模块化更强、灵活性更高和更有效的体系结构,这种体系结构可以很容易地插入到其他相关 Web 服务标准和协议(如 WS-Security、WS-ReliableMessaging 等)的实现中。 --------------以上AXIS2 特性说明 摘自百度百科----------------------- 下面就AXIS2的webService服务如何发布和开发进行实践 # 一、目标: # 1)axis2 环境准备 2)服务端开发和发布 3) 客户端的开发 ## 二、axis2环境准备 ## 整个开发环境如下: 主机: 192.168.136.1 windows10 ,myeclipse2015 部署: 192.168.136.144 虚拟机centos6.5 java1.8 ## 1、axis2的框架软件的获取 ## axis2 可以从 [http://ws.apache.org/axis2/][http_ws.apache.org_axis2] 这个网址获取。我们一般获取的war包(部署到tomcat下)和bin 二进制包(用到一些里面的工具) ![Center][] 2、下载后部署到发布服务器上 将war.zip解压后,部署到192.168.136.144的tomcat 环境中webapps目录 ../apache-tomcat-6.0.48/webapps。启动tomcat后,会自动将war包解压成目录,我们只要看一下下面url是否能顺利打开,就可以知道axis2是否部署成功。 ![Center 1][] # 三、服务端的开发与部署 # 服务端一般有两种部署方式: 1) POJO 简单java 对象方式,这种方式要求部署的java对象,不带包名 2) 利用axis2管理平台发布,编辑service.xml进行发布(更常用,灵活度高) ## 3.1 POJO方式部署和开发 ## 由于不带包名,因为相关的类就放在一个地方。我们在myeclipse里面,建立一个web project工程StudyWsAxis2Student。(不选web service project 是因为默认用的是jax-ws 作为webService 框架)。工程里面,我们建几个类。 实体类:student, 实体DAO接口和实现, 实体操作类(这个作为要暴露的service服务)。 工程目录如下图所示: ![Center 2][] StudentOpt.java 是pojo 类,需要开放的服务方法要设置为 public ,其他的为private属性。 import java.util.ArrayList; import java.util.List; import com.study.dao.StudentDAO; import com.study.dao.impl.StudentDAOImpl; import com.study.entity.Student; public class StudentOpt { private List<String> listStudentInfo = new ArrayList<String>(); private StudentDAO studentDAO; public StudentOpt() { System.out.println("studentDAO is init"); studentDAO = new StudentDAOImpl(); } private StudentDAO getStudentDAO() { return studentDAO; } private void setStudentDAO(StudentDAO studentDAO) { this.studentDAO = studentDAO; } public boolean addStudent(String name, String sex, String birthday) { // 调用studentDAO.addStudent 方法入库 System.out.println("Now put student into DB!"); studentDAO.addStudent(name, sex, birthday); return true; } public String queryStudent(String studentName) { System.out.println("queryStudent->"+studentName); if (studentDAO.queryStudent(studentName) == null) { return "null"; } else { return studentDAO.queryStudent(studentName).to_string(); } } } 其他的文件, Student.java 是 实体类,StudentDao是实体操作接口,StudentDaoImpl 是实体操作实现类。 StudentSimlationDB是一个模拟数据库类,就是记录一下addStudent操作的结果用的。这些代码如下: package com.study.entity; import java.util.List; public class Student { String Name; String Sex; String Birthday; public String getName() { return Name; } public void setName(String name) { Name = name; } public String getSex() { return Sex; } public void setSex(String sex) { Sex = sex; } public String getBirthday() { return Birthday; } public void setBirthday(String birthday) { Birthday = birthday; } public String to_string(){ String str ="Name="+this.getName()+";Sex="+this.getSex()+";Birthday="+this.getBirthday(); return str; } } package com.study.dao; import com.study.entity.Student; public interface StudentDAO { //学生操作,新增学生 boolean addStudent(String name, String sex, String birthday); //学生操作,删除学生 boolean delStudent(Student student); //学生操作,修改学生信息 boolean modifyStudent(Student student); //学生操作,查询学生信息,查询到返回学生对象,否则返回null Student queryStudent( String StudentName); } package com.study.dao.impl; import com.study.dao.StudentDAO; import com.study.entity.Student; public class StudentDAOImpl implements StudentDAO { @Override public boolean addStudent(String name, String sex, String birthday) { // TODO Auto-generated method stub System.out.println("addStudent begin!"); Student tmpStudent = new Student(); tmpStudent.setName(name); tmpStudent.setSex(sex); tmpStudent.setBirthday(birthday); StudentSimlationDB.getInstance().listStudent.add( tmpStudent); for(Student stu:StudentSimlationDB.getInstance().listStudent){ System.out.println(stu.to_string()); } return false; } @Override public boolean delStudent(Student student) { // TODO Auto-generated method stub return false; } @Override public boolean modifyStudent(Student student) { // TODO Auto-generated method stub return false; } @Override public Student queryStudent(String StudentName) { // TODO Auto-generated method stub //模拟从数据库中查询学生名 System.out.println("queryStudent begin!"); for(Student aStudent : StudentSimlationDB.getInstance().listStudent ) { if(aStudent.getName().equals(StudentName) ){ System.out.println("queryStudent Infomation successfully !"); return aStudent; } else{ System.out.println("queryStudent Infomation failture !"); } } return null; } } package com.study.dao.impl; import java.util.ArrayList; import java.util.List; import com.study.entity.Student; //模拟数据库,目的是对student操作的时候,可以记录操作的内容 public class StudentSimlationDB { public List<Student > listStudent=new ArrayList<Student>(); private static StudentSimlationDB instance = null; private StudentSimlationDB(){} public static StudentSimlationDB getInstance() {// 实例化引用 if (instance == null) { instance = new StudentSimlationDB(); } return instance; } } 将编译后服务接口类ftp到\\webapps\\axis2\\WEB-INF\\pojo 目录下,一般情况下pojo目录是不存在的,需要自己手工建立。然后将其他类,上传到tomcat的lib 目录 ![Center 3][] 因为POJO是需要调用 这些没有暴露的对象,因此需要找到这些依赖的对象。部署好了后,可以启动tomcat。(注意POJO类是热部署但是不是热更新)启动完成后,可以看到暴露的webservice接口服务了。URL如下:http://192.168.136.144:8080/axis2/services/listServices ![Center 4][] 不编写客户端,我们可以通过 url方式来操作或者soapui工具来验证服务端是否正确,这里不细说了。 1)URL操作 增加学生:http://192.168.136.144:8080/axis2/services/StudentOpt/addStudent?name=Tom&sex=male&birthday=20010512 查询学生:http://192.168.136.144:8080/axis2/services/StudentOpt/queryStudent?studentName=Tom 2)soapUi工具操作 ![Center 5][] 好了,下面说第二种更为常用的webservice部署方式。 3.2 第二种方式war方式部署服务 可以在webapps目录下以war方式部署服务,相关的内容部署在一个目录下,更加便于管理 首先我们看一下开发环境如何调试: 1)建立工程,编写业务逻辑代码 我们新建一个web project工程StudyWSAxis2Student2,在这个工程里面,Student,StudentDAO,StudentDAOImpl,StudentSimlationDB 这些类不变,我们将StudentWs 移到com.study.axis2ws 包下,确保工程都能编译无错误。 package com.study.axis2ws; import java.util.ArrayList; import java.util.List; import com.study.dao.StudentDAO; import com.study.dao.impl.StudentDAOImpl; import com.study.entity.Student; public class StudentWs { private List<String> listStudentInfo = new ArrayList<String>(); private StudentDAO studentDAO; public StudentWs() { System.out.println("studentDAO is init"); studentDAO = new StudentDAOImpl(); } private StudentDAO getStudentDAO() { return studentDAO; } private void setStudentDAO(StudentDAO studentDAO) { this.studentDAO = studentDAO; } public boolean addStudent(String name, String sex, String birthday) { // 调用studentDAO.addStudent 方法入库 System.out.println("Now put student into DB!"); studentDAO.addStudent(name, sex, birthday); return true; } public String queryStudent(String studentName) { System.out.println("queryStudent->"+studentName); if (studentDAO.queryStudent(studentName) == null) { return "null"; } else { return studentDAO.queryStudent(studentName).to_string(); } } public static void main(String[] args) { StudentWs studentWs = new StudentWs(); studentWs.addStudent("Tom", "male", "20110314"); System.out.println(studentWs.queryStudent("Tom")); } } 2)axis2 环境嵌入到myeclipse里面 在myeclipse的WebRoot下,从之前安装axis的tomcat里面,webapps/axis2/WEB-INF 目录下,拷贝 conf、 modules、services、lib 目录都拷贝到工程的WebRoot/WEB-INF目录下,如下图所示: ![Center 6][] 3) 修改配置文件web.xml (WebRoot/WEB-INF ) <?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_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>StudyWSAxis2Student2</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 加载Axis --> <servlet> <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>/services/*</url-pattern> </servlet-mapping> </web-app> 4) 修改 WebRoot/WEB-INF/services/StudentWs/META-INF/ 下的services.xml <service name="StudentWs"> <description> Student Web Service </description> <parameter name="ServiceClass"> com.study.axis2ws.StudentWs </parameter> <operation name="addStudent"> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> <operation name="queryStudent"> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> </service> 在项目上,右键,选运行 MyEclipse Server Application ![Center 7][] 运行后,我们可以通过http://localhost:8080/StudyWSAxis2Student2/services/StudentWs?wsdl 这个URL 在本地工程环境里面调试这个webservice服务。 如果一切顺利,那么我们就可以进行运行环境的tomcat 部署。 5) 运行环境(192.168.136.144)部署 首先打war包:在工程右键菜单里面旋转 export ![Center 8][] 选择保存war包的地方,一般我们就放置在工程下 ![Center 9][] 点finish 就完成了,我们将生成的war包,上传到tomcat的webapps 目录下,这个目录是支持应用热部署的,看到生成应用目录,并且观察日志中体现部署成功就表示应用已经部署完成了。 ![Center 10][] ![Center 11][] 6) 同样,我们用soapui工具进行调试 服务发布的wsdl URL 如下: http://192.168.136.144:8080/StudentWs/services/StudentWs?wsdl 第一个StudentWs 是 在webapps 目录下的目录名, /services/StudentWs 是前面在工程中配置的服务路径 同样,我们在soapui中,添加一个新工程, ![Center 12][] 这样就完成了整个webservice 服务的 测试环境和应用环境的部署过程介绍。 这里补充一下,我们看到服务发布了2个endpoint,这是因为axis2 同时生成了soap1.1 和 soap1.2的接口,我们可以在tomcat的安装目录 如下路径: \\webapps\\axis2\\WEB-INF\\conf 下修改axis2.xml文件。修改里面的 <parameter name="disableSOAP12" locked="true">false</parameter> 默认为false 修改为true就可以了 ![Center 13][] 修改后,已经soap12的绑定和endpoint了。 # 四、客户端开发 # 客户端有多种方式,本例只采用rpc调用方式。 新建一个工程StudyWSAxis2Cli,建立一个 StudentCli 类,代码如下: package com.study.axis2ws.cli; import javax.xml.namespace.QName; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; public class StudentCli { public static void main(String[] args) { String url = "http://192.168.136.144:8080/StudentWs/services/StudentWs"; String result = ""; try { // 使用RPC方式调用WebService RPCServiceClient serviceClient = new RPCServiceClient(); Options options = serviceClient.getOptions(); // 指定调用WebService的URL EndpointReference targetEPR = new EndpointReference(url); options.setTo(targetEPR); // 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值 // // 指定要调用的getWorld方法及WSDL文件的命名空间..... QName opAddEntry = new QName("http://axis2ws.study.com", "addStudent"); // // 指定getGreeting方法的参数值,如果有多个,继续往后面增加即可,不用指定参数的名称 Object[] opAddEntryArgs = new Object[] { "Jerry","female","20160323" }; // 返回参数类型,这个和axis1有点区别 // invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名; // 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[]; // 第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。 // 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{} // 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法, // 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同 // 指定getGreeting方法返回值的数据类型的Class对象..... Class[] classes = new Class[] { String.class }; // 调用getGreeting方法并输出该方法的返回值....... result = (String) serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]; System.out.println("call addStudent"); System.out.println(result); // 下面是调用querryStudent opAddEntry = new QName("http://axis2ws.study.com", "queryStudent"); opAddEntryArgs = new Object[] { "Tom" }; System.out.println("call queryStudent"); System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]); } catch (Exception e) { e.printStackTrace(); } } } 引入axis包,下图为引入的包截图, 如果引入的包不正确,会报错。 ![Center 14][] 然后,以java application运行程序,打印如下: ![Center 15][] [Link 1]: http://baike.baidu.com/view/1188494.htm [http_ws.apache.org_axis2]: http://ws.apache.org/axis2/ [Center]: /images/20220711/a6932728eede417aabd3f4c0c7fb647a.png [Center 1]: /images/20220711/d864678238ed46fc8234a85159b03a9f.png [Center 2]: /images/20220711/fc479ccfddec46ccb7a8684d6c4830d0.png [Center 3]: /images/20220711/7150697c9f4c447c943a703dd589445f.png [Center 4]: /images/20220711/4ccbd4e2b9144de891fd4137d6acc8e4.png [Center 5]: /images/20220711/05050e025c244cbcacde930f3759eca0.png [Center 6]: /images/20220711/d99be708ec7b4e4ea8d2d0e8c117397e.png [Center 7]: /images/20220711/806c3d061d77433f8690d80da25eb976.png [Center 8]: /images/20220711/7fffc948b26941f5a5f17feb3733ee70.png [Center 9]: /images/20220711/0a4dc436b2dc486faa6c06e2b99c6469.png [Center 10]: /images/20220711/a9359a4304eb459092779b72d9be7a3e.png [Center 11]: /images/20220711/e92b91d4cb4747e490e3566b4c6c9913.png [Center 12]: /images/20220711/2b93c3d63086497ca9a239108a06f79b.png [Center 13]: /images/20220711/0daab3788c6a47dda0cbd02cef2fd213.png [Center 14]: /images/20220711/49bf8e2ccdee4f449f89847210272797.png [Center 15]: /images/20220711/002408b012f94bf9b4fe20a6444a2e9f.png
还没有评论,来说两句吧...