Webservice实践(四)基于AXIS2的服务端开发

AXIS2 也是Webservice服务开发的一个优良框架。

--------------以下AXIS2 特性说明 摘自百度百科-----------------------

Axis2是下一代 Apache Axis。Axis2 虽然由 Axis 1.x 处理程序模型提供支持,但它具有更强的灵活性并可扩展到新的体系结构。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/  这个网址获取。我们一般获取的war包(部署到tomcat下)和bin 二进制包(用到一些里面的工具)

2、下载后部署到发布服务器上

将war.zip解压后,部署到192.168.136.144的tomcat 环境中webapps目录   ../apache-tomcat-6.0.48/webapps。启动tomcat后,会自动将war包解压成目录,我们只要看一下下面url是否能顺利打开,就可以知道axis2是否部署成功。

、服务端的开发与部署

服务端一般有两种部署方式:

1) POJO  简单java 对象方式,这种方式要求部署的java对象,不带包名

2)    利用axis2管理平台发布,编辑service.xml进行发布(更常用,灵活度高)

  

3.1  POJO方式部署和开发

由于不带包名,因为相关的类就放在一个地方。我们在myeclipse里面,建立一个web project工程StudyWsAxis2Student。(不选web service project 是因为默认用的是jax-ws 作为webService 框架)。工程里面,我们建几个类。 实体类:student, 实体DAO接口和实现, 实体操作类(这个作为要暴露的service服务)。

工程目录如下图所示:

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 目录


因为POJO是需要调用 这些没有暴露的对象,因此需要找到这些依赖的对象。部署好了后,可以启动tomcat。(注意POJO类是热部署但是不是热更新)启动完成后,可以看到暴露的webservice接口服务了。URL如下:http://192.168.136.144:8080/axis2/services/listServices

编写客户端,我们可以通过 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工具操作

好了,下面说第二种更为常用的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目录下,如下图所示:

  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


运行后,我们可以通过http://localhost:8080/StudyWSAxis2Student2/services/StudentWs?wsdl  这个URL 在本地工程环境里面调试这个webservice服务。

如果一切顺利,那么我们就可以进行运行环境的tomcat 部署。

5) 运行环境(192.168.136.144)部署

首先打war包:在工程右键菜单里面旋转 export

选择保存war包的地方,一般我们就放置在工程下

点finish 就完成了,我们将生成的war包,上传到tomcat的webapps 目录下,这个目录是支持应用热部署的,看到生成应用目录,并且观察日志中体现部署成功就表示应用已经部署完成了。


6) 同样,我们用soapui工具进行调试

服务发布的wsdl URL 如下: http://192.168.136.144:8080/StudentWs/services/StudentWs?wsdl

第一个StudentWs 是 在webapps 目录下的目录名, /services/StudentWs  是前面在工程中配置的服务路径

同样,我们在soapui中,添加一个新工程,

这样就完成了整个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就可以了

修改后,已经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包,下图为引入的包截图, 如果引入的包不正确,会报错。


然后,以java application运行程序,打印如下:

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值