zoukankan      html  css  js  c++  java
  • axis2之webservice

    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

  • 相关阅读:
    利用string 字符串拷贝
    新手学vim配置
    进程描述符task_struct
    并查集
    堆Heap
    Bitset位图
    排序
    sql时间查询
    javascript 中的 call
    css 笔记——设置禁用中文输入法
  • 原文地址:https://www.cnblogs.com/soulaz/p/5567060.html
Copyright © 2011-2022 走看看