历史版本2 :WebService 程序数据集通过 JDBC 连接取数 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

1.部署Axis2

官网下载Axis2的war包http://axis.apache.org/axis2/java/core/download.html

下载好之后解压得到的蓝圈的war包放到tomcat的webapps目录下面,会主动生成一个红圈内的axis2文件夹

访问localhost:8080/axis2  出现这个证明部署成功,这里的端口是根据个人设置的tomcat端口

2.JDBC取数类编写

根据具体的驱动导入相关依赖,下面是MySQL数据库的例子,需要导入mysql的jdbc

package service;   //需定义包名为service,对应之后的文件夹名

import java.sql.*;
import java.util.ArrayList;
import java.util.List;



public class MyService {
    // 定义数据库连接参数
    private static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";   //驱动
    private static final String URL = "jdbc:mysql://localhost:3306/z";         //z为数据库名
    private static final String USERNAME = "root";                             //用户名
    private static final String PASSWORD = "123456";                           //密码

    // 注册数据库驱动
    static {
        try {
            Class.forName(DRIVER_CLASS_NAME);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    // 获取连接
    private static Connection getConn() throws SQLException {
        return DriverManager.getConnection(URL, USERNAME, PASSWORD);
    }

    // 关闭连接
    private static void closeConn(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public List<String> get() throws SQLException {   //方法需要声明为public才能被访问
        List<String> data = new ArrayList<>();
        Connection connection = getConn();
        Statement statement = connection.createStatement();
        String sql = "select id,name from test";             //sql根据自己的需求定义
        data.add("id name");
        try {
            if (statement != null) {
                ResultSet rs = statement.executeQuery(sql);
                while(rs.next()){
                    data.add(rs.getInt(1) + "  " + rs.getString(2).trim());
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                closeConn(connection);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return data;
    }
    //测试
    public static void main(String[] args) {
        List<String> list;
        MyService service = new MyService();
        Connection conn = null;  //声明连接conn
        try {
            conn = MyService.getConn();  //获取连接conn
            list = service.get();        //获取数据
            for (String s : list) {
                System.out.println(s);   //展示获取的数据
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                closeConn(conn);    //关闭连接conn
            }
        }
    }
}

因为这个代码中的问题是无法在设计器中感知,只能在tomcat中看到报错,所以连接之前可以执行下测试代码看是否能正常取数


3.发布WebService

可以先看一下具体流程https://help.fanruan.com/finereport/doc-view-749.html

先构建services.xml文件,里面的中文注释需要去掉,这个文件需要放在%Tomcat_Home%\webapps\axis2\META-INF目录中

<service name="myService">     //service名字可以自己定义
    <description>
        Web Service
    </description>
    <parameter name="ServiceClass">
        service.MyService      //对应包名和类名
    </parameter>
    <operation name="get" >    //函数名
        <messageReceiver  mep="http://www.w3.org/2004/08/wsdl/in-out"
        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    </operation>
</service>

然后就是打包service类了,新建一个ws文件夹,里面的结构是这样

cd到对应文件夹,然后执行打包命令,会生成对应的arr包

然后拷贝这个arr包放到%Tomcat_Home%\webapps\axis2\WEB-INF\services目录中,启动 Tomcat 后,就可以调用这个 WebService 了。(如果启动tomcat过程中出现报错,有可能是包名或者类名,方法名以及文件夹名有出入,需要仔细检查下)

发布成功:


4.编写WebService程序数据集

这里需要在IDE中导入axis2的jar,http://axis.apache.org/axis2/java/core/download.html,下载bin文件,解压后里面的lib,还需要导入fr相关的jar

package com.fr.data;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.fr.general.data.TableDataException;
import com.fr.log.FineLoggerFactory;
import org.apache.axiom.om.*;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;

public class WebServiceWSDLDataDemo extends AbstractTableData {
    private String[][] data; 
     
    public WebServiceWSDLDataDemo() {
        this.data = getWSDLData();
    }
     
    public int getColumnCount() throws TableDataException { 
        return data[0].length; 
    } 
   
    //获取列的名称为数组中第一行的值 
    public String getColumnName(int columnIndex) throws TableDataException { 
        return data[0][columnIndex]; 
    } 
   
    //获取行数为数据的长度-1 
    public int getRowCount() throws TableDataException { 
        return data.length - 1; 
    } 
   
    //获取值 
    public Object getValueAt(int rowIndex, int columnIndex) { 
        return data[rowIndex + 1][columnIndex]; 
    } 

    //取数
    private static String[][] getResults(OMElement element) {
        if (element == null) {
            return null;
        }
        Iterator iterator = element.getChildElements();
        List<String> list = new ArrayList<>();
        while (iterator.hasNext()) {
            OMNode omNode = (OMNode) iterator.next();
            if (omNode.getType() == OMNode.ELEMENT_NODE) {
                OMElement omElement = (OMElement) omNode;
                if (omElement.getLocalName().equals("return")) {
                    String temp = omElement.getText().trim();
                    list.add(temp);
                }
            }
        }
        String[] result1 = list.toArray(new String[list.size()]);
        String results[][] = new String[result1.length][2];   //这里的列数根据自己取出的列数而定,行数当然是有多少取多少
        String b1, b2;
        for (int i = 0; i < result1.length; i++) {
            if (result1[i].length() != 0) {
                b1 = result1[i].substring(0, result1[i].indexOf(" "));
                b2 = result1[i].substring(result1[i].indexOf(" ") + 1);
                results[i][0] = b1;
                results[i][1] = b2;
            }
        }
        return results;
    }

    //获取连接并取数
    private static String[][] getWSDLData() {
        try {
            String url = "http://localhost:8080/axis2/services/myService?wsdl";  //这里的url即为发布的WebService具体地址
            EndpointReference targetEPR = new EndpointReference(url);
            //创建一个OMFactory,下面的namespace、方法与参数均需由它创建
            OMFactory fac = OMAbstractFactory.getOMFactory();
            //命名空间namespace
            OMNamespace omNs = fac.createOMNamespace("http://service", "a");
            //方法
            OMElement method = fac.createOMElement("get", omNs);    //对应方法名
            //参数
            Options options = new Options();
            options.setTo(targetEPR);
            options.setAction("http://service/get");
            //构建请求
            ServiceClient sender = new ServiceClient();
            sender.setOptions(options);
            //发送请求
            OMElement result1 = sender.sendReceive(method);
            return getResults(result1);
        } catch (org.apache.axis2.AxisFault e) {
            FineLoggerFactory.getLogger().error(e, e.getMessage());
        }
        return null;
    }

    //测试
    public static void main(String[] args) {
        String[][] result = getWSDLData();
        if (result != null) {
            int col = result[0].length;
            for (String[] aResult : result) {
                for (int j = 0; j < col; j++) {
                    System.out.print(aResult[j] + " ");
                }
                System.out.println();
            }
        }
    }
}

编写好后可以先测试下


5.FR使用程序数据集

将在第四步里面下载的axis2的相关依赖jar去掉log4j的jar以后放到%FR_HOME%/webapps/webroot/WEB-INF/lib 下面

然后将编译好的WebServiceWSDLDataDemo.class文件放到%FR_HOME%/webapps/webroot/WEB-INF/classes/com/fr/data  下面

然后在fr中选择对应的程序数据集就可以使用了