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中选择对应的程序数据集就可以使用了