操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    教學視頻

    ,密碼:98hj

    商業版已推出,采出全新算法,全新設計器,實現百萬條數據秒級加載,價格低至1000/年,詳見:

    報表存儲目錄配置

    在第二小節中,我們介紹如何搭建一個包含的項目,在運行項目后,我們發現在項目的WEB-INF目錄有會自動生成了一個名為“”目錄,這個目錄是提供的默認的報表文件存儲目錄,也就是說默認情況下,將在項目的WEB-INF/目錄下存儲設計好的報表文件。

    默認報表存儲目錄

    如果您的項目在的開發環境運行時,采用的是jetty(比如run-jetty-run插件),那么就可以在項目的WEB-INF目錄下發現一個名為“”目錄。

    但如果你采用運行項目,那么在WEB-INF目錄下就沒有一個名為“”目錄,原因是在中運行,需要創建一個臨時的工作目錄(該目錄一般位于\.\.\org..wst..core\tmp0\\下),所以采用運行項目,則需要到這個臨時的工作目錄下找到對應的項目,再到這個項目的WEB-INF目錄下找到對應的“”目錄。

    運行我們搭建好的項目,打開報表設計器,點擊工具欄上的保存按鈕(

    ),選擇“保存”比較數據源和報表格式,可以看到如下圖所示的彈出窗口:

    \

    在這個窗口,我們只要輸入報表名稱,同時再選擇報表的存儲目的地就,可以保存當前報表文件。可以看到,默認給我們提供的存儲目的地是“服務器文件系統 ”,實際上就是我們項目中WEB-INF目錄下的“”目錄,這個目錄是系統默認自動生成的,如果需要我們可以添加一個屬性來更改這個目錄位置。

    在我們項目的WEB-INF目錄下創建一個名為.,打開位于WEB-INF下名為.xml的配置文件,在其中添加如下Bean以加載這個.文件(如果我們的項目中已有自己的文件,那么直接在這個文件中配置即可)。

    <bean id="propertyConfigurer" parent="ureport.props">
        
            /WEB-INF/config.properties
        
    

    說明

    上面的Bean配置,實際上就是一個標準的org..beans...類配置,我們知道通過配置,可以實現加載外部的作用,所以如果您的項目中已配置了類,那么直接在這個類對應的文件中添加對應的屬性即可,而不需要額外配置.文件。

    打開.文件,在其中添加名為“.”的屬性,該屬性的值用于定義中提供的默認基于文件系統的報表存儲目錄,比如定義該屬性為下面樣式:

    屬性值定義示例

    .=D:/

    表示在D盤根下名為的目錄中存儲報表文件,需要注意的是,這里指定特定目錄時,一定要保存這個目錄已存在,否則將不會被采用,比如上面的D盤下名為的目錄,就需要我們預先創建好。

    自定義報表存儲器

    默認提供的名為“服務器文件系統”的報表存儲機制,實際上是實現了提供的com.bstek....接口,該接口源碼如下:

    package com.bstek.ureport.provider.report;
    import java.io.InputStream;
    import java.util.List;
    /**
     * @author Jacky.gao
     * @since 2016年12月4日
     */
    public interface ReportProvider {
        /**
         * 根據報表名加載報表文件
         * @param file 報表名稱
         * @return 返回的InputStream
         */
        InputStream loadReport(String file);
        /**
         * 根據報表名,刪除指定的報表文件
         * @param file 報表名稱
         */
        void deleteReport(String file);
        /**
         * 獲取所有的報表文件
         * @return 返回報表文件列表
         */
        List getReportFiles();
        /**
         * 保存報表文件
         * @param file 報表名稱
         * @param content 報表的XML內容
         */
        void saveReport(String file,String content);
        /**
         * @return 返回存儲器名稱
         */
        String getName();
        /**
         * @return 返回是否禁用
         */
        boolean disabled();
        /**
         * @return 返回報表文件名前綴
         */
        String getPrefix();
    }

    實現了接口后,只需要將實現類配置到中,讓其成為一個標準的 Bean,這樣就會檢測到它而將其加載。下面是默認提供的名為“服務器文件系統”的報表存儲器源碼:

    package com.bstek.ureport.provider.report.file;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import javax.servlet.ServletContext;
    import org.apache.commons.io.IOUtils;
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.web.context.WebApplicationContext;
    import com.bstek.ureport.exception.ReportException;
    import com.bstek.ureport.provider.report.ReportFile;
    import com.bstek.ureport.provider.report.ReportProvider;
    /**
     * @author Jacky.gao
     * @since 2017年2月11日
     */
    public class FileReportProvider implements ReportProvider,ApplicationContextAware{
        private String prefix="file:";
        private String fileStoreDir;
        private boolean disabled;
        @Override
        public InputStream loadReport(String file) {
            if(file.startsWith(prefix)){
                file=file.substring(prefix.length(),file.length());
            }
            String fullPath=fileStoreDir+"/"+file;
            try {
                return new FileInputStream(fullPath);
            } catch (FileNotFoundException e) {
                throw new ReportException(e);
            }
        }
         
        @Override
        public void deleteReport(String file) {
            if(file.startsWith(prefix)){
                file=file.substring(prefix.length(),file.length());
            }
            String fullPath=fileStoreDir+"/"+file;
            File f=new File(fullPath);
            if(f.exists()){
                f.delete();
            }
        }
        @Override
        public List getReportFiles() {
            File file=new File(fileStoreDir);
            List list=new ArrayList();
            for(File f:file.listFiles()){
                Calendar calendar=Calendar.getInstance();
                calendar.setTimeInMillis(f.lastModified());
                list.add(new ReportFile(f.getName(),calendar.getTime()));
            }
            Collections.sort(list, new Comparator(){
                @Override
                public int compare(ReportFile f1, ReportFile f2) {
                    return f2.getUpdateDate().compareTo(f1.getUpdateDate());
                }
            });
            return list;
        }
        @Override
        public String getName() {
            return "服務器文件系統";
        }
         
        @Override
        public void saveReport(String file,String content) {
            if(file.startsWith(prefix)){
                file=file.substring(prefix.length(),file.length());
            }
            String fullPath=fileStoreDir+"/"+file;
            FileOutputStream outStream=null;
            try{
                outStream=new FileOutputStream(new File(fullPath));
                IOUtils.write(content, outStream,"utf-8");
            }catch(Exception ex){
                throw new ReportException(ex);
            }finally{
                if(outStream!=null){
                    try {
                        outStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
             
        }
        @Override
        public boolean disabled() {
            return disabled;
        }
         
        public void setDisabled(boolean disabled) {
            this.disabled = disabled;
        }
         
        public void setFileStoreDir(String fileStoreDir) {
            this.fileStoreDir = fileStoreDir;
        }
         
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            File file=new File(fileStoreDir);
            if(file.exists()){
                return;
            }
            if(applicationContext instanceof WebApplicationContext){
                WebApplicationContext context=(WebApplicationContext)applicationContext;
                ServletContext servletContext=context.getServletContext();
                String basePath=servletContext.getRealPath("/");
                fileStoreDir=basePath+fileStoreDir;
                file=new File(fileStoreDir);
                if(!file.exists()){
                    file.mkdirs();
                }
            }
        }
        @Override
        public String getPrefix() {
            return prefix;
        }
    }

    禁用系統提供的默認報表存儲器

    如果我們定義了自己的報表存儲器,同時又不想再使用系統默認提供的”服務器文件系統“的報表存儲器,那么我們只需要在之前介紹的.文件中添加一個名為.屬性,將其值設置成true即可。

    通過上面的介紹,可以看到,通過實現接口,我們可以很容易的開發出其它類型的報表存儲器,比如開發一個新的報表存儲器將報表文件存儲到數據庫、FTP等。

    配置報表數據源

    打開的報表設計器,可以看到提供了三種類型的報表數據源,如下圖所示:

    三種類型的數據源分別是直接連接數據庫, Bean以及通過實現com.bstek....接口提供的內置數據源。

    直接連接數據庫比較簡單,就是在項目的中添加好相應數據庫的驅動Jar包后,在彈出的窗口中配置數據源連接信息即可,如下圖所示:

    Bean類型的數據源可以選擇上下文中定義好的一個Bean來作為數據源,點擊

    圖標,在彈出的窗口中輸入數據源名稱及要采用的Bean的ID,如下圖所示:

    保存后,就可以在這個數據源下添加具體的數據集,添加方法就是在這個數據源下右鍵,在彈出的菜單中選擇添加數據集,在彈出的窗口中定義數據集名稱、對應的方法名以及返回對象類型,如下圖所示:

    在 bean數據集配置中,方法名我們可以點擊右側的“選擇方法”按鈕來選擇當前Bean對應的類中定義的方法,但這里對方法的要求是:方法必須要有三個參數,依次是,,Map,比如我們上面定義的里就包含兩個合法的方法,如下所示:

    package com.ureport.test;
    import java.util.List;
    import java.util.Map;
    /**
     * @author Jacky.gao
     * @since 2017年2月7日
     */
    public class TestBean {
        public List> loadReportData(String dsName,String datasetName,Map parameters){
            return null;
        }
        public List> buildReport(String dsName,String datasetName,Map parameters){
            return null;
        }
    }

    所以對于一個合法的Bean數據集方法要有三個參數,分別是,,Map,依次對應數據源名稱、數據集名稱以及外部傳入的參數Map,Bean的方法只有是這種結構才可以選擇。對于數據集方法的返回值,目前來說可以支持兩種類型,一種是我們中返回的Map類型的List集合;另一種就是返回一個POJO類型的List集合,比如像下面的方法:

    public List loadData(String dsName,String datasetName,Map parameters){
        return null;
    }

    在上面的示例方法中,返回的就是User對象集合,這里的User對象,就是一個普通的POJO對象。

    內置數據源

    這種類型的數據源比較數據源和報表格式,要示我們實現接口,同時將接口實現類配置到即可,接口源碼如下:

    package com.bstek.ureport.definition.datasource;
    import java.sql.Connection;
    /**
     * @author Jacky.gao
     * @since 2017年2月9日
     */
    public interface BuildinDatasource {
        /**
         * @return 返回數據源名稱
         */
        String name();
        /**
         * @return 返回當前采用數據源的一個連接
         */
        Connection getConnection();
    }

    接口實現類配置到中后,會自動檢測到,這樣在報表設計器中,點擊數據源頁簽中的

    按鈕,在彈出的窗口中就可以選擇定義好的內置數據源,如下圖所示:

    對于提供的三種類型的數據源,各有其特點及適用場景,對于使用者來說,要根據它們的特點靈活選擇。

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有