国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JSP > 正文

水晶報表的jsp實現(xiàn)

2024-09-05 00:20:01
字體:
供稿:網(wǎng)友

最大的網(wǎng)站源碼資源下載站,

最近為客戶開發(fā)一個mis系統(tǒng),java技術(shù),b/s結(jié)構(gòu).客戶要求系統(tǒng)的報表采用水晶報表.
怎樣在jsp中實現(xiàn)水晶報表呢?找遍了所有的資料,水晶報表的web實現(xiàn)倒是很多,但都講的是微軟的.net方案.jsp中如何實現(xiàn)水晶報表的動態(tài)顯示呢?
經(jīng)過一段時間的痛苦摸索,現(xiàn)在把我的方案介紹給大家,希望各位大哥批評指正我的問題:
需要動態(tài)的顯示水晶報表,并且要根據(jù)我傳遞的一個參數(shù)(bh)的值動態(tài)的顯示數(shù)據(jù).并且要可以把水晶報表導出為word,excel,pdf等格式

我的解決方案:
一:下載 crystal reports 10 for  bea weblogic workshop
二:安裝crystal reports 10 for  bea weblogic workshop;
三:如果安裝成功,則在c:/program files/common files/crystal decisions/2.5/bin目錄下,可以找到crdb_javaserver.ini文件.該文件很重要,里面的內(nèi)容
關系到水晶報表如何訪問數(shù)據(jù)庫.我的水晶報表采用jdbc的方式訪問oracle數(shù)據(jù)庫,配置如下:

[common]
path = c:/bea/jdk141_05/bin
classpath = c:/projects/drivers/jdbc/classes12.jar;
c:/projects/drivers/jdbc/msbase.jar;
c:/projects/drivers/jdbc/mssqlserver.jar;
c:/projects/drivers/jdbc/msutil.jar;
c:/projects/drivers/jdbc/common.jar;
c:/projects/drivers/jdbc/db2fs.jar;
c:/projects/drivers/jdbc/db2java.zip;
c:/projects/drivers/jdbc/db2jcc.jar;
c:/projects/drivers/jdbc/weblogic.jar;
d:/progra~1/ibm/websph~1/applic~1/v5.1.1/runtimes/base_v51/lib/naming.jar;
d:/progra~1/ibm/websph~1/applic~1/v5.1.1/runtimes/base_v51/lib/namingclient.jar;
d:/progra~1/ibm/websph~1/applic~1/v5.1.1/runtimes/base_v51/lib/namingserver.jar;
d:/progra~1/ibm/websph~1/applic~1/v5.1.1/runtimes/base_v51/lib/cmimpl.jar;
d:/progra~1/ibm/websph~1/applic~1/v5.1.1/runtimes/base_v51/lib/j2cimpl.jar;
c:/projects/drivers/jdbc/weblogic.jar;
c:/program files/common files/crystal decisions/2.5/bin/crdbjavaserver.jar;
c:/bea/weblogic81/server/lib/ojdbc14.jar

iorfilelocation = ${temp}
javaservertimeout = 1800
jvmmaxheap = 64000000
jvmminheap = 32000000

[crdb_jdbc]
cacherowsetsize = 100
jdbcurl = jdbc:oracle:thin:@192.168.1.99:1521:pwsc
jndiurl =
jdbcusername = testuser
jdbcdrivername = oracle.jdbc.driver.oracledriver
jndiusername = weblogic
jndiconnectionfactory =
jndiinitcontext = /
genericjdbcdriverbehavior = db2

[crdb_xml]
prereadnbyte = 5000
cacherowsetsize = 100
xmllocalurl =
schemalocalurl =
xmlhttpurl =
schemahttpurl =
usetempfile = true

以上是配置文件,需要說明的是:
1:由于我采用的是jdbc的方式訪問數(shù)據(jù)庫,所以classpath中一定要把c:/bea/weblogic81/server/lib/ojdbc14.jar加進去,它是jdbc的驅(qū)動
2:[crdb_jdbc]中的:jdbcurl = jdbc:oracle:thin:@192.168.1.99:1521:pwsc 是我要訪問的數(shù)據(jù)庫名稱.jdbcusername = testuser是設置用戶名,
  jdbcdrivername = oracle.jdbc.driver.oracledriver是jdbc驅(qū)動名稱

四:在水晶報表編輯器中編輯我要用的報表.由于我需要動態(tài)的給報表傳遞參數(shù),所以我在報表中設置了一個參數(shù)字段,水晶報表根據(jù)這個參數(shù)字段,就可以顯示相應的
數(shù)據(jù),參數(shù)字段命名為bh,在公式編輯器中編寫如下代碼:
if {?bh}<>""  then
{gg_bpbj.jlbh}={?bh}
else
{gg_bpbj.jlbh}="1" or {gg_bpbj.jlbh}<>"1"
以上代碼的意思是:如果bh參數(shù)不為空,則顯示{gg_bpbj.jlbh}等于參數(shù)bh的記錄,否則顯示出所有的記錄
(大家可能覺得{gg_bpbj.jlbh}="1" or {gg_bpbj.jlbh}<>"1"很可笑,是啊,我開始是寫成"true"了,在水晶報表編輯器中可以很好的運行,但方到web上顯示就有
問題,萬般無奈,只有如此了,:( )

五:在weblogic workshop中新建一個web項目,用右鍵選擇該項目文件夾,選擇"新建",選擇"crystal report",則在該web項目根目錄下自動新建了一個
crystalreportviewers10目錄,里面有顯示水晶報表需要的頁面元素系統(tǒng)自動添加了開發(fā)水晶報表需要的jar包,共有13個jar文件(位于web_inf/lib目錄下),
并增加了一些水晶報表專用的標簽(在web_inf/src下)

六:需要特別注意的是:在web_inf下的web.xml文件也隨之改動,改動后的web.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<!doctype web-app public "-//sun microsystems, inc.//dtd web application 2.3//en" "http://java.sun.com/dtd/web-app_2_3.dtd">
<!-- the web.xml file is a configuration file used to control the behavior of weblogic server.
in most cases, you will not need to modify this file. for more information on web.xml, please
consult the web.xml deployment descriptor elements chapter of the "developing weblogic server
applications" documentation on edocs.bea.com. -->
<web-app>
  <display-name>workshop application</display-name>
  <context-param>
    <param-name>weblogic.httpd.inputcharset./*</param-name>
    <param-value>gbk</param-value>
  </context-param>
  <context-param>
    <param-name>crystal_image_uri</param-name>
    <param-value>/webmis/crystalreportviewers10</param-value>
  </context-param>
  <filter>
    <filter-name>pageflowjspfilter</filter-name>
    <filter-class>com.bea.wlw.netui.pageflow.pageflowjspfilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>pageflowjspfilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <listener>
    <listener-class>com.bea.wlw.runtime.core.servlet.webappcontextlistener</listener-class>
  </listener>
  <!-- standard action servlet configuration (with debugging) -->
  <servlet>
    <servlet-name>messageservlet</servlet-name>
    <servlet-class>com.infoearth.servlets.gettaskservlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>com.bea.wlw.netui.pageflow.dynamicsubappactionservlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/web-inf/jpf-struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>config/-global</param-name>
      <param-value>/web-inf/jpf-struts-config--global.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>2</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>2</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>

  <servlet>
    <servlet-name>drawimage</servlet-name>
    <servlet-class>com.infoearth.drawimage.drawimageservlet</servlet-class>
  </servlet>
   
  <servlet-mapping>
    <servlet-name>drawimage</servlet-name>
    <url-pattern>drawimage</url-pattern>
  </servlet-mapping>

  <!-- struts action servlet mappings -->
  <!-- note that because struts takes the *last* mapping here as the extension to add to
         actions posted from forms, we must have *.do come after *.jpf. -->
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.jpf</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>messageservlet</servlet-name>
    <url-pattern>/messageservlet</url-pattern>
  </servlet-mapping>
  <mime-mapping>
     <extension>doc</extension>
     <mime-type>application/msword</mime-type>
  </mime-mapping>
  <mime-mapping>
     <extension>xls</extension>
     <mime-type>application/msexcel</mime-type>
  </mime-mapping>
  <welcome-file-list>
    <welcome-file>login/logincontroller.jpf</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list> 
  <error-page>
    <error-code>500</error-code>
    <location>/error.jsp</location>
  </error-page>
  <!-- define the netui tag library tlds -->
  <taglib>
    <taglib-uri>netui-tags-html.tld</taglib-uri>
    <taglib-location>/web-inf/netui-tags-html.tld</taglib-location>
  </taglib>
  <taglib>
    <taglib-uri>netui-tags-databinding.tld</taglib-uri>
    <taglib-location>/web-inf/netui-tags-databinding.tld</taglib-location>
  </taglib>
  <taglib>
    <taglib-uri>netui-tags-template.tld</taglib-uri>
    <taglib-location>/web-inf/netui-tags-template.tld</taglib-location>
  </taglib>
  <taglib>
    <taglib-uri>/crystal-tags-reportviewer.tld</taglib-uri>
    <taglib-location>/web-inf/crystal-tags-reportviewer.tld</taglib-location>
  </taglib>
</web-app>


其中:

<context-param>
    <param-name>crystal_image_uri</param-name>
    <param-value>/webmis/crystalreportviewers10</param-value>
 </context-param>
 很關鍵,它設置了水晶報表專用的crystalreportviewers10路徑(第五步中自動建的crystalreportviewers10目錄),如果設置錯誤,將來點擊水晶報表自帶的
 導出和打印按鈕是就會報頁面錯誤,并且水晶報表自己的各種翻頁,導出等圖標也無法正常顯示.

七:把編輯好的水晶報表(后綴命為rpt)放在一個目錄下(我自己建了一個report目錄,專門存放報表文件)

八:可以寫程序了:
1.編寫reportinit類.作用:用于傳遞參數(shù)bh.這個類很關鍵,負責把java的參數(shù)值傳遞到水晶報表文件.
2.在頁面流中增加showrpt操作:其實就是實例化一個reportinit類.
3.編寫viewer.jsp文件用來動態(tài)顯示水晶報表.


后面有我的源代碼,請大家批評指正.

存在的問題:
1:水晶報表導出成pdf文件時有問題:漢字顯示為亂碼,不知何故?此問題困擾我?guī)讉€月了,沒法解決
2:無法把打印/導出頁面漢化:在crystalreportviewers10/js目錄下有一系列strings命名的js文件,我猜測是用來國際化頁面的,可是我修改
 strings_zh,js,strings_en.js,沒有什么效果.
3:在瀏覽器中顯示水晶報表后,關閉顯示頁面,該水晶報表依然和數(shù)據(jù)庫連接,(可由select * from v$session 查看oracle的連接數(shù)).如果在
viewer.jsp中加入斷開連接的語句:
viewer.dispose();
rptsource.dispose();
則只能顯示一頁報表.并且打印和導出不能工作.

以上問題困擾我很久,雖然并不影響使用,但心中還是不是很爽.希望高手指點.


源程序:

/*
 * create date: 2004-8-14  11:06
 * create by: 李春雷
 * purpose:設置水晶報表的查詢參數(shù)(目前支持7個參數(shù)的查詢,有用的參數(shù)為編號)
 */


package com.infoearth.report;
import com.crystaldecisions.report.web.viewer.*;
import com.crystaldecisions.sdk.occa.report.data.*;
import com.crystaldecisions.reports.reportengineinterface.jpereportsourcefactory;
import com.crystaldecisions.sdk.occa.report.reportsource.ireportsourcefactory2;
import com.crystaldecisions.sdk.occa.report.reportsource.ireportsource;

public class reportinit
{
    private ireportsource rptsource;
   
    private fields fields;
   
    public reportinit(){
        rptsource = null;
        fields = null;
        }
   
    public ireportsource getrptsource(){
        return rptsource;
        }
       
    public fields getfields(){
        return fields;
        }
       
    public  boolean setreport(string fname,string rptid){
         //獲得查詢條件
        string filename = fname + ".rpt";
        string bh = rptid;
        string path = "report/"+filename; //報表文件路徑        
        try{                       
            ireportsourcefactory2 rsf = new jpereportsourcefactory();
            java.util.locale localetest = java.util.locale.china;
            rptsource = (ireportsource)rsf.createreportsource(path,localetest);
            fields = new fields();
            parameterfield pfield1 = new parameterfield(); //編號
            parameterfield pfield2 = new parameterfield(); //單位
            parameterfield pfield3 = new parameterfield(); //人
            parameterfield pfield5 = new parameterfield(); //field5
            parameterfield pfield6 = new parameterfield(); //field6
            parameterfield pfield4_kssj = new parameterfield(); //開始時間
            parameterfield pfield4_jssj = new parameterfield(); //結(jié)束時間

            values vals1 = new values();
            values vals2 = new values();
            values vals3 = new values();
            values vals5 = new values();
            values vals6 = new values();
            values vals4_kssj = new values();
            values vals4_jssj = new values();

            parameterfielddiscretevalue pfielddv1 = new parameterfielddiscretevalue();
            parameterfielddiscretevalue pfielddv2 = new parameterfielddiscretevalue();
            parameterfielddiscretevalue pfielddv3 = new parameterfielddiscretevalue();
            parameterfielddiscretevalue pfielddv5 = new parameterfielddiscretevalue();
            parameterfielddiscretevalue pfielddv6 = new parameterfielddiscretevalue();
            parameterfielddiscretevalue pfielddv4_kssj = new parameterfielddiscretevalue();
            parameterfielddiscretevalue pfielddv4_jssj = new parameterfielddiscretevalue();
            //設置第一個參數(shù):編號
            pfield1.setreportname("");
            pfield1.setname("bh");
            pfielddv1.setvalue(bh);
            pfielddv1.setdescription("編號");
            vals1.add(pfielddv1);
            pfield1.setcurrentvalues(vals1);
            //設置第二個參數(shù):單位部門
            pfield2.setreportname("");
            pfield2.setname("dw");
            pfielddv2.setvalue("");
            pfielddv2.setdescription("發(fā)單部門");
            vals2.add(pfielddv2);
            pfield2.setcurrentvalues(vals2);
            //設置第三個參數(shù):人
            pfield3.setreportname("");
            pfield3.setname("ren");
            pfielddv3.setvalue("");
            pfielddv3.setdescription("申請人、下達人、操作人、負責人等"); 
            vals3.add(pfielddv3);
            pfield3.setcurrentvalues(vals3);
            //設置第五個查詢字段
            pfield5.setreportname("");
            pfield5.setname("field5");
            pfielddv5.setvalue("");
            pfielddv5.setdescription("查詢字段5:任務來源線路名稱等"); 
            vals5.add(pfielddv5);
            pfield5.setcurrentvalues(vals5);
            //設置第六個查詢字段
            pfield6.setreportname("");
            pfield6.setname("field6");
            pfielddv6.setvalue("");
            pfielddv6.setdescription("查詢字段6:更改原因、工作內(nèi)容等"); 
            vals6.add(pfielddv6);
            pfield6.setcurrentvalues(vals6);
            //設置開始時間
            pfield4_kssj.setreportname("");
            pfield4_kssj.setname("kssj");
            pfielddv4_kssj.setvalue("");
            pfielddv4_kssj.setdescription("開始時間"); 
            vals4_kssj.add(pfielddv4_kssj);
            pfield4_kssj.setcurrentvalues(vals4_kssj);
            //設置結(jié)束時間
            pfield4_jssj.setreportname("");
            pfield4_jssj.setname("jssj");
            pfielddv4_jssj.setvalue("");
            pfielddv4_jssj.setdescription("結(jié)束時間"); 
            vals4_jssj.add(pfielddv4_jssj);
            pfield4_jssj.setcurrentvalues(vals4_jssj);
            //參數(shù)字段和報表關聯(lián)
            fields.add(pfield1);
            fields.add(pfield2);
            fields.add(pfield3);
            fields.add(pfield5);
            fields.add(pfield6);
            fields.add(pfield4_kssj);
            fields.add(pfield4_jssj);
            return true;
            }
        catch(exception e){               
            system.out.println("class:reportinit錯誤:"+e);
            return false;
            }      
    }       
}

 

//在頁面流中增加如下操作:
    /**
     * @jpf:action
     * @jpf:forward name="false" path="error.jsp"
     * @jpf:forward name="success" path="viewer.jsp"
     */
    protected forward showrpt()
    {
        string rptid = this.getrequest().getparameter("rptid");       
        string rptbh = this.getrequest().getparameter("rptbh");
        string rptname = dbctrl.getrptcnname(rptid);
        if ((rptname!=null) && (rptbh!=null)) {
            reportinit rpt = new reportinit();
            boolean result = rpt.setreport(rptname, rptbh);
            if(result==true) {
                fields fields = rpt.getfields();
                ireportsource rptsource = rpt.getrptsource(); 
                this.getsession().setattribute("fields", fields);
                this.getsession().setattribute("rptsource", rptsource); 
                return new forward("success");
            } else {
                return new forward("false");
            }
        }
        return new forward("false");
    }

 

    //viewer.jsp用來動態(tài)顯示水晶報表.viewer.jsp的內(nèi)容如下:
   
<%@ page language="java" contenttype="text/html;charset=utf-8"%>
<%@ page import= "com.crystaldecisions.report.web.viewer.*,
com.crystaldecisions.sdk.occa.report.data.*,
com.crystaldecisions.reports.reportengineinterface.jpereportsourcefactory,
com.crystaldecisions.sdk.occa.report.reportsource.ireportsourcefactory2,
com.crystaldecisions.sdk.occa.report.reportsource.ireportsource"%>
<%@ taglib uri="netui-tags-html.tld" prefix="netui"%>
<%
//fields  rptsource
//string name = (string)request.getattribute("nametest");
//system.out.println("name="+name);
%>
<!-- ../crystalreportviewers10/css/default.css -->
<link rel="stylesheet" type="text/css" href="../crystalreportviewers10/css/default.css">
<%
ireportsource rptsource = (ireportsource)session.getattribute("rptsource");
fields fields = (fields) session.getattribute("fields");
connectioninfos conninfos = new connectioninfos();
iconnectioninfo conninfo1 = new connectioninfo();
conninfo1.setusername("testuser");
conninfo1.setpassword("test");
conninfos.add(conninfo1);
crystalreportviewer viewer = new crystalreportviewer();
viewer.setreportsource(rptsource);
viewer.setdatabaselogoninfos(conninfos);
viewer.setparameterfields(fields);
viewer.setenableparameterprompt(true);
viewer.setownpage(true);
viewer.setownform(true);
viewer.setprintmode(crprintmode.activex);
viewer.sethasexportbutton(true);
viewer.sethasprintbutton(true);
viewer.sethaslogo(false);
viewer.processhttprequest(request, response,getservletconfig().getservletcontext(), out);
viewer.refresh();
//viewer.dispose();
//rptsource.dispose();
%>

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 绿春县| 通州市| 当雄县| 镇原县| 白山市| 舞钢市| 高雄县| 佛冈县| 金华市| 铜山县| 米易县| 林西县| 沛县| 蕲春县| 托克逊县| 定结县| 革吉县| 娄底市| 舞钢市| 张掖市| 砀山县| 隆子县| 玉山县| 金阳县| 壤塘县| 称多县| 大冶市| 高碑店市| 五指山市| 吉木乃县| 白山市| 荔浦县| 枣强县| 米泉市| 临猗县| 左贡县| 扶风县| 岢岚县| 宜良县| 喀喇沁旗| 珲春市|