反饋已提交
網絡繁忙
在使用 WebService 作為項目的資料源時,希望報表中可以直接呼叫 WebService 資料源,而不是定義資料連結呼叫對應的資料庫表,這樣要怎麼實現呢?
在程式中存取 WebService 應用服務,將 WebService 傳回的資料轉為程式資料集,然後在設計器中呼叫。本文範例透過JDBC 連結直接存取 WebService 資料源取數。
在 Axis2 工程中發佈一個 WebService,然後編寫一個 WebService 程式資料源,在設計器中定義為程式資料集使用。
若您已有搭建好的 axis2 伺服器,請忽略此步驟。
1)使用者自行下載並安裝 JDK 和 Web 應用伺服器來配置部署的環境,本文範例使用 Tomcat 伺服器部署,所以部署前提前準備好了一個 Tomcat 伺服器。
2)從 Axis2官網 下載 War 包,如下圖所示:
3)將下載的部署包解壓,把部署包中的 axis2.war 行動到%Tomcat_Home%\webapps目錄下。重啟 Tomacat 伺服器,該目錄下自動生成一個資料夾 axis2。如下圖所示:
4)啟動 Tomacat 伺服器後,瀏覽器輸入伺服器存取地址可以存取即成功。如下使用本地伺服器,瀏覽器存取 localhost:8080/axis2 ,出現部署成功頁面,即部署成功。如下圖所示:
注:存取 URL 需要根據伺服器 IP、個人設定的 Tomcat 埠進行調整。
在 Java 編輯器編寫一個 JDBC 取數類,編譯前,需要在 Java 工程環境中引入對應的 JDBC 資料庫驅動,本文以 MySQL 資料庫為例,所以首先需要引入 MySQL 的 JDBC 驅動。如何引入可參考:編譯Java程式
注:使用者使用時,將程式碼中的資料庫資訊和資料查詢語句更換為使用者自己的資料庫資訊和查詢語句。
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; // 宣告連結conntry {conn = MyService.getConn(); // 獲取連結connlist = service.get(); // 獲取資料for (String s : list) {System.out.println(s); // 展示獲取的資料}} catch (SQLException e) {e.printStackTrace();} finally {if (conn != null) {closeConn(conn); // 關閉連結conn}}}}
程式碼編譯透過後,可以看到從資料庫中查詢出的資料,如下圖所示,查詢出 test 表中的資料;同時編譯透過後,將會在編譯器對應工程檔案儲存路徑下生成 MyService.class 類檔案。
注:該程式碼如果出現錯誤,使用者將無法在設計器中查看,只能在 Tomcat 中看到報錯,所以連結之前可以先測試下程式碼是否能正常取數。
1)建立 services.xml 檔案並放在%Tomcat_Home%\webapps\axis2\META-INF目錄下。services.xml 內容如下:
<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>
2)打包 service 類。建立一個 WS 資料夾,裏面再建立兩個子資料夾 META-INF 和 service。如下圖所示:
將 1)中準備的 services.xml檔案放到 META-INF 資料夾中;將 2.1.2 中生成的 JDBC 取數類 MyService.class 放在
service資料夾中。如下圖所示:
3)將 WS 資料夾打包生成 .aar 檔案。在 Windows 控制台使用 cd 命令進入 WS 資料夾所在的目錄,並輸入如下命令生成 ws.aar 檔案。如下圖所示:
jar cvf ws.aar .
在 WS 資料夾內即可看到 ws.aar 檔案。如下圖所示:
4)呼叫 WebService。將 ws.arr copy到%Tomcat_Home%\webapps\axis2\WEB-INF\services目錄下,啟動 Tomcat 後,就可以呼叫這個 WebService 了。
啟動成功後,存取 http://localhost:8080/axis2/services/MyService?wsdl ,出現如下頁面,即發佈成功。
2.1 節準備好了 WebService 資料源,接下來可以直接在 JAVA 中定義程式資料源。直接透過 JDBC 取數 ,擴展 AbstractTableData,將獲得的資料轉為程式資料集。
編譯程式前,需先建立一個 Java 工程環境,並且需要一個 Java 編輯器,如 Eclipse 或 idea 。
在編輯器工程中匯入 FineReport 工程 JAR 包。包括安裝的報表工程
%FR_HOME%/lib下的所有的包,
%FR_HOME%/server/lib 下的所有包,
%FR_HOME%/webapps/webroot/WEB-INF/lib下的所有包,
還要引入 JDK 下的的 tools.jar,
還需要引入%AXIS2_HOME%/web-inf/lib下面的 JAR 包,
從 Axis2官網 下載 bin 檔案,解壓後將 lib 資料夾中的 JAR 包引入 java 工程中。詳細操作可參考:編譯Java程式
在編輯器中編寫 Java 檔案 WebServiceWSDLDataDemo.java, 完整程式碼可參見:
注:編譯中若出現資料庫驅動缺失問題,可以在 2.2.1節 axis 伺服器的 lib、Tomcat 的 lib 下引入對應的資料庫驅動。
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];}// 獲取行數為資料的長度-1public 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();// 命名空間namespaceOMNamespace 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();}}}}
1)Java 檔案編寫完成後,在編譯器中編譯 WebServiceWSDLDataDemo.java ,編譯透過後,Java 編輯器中會顯示對應查詢到的資料,同時將會在對應工程下生成 WebServiceWSDLDataDemo.class 類檔案。如下圖所示:
2)將編譯好的 WebServiceWSDLDataDemo.class 檔案copy到%FR_HOME%/webapps/webroot/WEB-INF/classes/com/fr/data資料夾下。如下圖所示:
注:遠端設計時,本地設計器和遠端伺服器的工程下都需要放置程式資料集對應的 class 檔案。
將 2.2.1 節下載的 %AXIS2_HOME%/lib下面的 JAR 包(除了log4j 的 JAR,會衝突),copy到報表工程%FR_HOME%/webapps/webroot/WEB-INF/lib 下,copy成功後重啟工程,即完成報表環境引用第三方 JAR 包。如將 JAR 包copy到設計器%FR_HOME%/webapps/webroot/WEB-INF/lib 下,copy成功後重啟設計器。如下圖所示:
設計器開啟後,建立範本,點選範本資料集下面的加號,選擇「程式」資料集,在彈出的程式資料集對話框中,選擇對應的 class 檔案,如下圖所示:
選定 class 檔案後,點選儲存後即完成了程式資料源配置。
配置好程式資料源後便可以使用自訂的程式資料集,與其他類型的資料集使用方法相同,可以透過拖曳方法實現儲存格資料列綁定。如下圖所示:
注:使用程式資料集時,axis 伺服器為啟動狀態。
滑鼠選中內容,快速回饋問題
滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。
不再提示
10s後關閉
反馈已提交
网络繁忙