反饋已提交

網絡繁忙

WebService 程式資料集透過 JDBC 連結取數

1. 概述

1.1 應用場景

在使用 WebService 作為項目的資料源時,希望報表中可以直接呼叫 WebService 資料源,而不是定義資料連結呼叫對應的資料庫表,這樣要怎麼實現呢?

1.2 實現原理

在程式中存取 WebService 應用服務,將 WebService 傳回的資料轉為程式資料集,然後在設計器中呼叫。本文範例透過JDBC 連結直接存取 WebService 資料源取數。

2. 範例

在 Axis2 工程中發佈一個 WebService,然後編寫一個 WebService 程式資料源,在設計器中定義為程式資料集使用。

2.1 準備 WebService 資料源

2.1.1 部署 axis2 伺服器

若您已有搭建好的 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 埠進行調整。


2.1.2 編寫 JDBC 取數類

在 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; // 宣告連結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
}
}
}
}

程式碼編譯透過後,可以看到從資料庫中查詢出的資料,如下圖所示,查詢出 test 表中的資料;同時編譯透過後,將會在編譯器對應工程檔案儲存路徑下生成 MyService.class 類檔案。

注:該程式碼如果出現錯誤,使用者將無法在設計器中查看,只能在 Tomcat 中看到報錯,所以連結之前可以先測試下程式碼是否能正常取數。

2.1.3 發佈 WebService

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.2 定義程式資料源

2.1 節準備好了 WebService 資料源,接下來可以直接在 JAVA 中定義程式資料源。直接透過 JDBC 取數 ,擴展 AbstractTableData,將獲得的資料轉為程式資料集。

2.2.1 準備編譯環境

編譯程式前,需先建立一個 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程式 

2.2.2 編寫 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];
}
// 獲取行數為資料的長度-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();
}
}
}
}

2.2.3 編譯Java檔案

1)Java 檔案編寫完成後,在編譯器中編譯 WebServiceWSDLDataDemo.java ,編譯透過後,Java 編輯器中會顯示對應查詢到的資料,同時將會在對應工程下生成 WebServiceWSDLDataDemo.class 類檔案。如下圖所示:

2)將編譯好的 WebServiceWSDLDataDemo.class 檔案copy到%FR_HOME%/webapps/webroot/WEB-INF/classes/com/fr/data資料夾下。如下圖所示:

注:遠端設計時,本地設計器和遠端伺服器的工程下都需要放置程式資料集對應的 class 檔案。

2.3 建立程式資料集

將 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 檔案後,點選儲存後即完成了程式資料源配置。

2.4 使用程式資料集

配置好程式資料源後便可以使用自訂的程式資料集,與其他類型的資料集使用方法相同,可以透過拖曳方法實現儲存格資料列綁定。如下圖所示:

注:使用程式資料集時,axis 伺服器為啟動狀態。



附件列表


主題: 二次開發
  • 有幫助
  • 沒幫助
  • 只是瀏覽
  • 圖片不清晰
  • 用語看不懂
  • 功能說明看不懂
  • 操作說明太簡單
  • 內容有錯誤
中文(繁體)

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

10s後關閉

獲取幫助
線上支援
獲取專業技術支援,快速幫助您解決問題
工作日9:00-12:00,13:30-17:30在线
頁面反饋
針對當前網頁的建議、問題反饋
售前咨詢
業務咨詢
電話:0933-790886或 0989-092892
郵箱:taiwan@fanruan.com
頁面反饋
*問題分類
不能為空
問題描述
0/1000
不能為空

反馈已提交

网络繁忙