Axis2之webservice超详细教程

Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物。Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持Spring、JSON等技术,本教程是主要阐述如何构建一个基本的Axis2 webservice应用,里面的许多环节高手可直接略过,本教程完全针对新手。

一、环境安装

安装myeclipse

下载地址: http://www.xlpan.com/file/4238159/48030981-6b56-40a4-a93b-8f424ee4f33a

安装mysql

下载地址:http://www.xlpan.com/file/4238159/de64cf2f-4217-4e11-bb98-8e6c5dd24155

安装mysql-workbench(mysql可视化工具)

下载地址:http://www.xlpan.com/file/4238159/becf913f-56a6-4d68-b248-134113b73535

安装tomcat

下载地址:

http://www.xlpan.com/file/4238159/ec6a2250-99ff-464e-a978-be184c96e4e7

下载Axis2服务包

下载地址: http://www.xlpan.com/file/4238159/bb3db6e3-2f7d-4343-b472-c1fa714dba95

下载Axis2开发插件包

下载地址: http://www.xlpan.com/file/4238159/aa39505f-079b-43be-9479-15a2d3e98cbb

安装jdk

下载地址: http://www.xlpan.com/file/4238159/7ba342f9-277f-4b9c-b5e7-b0c5b7dfc151

二、环境配置

1)     Java环境配置

a)     设置JAVA_HOME

图1.

图2

设置JAVA_HOME= D:\Program
Files\Java\jdk1.6.0_10

*
D:\Program Files\Java\jdk1.6.0_10为笔者本机的JDK安装目录,请开发者根据实际安装路径来填写,注意环境变量最后面不能加分号,D:\Program
Files\Java\jdk1.6.0_10;这么写是错误的。

b)    
设置CLASSPATH

图1

设置CLASSPATH= .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

* 要加.表示当前路径

c)     
设置path

设置path=%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

2)    
tomcat环境配置

a)     
设置CATALINA_HOME

CATALINA_HOME=F:\apache-tomcat-6.0.30

*
F:\apache-tomcat-6.0.30为笔者本机的JDK安装目录,请开发者根据实际安装路径来填写。

b)    
测试Axis2服务包

将axis2服务包(axis2.war)放入F:\apache-tomcat-6.0.30\webapps下

点击F:\apache-tomcat-6.0.30\bin下的startup.bat文件

在浏览器中输入 http://localhost:8080/axis2/

若出现图中所示页面,那么说明axis2的服务包已经发布成功了;

在F:\apache-tomcat-6.0.30\webapps目录下会自动生成一个axis2文件夹,这个留待后面的说明中一并叙述,下面继续配置。

3)    
myeclipse环境配置

a)     
配置axis2插件包

将axis2插件包下的Axis2_Codegen_Wizard_1.3.0和Axis2_Service_Archiver_1.3.0文件夹拷贝至Myeclipse8.5\dropins
目录下

点击FileàNewàOther

若出现图中2个高亮显示的插件名,那么说明Axis2开发插件已经安装成功。

b)    
myeclipse下的tomcat配置

点击WindowàPreferences

点击MyEclipseàServersàTomcat, 选择Configure
Tomcat 6.x

按照图中所示配置tomcat

c)     
myeclipse下的jre配置

点击JavaàInstalledJREs,点击Search按钮,选择D:\Program Files\Java\jdk1.6.0_10路径(开发者根据实际路径自己调整)

如图中所示进行配置,点击OK

4)    
Mysql数据配置

a)     
数据库安装配置

实例配置时,笔者选择的是服务器。

服务器字符集选择的是utf-8

数据库连接设置为:

用户名:root

密码:123456

b)    
测试数据库建立

笔者采用的是可视化工具建库(mysql-workbench-gpl-5.2.37-win32)

打开mysql-workbench

点击图中标注的按钮,新建一个库

新建库名为webservice

新建student表,建表语句如下

DROP
TABLE IF EXISTS `student`;

CREATE
TABLE `student` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`number` int(11) DEFAULT NULL,

`name` varchar(45) DEFAULT NULL,

`tel` varchar(45) DEFAULT NULL,

`address` varchar(45) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB
AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

LOCK
TABLES `student` WRITE;

INSERT
INTO `student` VALUES (1,1,'小明','119','南京'),(2,2,'小郭','110','西藏'),(3,NULL,'坤哥','117','朝鲜');

UNLOCK
TABLES;

双击左侧webservice库名,将其设为默认库,默认库的名字会加粗显示,如果不设置默认库,会影响下面的数据导入。

将建表语句复制进来,执行;

数据导入成功。

三、        
正式开发

1)    
服务端开发

a)     
工程建立

打开myeclipse

点击NewàWeb Project新建一个Web工程

新建工程名为myservice,一直默认执行。

右键点击工程,右键菜单里选择Properties,将工程编码设置为UTF-8

b)    
编写mysql数据库访问功能模块

将mysql的连接驱动包(mysql-connector-java-5.1.7-bin.jar)拷贝至WebRoot\WEB-INF\lib下

在src目录下新建一个database包,分别录入以下4个类,因为牵涉到jdbc封装类的开发,这里就不详细阐述,仅贴出源代码。

(一)
ConnectionFactory.java  (连接工厂类)

package database;

import java.sql.Connection;

import java.sql.DriverManager;

import java.util.ResourceBundle;

/** 类名:ConnectionFactory<br>

* 作用:产生数据库连接对象<br>

* 属性:<br>

* 方法:Connection
getConnection()<br>

*        作用:返回数据库连接对象<br>

*        参数:无<br>

*        返回:数据库连接对象<br>

* 其它:返回的aConnection不会自动提交JDBC事务<br>

* 创建人:陶尚明<br>

* */

public abstract class ConnectionFactory {

/** 数据库系统的属性文件名:

*/

private static final String propertiesFileName = "using_which_dbms";

/** 获取Connection对象

*

* @return Connection对象

* @throws Exception SqlException异常 */

static synchronized public Connection getConnection() throws Exception {

String dbSystem=null;

Connection aConnection;

ResourceBundle db = ResourceBundle.getBundle("dbsystem");  //读取配置文件

dbSystem=db.getString(propertiesFileName);

ResourceBundle rb = ResourceBundle.getBundle(dbSystem);  //读取配置文件

Class.forName(rb.getString("database.driver")).newInstance();

aConnection = DriverManager.getConnection(rb.getString("database.url"),rb.getString("database.username"),rb.getString("database.password"));  //创建aConnection对象

aConnection.setAutoCommit(false);  //设置不自动提交事务

return aConnection;  //返回aConnection对象

}

/** 当前使用的数据库系统名称

*

* @param echoable 如果启用回显将在控制台输出描述当前数据库系统的信息

* @return dbSystem 数据库系统名称 */

public static String getCurrentDBMS(boolean echoable) {

String dbSystem=null;

ResourceBundle rb = ResourceBundle.getBundle("dbsystem");  //读取配置文件

dbSystem=rb.getString(propertiesFileName);

if (echoable)System.out.println("the database system
what you using are "+dbSystem);

return dbSystem;

}

}

(二)
IOperationCore.java(数据库操作接口)

/**

 * 数据库常用操作封装

 */

package database;

 

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.Collection;

 

/** 类名:IOperationCore<br>

 *

 * 作用: 该接口封装了数据库操作的大部分方法<br>

 *

 * 创建人:陶尚明<br>

 */

public interface IOperationCore {

   /** sql更新语句

    *

    * @param
queryString
查询语句

    * @return 返回一个<code>ResultSet</code>结果集

    *

    * @exception
SQLException */

   ResultSet
executeQuery(String queryString) throws SQLException;

   /** 

    * sql更新语句

    *

    * @param
updateString
数据库更新语句

    * @return 更新数据库影响行数

    *

    * @exception
SQLException */

   int
executeUpdate(String updateString) throws SQLException;

   /**

    * 读取行个数

    *

    * @param
queryString
查询语句

    * @return
Transact-SQL
查询后的虚拟表的行数

    *

    * @exception
SQLException */

   int
getRowCount(String queryString) throws SQLException;

   /**

    * 读取列数个数

    *

    * @param
queryString
查询语句

    * @return
Transact-SQL
查询后的虚拟表的列数

    *

    * @exception
SQLException */

   int
getColumnCount(String queryString) throws SQLException;

   /**

    * 读取列名

    *

    * @param columIndex
列索引

    * @param
queryString
提供ResultSet二维表的查询字符串

    * @return
ResultSet
表中的指定的列名

    *

    * @exception
SQLException */

   String
getColumnName(int columIndex, String queryString) throws SQLException;

   /**

    * 读取queryString查询结果集<code>ResultSet</code>表中的所有列名

    *

    * @param
queryString
用于返回<code>ResultSet</code>结果集的语句

    * @return 表中的所有列名

    * @throws
SQLException */

  
Collection<String> getColumnNames(String queryString) throws
SQLException;

   /**

    * 读取queryString查询结果集<code>ResultSet</code>表中的所有字段类型名称

    *

    * @param
queryString
用于返回查询结果集的语句

    * @return 表中的所有字段类型名称

    * @throws
SQLException */

  
Collection<?> getColumnTypeNames(String queryString) throws
SQLException;

   /**

    * 获取ResultSet二维表中指定位置的值,目前只支持mysql

    *

    * @param rowIndex 行索引

    * @param
columnIndex
列索引

    * @param
queryString
产生一个ResultSet结果集的查询语句

    * @return 指定位置的数据记录

    *

    * @exception
SQLException */

   Object
getValueAt(int rowIndex, int columnIndex, String queryString) throws
SQLException;

   /**

    * 释放系统连接资源

    * <br>一旦关闭,数据库的操作将全部无效

    * @exception
SQLException
如果关闭失败将抛出<code>SQLException</code>*/

   void dispose()
throws SQLException;

 

}

(三)
OperationCoreImpl.java(数据库操作接口实现)

package database;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.Collection;

/** 类名:OperationCoreImplements<br>

*

* 作用: 该类实现IOperationCore接口的所有方法<br>

*

* 创建人:陶尚明<br>

*

*/

public class OperationCoreImpl implements
IOperationCore {

protected Connection aConnection = null;

protected Statement aStatement = null;

protected ResultSet aResultSet = null;

protected ResultSetMetaData rsmd = null;

protected static OperationCoreImpl m_instance = null;

/** Singleton 即单例(态)模式,用来生成对象唯一实例的方法

*

* @return OperationCoreImplements的一个实例

* @throws Exception */

public static OperationCoreImpl createFactory() throws Exception {

if(m_instance==null)

m_instance=new OperationCoreImpl();

return m_instance;

}

/** @exception Exception */

private OperationCoreImpl() throws Exception {

init();

}

/**

* 负责初始化Connection连接

* @throws Exception

*/

private void init() throws Exception{

aConnection=ConnectionFactory.getConnection();

}

/**

* 释放系统连接资源

*<br>一旦关闭,数据库的操作将全部无效

*/

public void dispose() {

try {

if(aResultSet!=null)

aResultSet.close();

} catch (SQLException e) {

e.printStackTrace();

}

try {

if(aStatement!=null)

aStatement.close();

} catch (SQLException e) {

e.printStackTrace();

}

try {

if(aConnection!=null)

aConnection.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

/** sql更新语句

*

* @param queryString 查询语句

* @return 返回一个<code>ResultSet</code>结果集

*

* @exception SQLException */

public ResultSet executeQuery(String queryString) {

try {

aStatement =
aConnection.createStatement();

aResultSet =
aStatement.executeQuery(queryString);

} catch (SQLException e) {

aResultSet=null;

e.printStackTrace();

}

return aResultSet;

}

/**

* sql更新语句

*

* @param updateString 数据库更新语句

* @return 更新数据库影响行数

*

* @exception SQLException */

public int executeUpdate(String updateString) {

int effectedRows=0;

try{

aConnection.setAutoCommit(false);

aStatement =
aConnection.createStatement();

effectedRows =
aStatement.executeUpdate(updateString);

aConnection.commit();

}catch(SQLException ex){

System.out.println("数据库写操作失败!");

if(aConnection!=null)

{

try {

aConnection.rollback();

System.out.println("JDBC事务回滚成功");

} catch (SQLException
e) {

System.out.println("JDBC事务回滚失败");

e.printStackTrace();

}

}

}

return effectedRows;

}

/**

* 读取queryString查询结果集<code>ResultSet</code>表中的所有列名

*

* @param queryString 用于返回<code>ResultSet</code>结果集的语句

* @return 表中的所有列名

* @throws SQLException */

public Collection<String> getColumnNames(String queryString) {

ArrayList<String> ColumnNames=new
ArrayList<String>();

try {

aResultSet=executeQuery(queryString);

ResultSetMetaData
rsmd=aResultSet.getMetaData();

int j=rsmd.getColumnCount();

for(int k=0;k<j;k++){

ColumnNames.add(rsmd.getColumnName(k+1));

}

} catch (SQLException e) {

ColumnNames=null;

e.printStackTrace();

}

return ColumnNames;

}

/**

* 读取queryString查询结果集<code>ResultSet</code>表中的所有字段类型名称

*

* @param queryString 用于返回查询结果集的语句

* @return 表中的所有字段类型名称

* @throws SQLException */

public Collection<String> getColumnTypeNames(String queryString)
{

ArrayList<String> ColumnNames=new
ArrayList<String>();

try {

aResultSet=executeQuery(queryString);

ResultSetMetaData
rsmd=aResultSet.getMetaData();

int j=rsmd.getColumnCount();

for(int k=0;k<j;k++){

ColumnNames.add(rsmd.getColumnTypeName(k+1));

}

} catch (SQLException e) {

ColumnNames=null;

e.printStackTrace();

}

return ColumnNames;

}

/**

* 读取列名

*

* @param columIndex 列索引

* @param queryString 提供ResultSet二维表的查询字符串

* @return ResultSet表中的指定的列名

*

* @exception SQLException */

public String getColumnName(int columIndex, String queryString)       {

String columnName=null;

try {

aResultSet=executeQuery(queryString);

rsmd=aResultSet.getMetaData();

columnName=rsmd.getColumnName(columIndex
+ 1);

} catch (SQLException e) {

e.printStackTrace();

}

return columnName;

}

/**

* 读取列数个数

*

* @param queryString 查询语句

* @return Transact-SQL 查询后的虚拟表的列数

*

* @exception SQLException */

public int getColumnCount(String queryString) {

int columnCount=0;

try {

aResultSet=executeQuery(queryString);

ResultSetMetaData
rsmd=aResultSet.getMetaData();

columnCount = rsmd.getColumnCount();

} catch (SQLException e) {

e.printStackTrace();

}

return columnCount;

}

/**

* 读取行个数

*

* @param queryString 查询语句

* @return Transact-SQL 查询后的虚拟表的行数

*

* @exception SQLException */

public int getRowCount(String queryString) {

int rowCount=0;

try {

aResultSet=executeQuery(queryString);

while(aResultSet.next())

rowCount=aResultSet.getInt(1);

} catch (SQLException e) {

e.printStackTrace();

}

return rowCount;

}

/**

* 获取ResultSet二维表中指定位置的值,目前只支持mysql

*

* @param rowIndex 行索引

* @param columnIndex 列索引

* @param queryString 产生一个ResultSet结果集的查询语句

* @return 指定位置的数据记录

*

* @exception SQLException */

public Object getValueAt(int rowIndex, int columnIndex, String
queryString)    {

Object values=null;

try {

aResultSet=executeQuery(queryString);

//指针下移一行

aResultSet.absolute(rowIndex + 1);

values=aResultSet.getObject(columnIndex
+ 1);

} catch (SQLException e) {

e.printStackTrace();

}

return values;

}

}

(四)
DBOperationAdapter.java (对用户透明的数据库操作类)

package database;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.Collection;

/** 类名:DBOperationAdapter<br>

* 作用:
<b>该类中的所有方法对用户透明,提供数据库操作的常用方法</b><br>

*

* 说明:该类使用了<b>Adapter</b>
模式与 <b>Singleton</b> 模式,<br/>

* 类自身为Adpater,OperationCoreImplements为Adapte类;<br>

* 实例化类自生对象的时候用到了Singleton模式,<br>

* 即<code>DBOperationAdapter.getInstance()</code><br>

* 创建人:陶尚明<br>

*/

public class DBOperationAdapter extends
ConnectionFactory {

private static
IOperationCore objIOperationCore = null;

private static
DBOperationAdapter m_instance = null;

private
DBOperationAdapter() {

try {

objIOperationCore=OperationCoreImpl.createFactory();

} catch (Exception e) {

e.printStackTrace();

}

}

public static
DBOperationAdapter getInstance() {

if(m_instance==null)

m_instance=new DBOperationAdapter();

return m_instance;

}

/** sql更新语句

*

* @param
queryString 查询语句

* @return 返回一个<code>ResultSet</code>结果集

*

* @exception
SQLException */

public
ResultSet executeQuery(String queryString) throws SQLException {

return
objIOperationCore.executeQuery(queryString);

}

/**  sql更新语句

*

* @param
updateString 数据库更新语句

* @return 更新数据库影响行数

*

* @exception
SQLException */

public int
executeUpdate(String updateString) throws SQLException {

return
objIOperationCore.executeUpdate(updateString);

}

/**  sql删除语句:updateString

*

* @param
deleteString 数据库插入语句

* @return 删除数据影响行数

*

* @exception
SQLException */

public int
executeDelete(String deleteString) throws SQLException {

return
objIOperationCore.executeUpdate(deleteString);

}

/**  sql插入语句:insertString

*

* @param
insertString 数据库插入语句

* @return 插入数据影响行数

*

* @exception
SQLException */

public int executeInsert(String
insertString) throws SQLException {

return
objIOperationCore.executeUpdate(insertString);

}

/**

* 读取行个数

*

* @param
queryString 查询语句

* @return
Transact-SQL 查询后的虚拟表的行数

*

* @exception
SQLException */

public int
getRowCount(String queryString) throws SQLException {

return
objIOperationCore.getRowCount(queryString);

}

/** 读取列数个数

*

* @param
queryString 查询语句

* @return
Transact-SQL 查询后的虚拟表的列数

*

* @exception
SQLException */

public int
getColumnCount(String queryString) throws SQLException {

return
objIOperationCore.getColumnCount(queryString);

}

/**

* 读取列名

*

* @param
columIndex 列索引

* @param
queryString 提供ResultSet二维表的查询字符串

* @return
ResultSet表中的指定的列名

*

* @exception
SQLException */

public String
getColumnName(int columIndex, String queryString) throws SQLException {

return
objIOperationCore.getColumnName(columIndex, queryString);

}

/**

* 读取queryString查询结果集<code>ResultSet</code>表中的所有字段类型名称

*

* @param
queryString 用于返回查询结果集的语句

* @return 表中的所有字段类型名称

* @throws
SQLException */

public
Collection<?> getColumnTypeNames(String queryString) throws
SQLException {

return
objIOperationCore.getColumnTypeNames(queryString);

}

/**

* 读取queryString查询结果集<code>ResultSet</code>表中的所有列名

*

* @param
queryString 用于返回<code>ResultSet</code>结果集的语句

* @return 表中的所有列名

* @throws
SQLException */

public
Collection<String> getColumnNames(String queryString) throws
SQLException {

return
objIOperationCore.getColumnNames(queryString);

}

/**

* 获取ResultSet二维表中指定位置的值,目前只支持mysql

*

* @param
rowIndex 行索引

* @param
columnIndex 列索引

* @param
queryString 产生一个ResultSet结果集的查询语句

* @return 指定位置的数据记录

*

* @exception
SQLException */

public Object
getValueAt(int rowIndex, int columnIndex, String queryString) throws
SQLException {

return
objIOperationCore.getValueAt(rowIndex, columnIndex,queryString);

}

/**

* 释放系统连接资源

* <br>一旦关闭,数据库的操作将全部无效

* @exception
SQLException 如果关闭失败将抛出<code>SQLException</code>*/

public void
dispose() throws SQLException {

objIOperationCore.dispose();

}

}

(五)
编写数据库配置属性文件

dbsystem.properties

using_which_dbms=mysql

mysql.properties

# mysql
Configuration Parameters

# DB System
requirement:mysql 5.0 or upon

#=================================================

database.driver=com.mysql.jdbc.Driver

database.url=jdbc:mysql://127.0.0.1:3306/webservice

database.username=root

database.password=123456

其中数据库连接地址请各位根据实际情况酌情修改

如上图所示,数据库访问功能模块至此已经编写完毕。

c)     
编写业务模块

(一) 简单java实体类的建立

在src目录下新建一个entity包,下面有一个Student类,与数据库中的student表对应起来

Student.java

package entity;

import java.io.Serializable;

/*

* 学生实体对象

*

*/

public class Student implements Serializable{

private static final long serialVersionUID =
677484458789332877L;

private int id;

private int number;

private String name;

private String tel;

private String address;

/**

* @return the id

*/

public int getId() {

return id;

}

/**

* @param id the
id to set

*/

public void setId(int id) {

this.id = id;

}

/**

* @return the
number

*/

public int getNumber() {

return number;

}

/**

* @param number
the number to set

*/

public void setNumber(int number) {

this.number = number;

}

/**

* @return the
name

*/

public String getName() {

return name;

}

/**

* @param name
the name to set

*/

public void setName(String name) {

this.name = name;

}

/**

* @return the tel

*/

public String getTel() {

return tel;

}

/**

* @param tel the
tel to set

*/

public void setTel(String tel) {

this.tel = tel;

}

/**

* @return the
address

*/

public String getAddress() {

return address;

}

/**

* @param address
the address to set

*/

public void setAddress(String address) {

this.address = address;

}

/**

* @return the serialversionuid

*/

public static long getSerialversionuid() {

return serialVersionUID;

}

public String toString()

{

return this.id +"#"+this.number+"#"+ this.name +"#"+this.tel+"#"+this.address;

}

}

注意此Student类实现了可序列化接口,否则无法正常传输至客户端

(二)Service发布类的编写(核心部分!!!!!!)

在src目录下新建一个entity包,下面有一个TestService类

TestService.java

package service;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

import database.DBOperationAdapter;

import entity.Student;

/*

* WebService测试类

*/

public class TestService {

//返回学生列表信息

public Student[] queryStudents()

{

DBOperationAdapter
dbtools=DBOperationAdapter.getInstance();

Student st = null;

List<Student> retList = new
ArrayList();

try {

ResultSet rs=dbtools.executeQuery("select * from student");

while(rs.next()){

st = new Student();

st.setId(rs.getInt(1));//设置学生ID

st.setNumber(rs.getInt(2));//设置学生学号

st.setName(rs.getString(3));//设置学生姓名

st.setTel(rs.getString(4));//设置学生电话

st.setAddress(rs.getString(5));//设置学生住址

retList.add(st);

}

} catch (SQLException e) {

e.printStackTrace();

}

return retList.toArray(new Student[0]);

}

//测试欢迎方法

public String getGreeting(String
name)

{

return "你好"+name;

}

}

这个类是专门用来发布服务的,对外开放了2个接口方法:queryStudents和getGreeting方法,

其中特别注意queryStudents方法返回值是自定义对象类型(Student)的对象数组,因为webservice不支持

复杂的集合类传递,譬如list和map,需要转化为数组类型或者axis2里的axiom对象模型。这里是转化为

数组类型,axiom对象模型感兴趣的同学可搜索资料进一步学习,这里篇幅所限,不再进行赘述。

d)    
发布服务

在左侧视图点击鼠标右键,选择NewàOther

选择Axis2
Service Archiver

打包编译文件选择myservice工程下\myservice\WebRoot\WEB-INF\classes目录,记得红色标记处的勾选取消掉。

略过wsdl文件选择

将\myservice\WebRoot\WEB-INF\lib 目录下的mysql-connector-java-5.1.7-bin.jar文件

一并打包进来,否则服务无法正常访问mysql数据库

自动设置service.xml配置文件

填写需要发布的webservice名称以及对外开放的服务类名称,服务类名称前面要带包名,

勾选Search declared method only,可以在下面的列表框中看见我们对外发布的方法名。

将打好的aar包发布至tomcat的\webapps\axis2\WEB-INF\services下

点击Run Server启动Tomcat服务

在浏览器中输入:http://localhost:8080/axis2/services/listServices  出现如上图所示页面,红色标注的就是我们自己发布的服务,

点击MyService链接

显示发布服务的wsdl文件

浏览器中输入:http://localhost:8080/axis2/services/MyService/getGreeting?name=guoxingquan
调用getGreeting方法,并传入一个

字符参数,返回欢迎语。

浏览器中输入:http://localhost:8080/axis2/services/MyService/queryStudents 调用queryStudents方法,从数据库中查询学生列表信息

2)    
客户端开发

客户端开发使用了一个struts2工程,struts2工程如何建立不再赘述,我们直接导入myclient工程

源代码下载地址请参考教程的最后部分的附件一览。

导入myclient工程

上图中高亮显示的几个文件是需要重点说明的

a)     
Wsdl文件生成

在左侧视图中点击NewàOther,选择上图所示高亮部分选项

如上图选择

填入之前我们服务端开放的类名,包括包路径,点击Add Folder,将服务端工程的编译文件输出文件夹

加入进来,点击Test Class Loading,继续下一步

注意我们之前发布的服务名称为MyService,请填写正确,继续下一步

继续下一步,完毕

b)    
根据Wsdl文件生成客户端用户存根

在左侧视图中点击NewàOther,选择上图所示高亮部分选项

继续下一步

选择我们刚才生成wsdl文件,注意路径正确

注意红色部分,自动生成的代码会直接放在service包下

如上图进行选择

直接下一步,配置完毕

自动生成的代码为MyServiceCallbackHandler.java和MyServiceStub.java,其中我们这个工程里用到的只有

MyServiceStub.java,这个是根据服务器端在客户端生成的存根代码,自动封装了一系列远程调用配置,以及

对象类型以及方法的转换,大大节约了开发人员的工作量;MyServiceCallbackHandler.java主要牵涉到一系列回调,

感兴趣的同学可以进一步研究,这里不再进行说明。

c)     
业务调用代码

FindstudentsAction.java

package com;

import
java.rmi.RemoteException;

import
service.MyServiceStub;

import
service.MyServiceStub.Student;

import
com.opensymphony.xwork2.ActionContext;

import
com.opensymphony.xwork2.ActionSupport;

public class
FindstudentsAction extends ActionSupport {

public String execute() throws Exception
{

//设置远程服务调用地址

String target =
"http://127.0.0.1:8080/axis2/services/MyService";

try {

//根据地址构造用户存根

MyServiceStub stub = new
MyServiceStub(target);

//调用查询学生列表方法

MyServiceStub.QueryStudentsResponse
qsr = stub.queryStudents();

//返回学生类型对象数组

Student[] sts =
qsr.get_return();

//将数组输出至前台页面

ActionContext.getContext().getSession().put("sts",
sts);

} catch (RemoteException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

return SUCCESS;

}

}

d)    
运行代码

选择Add Deployment发布服务

选择myclient来进行发布

点击Run Server来启动服务

在浏览器中输入:http://localhost:8080/myclient/   点击学生

客户端调用学生查询方法成功。

四、       
附件一览

webservice源代码下载地址:

http://www.xlpan.com/file/4238159/cb8cd3f2-1110-4e46-a036-d0cb32a4856e

axis2之webservice的更多相关文章

  1. axis2开发webservice程序

    一.环境 eclipse + jdk 6.0 + win7 64位 +tomcat7.0 二.创建服务端程序 1.新建web项目,webserviceTest 2.下载axis2,将lib目录下的ja ...

  2. Java借助axis2发布WebService

    Webservice: 1.Xml: 2.WSDL: Web service描述语言(WSDL)就是这样一个基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web service及其函数.参 ...

  3. 使用Axis2实现WebService的发布和调用

    一.Axis2的下载和安装 1.可从http://ws.apache.org/axis2/ 下载Axis2的最新版本:      可以下载如下三个zip包: axis2-1.7.3-bin.zip(用 ...

  4. 使用Axis2编写webservice客户端,服务端

    1.编写客户端 Axis2开发WebService客户端 的3种方式 [参考帖子] http://blog.csdn.net/wangjinwei6912/article/details/851259 ...

  5. 用AXIS2发布WebService的方法

    Axis2+tomcat6.0 实现webService 服务端发布与客户端的调用. 第一步:首先要下载开发所需要的jar包 下载:axis2-1.6.1-war.zip http://www.apa ...

  6. Axis2创建WebService服务端接口+SoupUI以及Client端demo测试调用

    第一步:引入axis2相关jar包,如果是pom项目,直接在pom文件中引入依赖就好 <dependency> <groupId>org.apache.axis2</gr ...

  7. Axis2开发WebService客户端 的3种方式

    Axis2开发WebService客户端 的3种方式 在dos命令下   wsdl2java        -uri    wsdl的地址(网络上或者本地)   -p  com.whir.ezoffi ...

  8. 转载 使用axis2构建webservice

    axis2是可以实现webservice的一个插件,使用这个插件可以发布webservice 1:可以使用这个插件来发布webservice,可以看网址:http://clq9761.iteye.co ...

  9. tomcat 用AXIS2发布WebService 网站的方法

    Axis2+tomcat7.0 实现webService 服务端发布与客户端的调用. Aixs2开发webService的方法有很多,在此只介绍一种比较简单的实现方法. 第一步:首先要下载开发所需要的 ...

随机推荐

  1. 新发现一个函数:GradientFill

    位于Msimg32.dll之中 https://msdn.microsoft.com/en-us/library/windows/desktop/dd144957(v=vs.85).aspx

  2. bzoj1664 [Usaco2006 Open]County Fair Events 参加节日庆祝

    Description Farmer John has returned to the County Fair so he can attend the special events (concert ...

  3. 生成excel文件

    java操作Excel最常用的开源组件有poi与jxl.jxl是韩国人开发的,发行较早,但是更新的很慢,目前似乎还不支持excel2007.poi是apache下的一个子项目,poi应该是处理ms的o ...

  4. C#两个时间的时间差的方法

    今天遇到一问题,计算两个时间的时间差,看网上的写法较为复杂,找到个简单点的,记录下作为自己的总结. 关键函数: DateTime.Subtract 函数解释: 从此实例中减去指定的日期和时间,返回一个 ...

  5. 诺基亚HERE地图

    1.基本图层 2.3D图层 3.卫星图层 4.地形图层 5.在线帮助

  6. UESTC_摩天轮 2015 UESTC Training for Dynamic Programming<Problem K>

    K - 摩天轮 Time Limit: 10000/4000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Submi ...

  7. UESTC_秋实大哥打游戏 2015 UESTC Training for Data Structures<Problem H>

    H - 秋实大哥打游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Subm ...

  8. 【bzoj1031】[JSOI2007]字符加密Cipher

    题目描述 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作:JSOI07 ...

  9. WLW 截屏插件

    转载:http://www.xtit.net/post/1030/ 一直以来用WLW更新博客,刚刚在DailyApps看到一个关于Windows Live Writer的截屏插件,相当不错. 是由MS ...

  10. SQL SERVER中如何格式化日期(转)

    原文地址:http://blog.sina.com.cn/s/blog_95cfa64601018obo.html   1. SELECT convert(varchar, getdate(), 10 ...