使用axis技術創建webservice(服務端+客戶端)

開發環境:jdk7+eclipse+axis2+tomcat7+MySQL5
操作系統:win7


一、服務端

  1. eclipse集成axis2插件,將圖片中的這兩個壓縮包(網上搜資源)解壓到eclipse根目錄下的plugins文件裏面,重啓eclipse;
    這裏寫圖片描述

  2. 安裝tomcat,將axis2.war文件copy到tomcat根目錄下的webapps文件中,在eclipse中配置tomcat,啓動tomcat,如出現如下界面則安裝成功;
    這裏寫圖片描述
    這裏寫圖片描述

  3. 編寫要發佈的服務代碼:
    數據庫–建庫建表語句:

CREATE DATABASE student;  

DROP TABLE IF EXISTS `admin`;  
CREATE TABLE `admin` (  
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `name` varchar(20) NOT NULL,  
  `username` varchar(20) NOT NULL,  
  `password` varchar(20) NOT NULL,  
  PRIMARY KEY (`id`)  
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;  

LOCK TABLES `admin` WRITE;  
INSERT INTO `admin` VALUES (1,'admin','admin','admin');  
UNLOCK TABLES;  

DROP TABLE IF EXISTS `student`;  
CREATE TABLE `student` (  
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `name` varchar(20) NOT NULL,  
  `sno` varchar(20) NOT NULL,  
  `department` varchar(20) NOT NULL,  
  `hometown` varchar(20) NOT NULL,  
  `mark` varchar(20) NOT NULL,  
  `email` varchar(20) NOT NULL,  
  `tel` varchar(20) NOT NULL,  
  `sex` varchar(20) NOT NULL,  
  PRIMARY KEY (`id`)  
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;  

LOCK TABLES `student` WRITE;  
INSERT INTO `student` VALUES (18,'張三','001','信息科學技術學院','遼寧','80','[email protected]','13888888888','男'),(19,'李四','002','理學院','上海','70','[email protected]','13812341234','男'),(20,'王五','003','外國語學院','北京','88','[email protected]','13698765432','女');  
UNLOCK TABLES;  

服務StudentService

package doc_03_axis.server;

/**
 * 模塊說明: web service interface
 * 
 */
public class StudentService {

    public String say(String str) {
        return str;
    }

    public String sayHello() {
        return "hello world";
    }

    // query
    public Student queryBySno(String sno) {
        StudentDAO sd = StudentDAO.getInstance();
        return sd.queryBySno(sno);
    }

    // add
    public boolean add(Student stu) {
        StudentDAO sd = StudentDAO.getInstance();
        return sd.add(stu);
    }

    // delete
    public boolean deleteBySno(String sno) {
        StudentDAO sd = StudentDAO.getInstance();
        return sd.deleteBySno(sno);
    }

    // update
    public boolean update(Student stu) {
        StudentDAO sd = StudentDAO.getInstance();
        return sd.update(stu);
    }

}

數據訪問StudentDAO

package doc_03_axis.server;

import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 模塊說明:對外接口
 * 
 */
public class StudentDAO {
    private final DBUtil db = DBUtil.getDBUtil();
    private ResultSet rs;
    private static StudentDAO sd = null;

    private StudentDAO() {
    }

    public static synchronized StudentDAO getInstance() {
        if (sd == null) {
            sd = new StudentDAO();
        }
        return sd;
    }

    // add
    public boolean add(Student stu) {
        boolean result = false;
        if (stu == null) {
            return result;
        }
        try {
            // insert
            String sql = "insert into student(name,sno,age,math,chinese,english) values(?,?,?,?,?,?)";
            Object[] param = { stu.getName(), stu.getSno(), stu.getAge(), stu.getMath(), stu.getChinese(),
                    stu.getEnglish() };
            if (db.executeUpdate(sql, param) == 1) {
                result = true;
            }
        } finally {
            destroy();
        }
        return result;
    }

    // delete
    public boolean deleteBySno(String sno) {
        boolean result = false;
        if (sno == null || "".equals(sno)) {
            return result;
        }
        String sql = "delete from student where sno=?";
        String[] param = { sno };
        int rowCount = db.executeUpdate(sql, param);
        if (rowCount == 1) {
            result = true;
        }
        destroy();
        return result;
    }

    // update
    public boolean update(Student stu) {
        boolean result = false;
        if (stu == null) {
            return result;
        }
        try {
            // update
            String sql = "update student set name=?,age=?,math=?,chinese=?,english=? where sno=?";
            Object[] param = { stu.getName(), stu.getAge(), stu.getMath(), stu.getChinese(), stu.getEnglish(),
                    stu.getSno() };
            int rowCount = db.executeUpdate(sql, param);
            if (rowCount == 1) {
                result = true;
            }
        } finally {
            destroy();
        }
        return result;
    }

    // query by sno
    public Student queryBySno(String sno) {
        Student result = null;
        if ("".equals(sno) || sno == null) {
            return result;
        }
        String sql = "select * from student where sno=?";
        String[] checkParam = { sno };
        rs = db.executeQuery(sql, checkParam);
        try {
            if (rs.next()) {
                result = new Student();
                result.setAge(rs.getInt("age"));
                result.setChinese(rs.getInt("chinese"));
                result.setEnglish(rs.getInt("english"));
                result.setMath(rs.getInt("math"));
                result.setName(rs.getString("name"));
                result.setSno(rs.getString("sno"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            destroy();
        }
        return result;
    }

    private void destroy() {
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException se) {
            se.printStackTrace();
        } finally {
            db.close();
        }
    }
}

實體類Student

package doc_03_axis.server;

/**
 * 模塊說明: 實體類Student
 * 
 */
public class Student {
    private String name; // 名字
    private int age; // 年齡
    private String sno; // 學號
    private int math; // 數學成績
    private int chinese; // 語文成績
    private int english; // 英語成績

    public int getTotal() {
        return (math + chinese + english);
    }

    public int getAvg() {
        return getTotal() / 3;
    }

    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;
    }

    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

    public int getMath() {
        return math;
    }

    public void setMath(int math) {
        this.math = math;
    }

    public int getChinese() {
        return chinese;
    }

    public void setChinese(int chinese) {
        this.chinese = chinese;
    }

    public int getEnglish() {
        return english;
    }

    public void setEnglish(int english) {
        this.english = english;
    }

}

數據庫工具類DBUtil

package doc_03_axis.server;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 模塊說明:數據庫工具類
 * 
 */
public class DBUtil {
    private static DBUtil db;

    private Connection conn;
    private PreparedStatement ps;
    private ResultSet rs;

    private DBUtil() {

    }

    public static DBUtil getDBUtil() {
        if (db == null) {
            db = new DBUtil();
        }
        return db;
    }

    public int executeUpdate(String sql) {
        int result = -1;
        if (getConn() == null) {
            return result;
        }
        try {
            ps = conn.prepareStatement(sql);
            result = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }

    public int executeUpdate(String sql, Object[] obj) {
        int result = -1;
        if (getConn() == null) {
            return result;
        }
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < obj.length; i++) {
                ps.setObject(i + 1, obj[i]);
            }
            result = ps.executeUpdate();
            close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }

    public ResultSet executeQuery(String sql) {
        if (getConn() == null) {
            return null;
        }
        try {
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }

    public ResultSet executeQuery(String sql, Object[] obj) {
        if (getConn() == null) {
            return null;
        }
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < obj.length; i++) {
                ps.setObject(i + 1, obj[i]);
            }
            rs = ps.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return rs;
    }

    private Connection getConn() {
        try {
            if (conn == null || conn.isClosed()) {
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection(
                        "jdbc:mysql://127.0.0.1:3306/student?useUnicode=true&amp;characterEncodeing=UTF-8", "root",
                        "root");
            }
        } catch (ClassNotFoundException e) {
            System.out.println("jdbc driver is not found.");
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    public void close() {
        try {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

4、 在tomcat上部署服務,步驟如下:
eclipse–file–new–other–axis2 service archiver
這裏寫圖片描述
這裏寫圖片描述

StudentService爲對外接口
這裏寫圖片描述

部署到D:\Java\apache-tomcat-7.0.65\webapps\axis2\WEB-INF\services
根據具體路徑,自行設置!!!
這裏寫圖片描述

Finish.

5、非常重要的一步!!!

jdbc連接mysql所需的驅動包,必須copy到D:\Java\apache-tomcat-7.0.65\webapps\axis2\WEB-INF\lib下,否則客戶端調用會報錯!!!

6、瀏覽器輸入http://http://localhost:8080/axis2/services/listServices,出現如下界面則部署成功:
這裏寫圖片描述


二、客戶端

1.導入axis2提供的jar包
這裏寫圖片描述

2.客戶端代碼

package doc_03_axis.client;

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

import doc_03_axis.server.Student;

/**
 * 模塊說明: 使用RPC生成客戶端調用已經發布的Web Service
 * 
 */
public class RPCClient {
    private static final String URL = "http://localhost:8080/axis2/services/MyService";
    private static final String TARGET_NAMESPACE = "http://server.doc_03_axis";
    private static final String METHOD = "add";

    public static void main(String[] args) {
        RPCClient client = new RPCClient();
        // 給出方法的參數值
        Student stu = new Student();
        stu.setAge(10);
        stu.setChinese(80);
        stu.setEnglish(90);
        stu.setMath(70);
        stu.setName("wangwu");
        stu.setSno("003");
        Object[] param = { stu };
        // 給出方法返回值的數據類型的Class對象
        Class[] classes = { boolean.class };
        // call
        Object result = client.call(URL, TARGET_NAMESPACE, METHOD, param, classes);
        System.out.println("is successful?: " + result);
    }

    public Object call(String url, String targetNamespace, String method, Object[] param, Class[] classes) {
        Object obj = null;
        try {
            // 使用RPC調用Web服務
            RPCServiceClient serviceClient = new RPCServiceClient();
            Options options = serviceClient.getOptions();
            // 給出要調用的Web服務URL
            EndpointReference targetEPR = new EndpointReference(url);
            options.setTo(targetEPR);
            // 給出要調用的方法及WSDL文件的命名空間
            QName opAddEntry = new QName(targetNamespace, method);
            obj = serviceClient.invokeBlocking(opAddEntry, param, classes)[0];
        } catch (AxisFault e) {
            e.printStackTrace();
        }
        return obj;
    }
}

運行結果:

is successful?: true

僅調用服務的add方法,其他方法可以自行實驗,僅需更改調用所需的參數即可。

end.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章