Aurora????Birt??

2012-02-01 12:37:18by bobbie.zou

Aurora安装部署Birt报表

说明

下面的示例以Tomcat作为应用服务器,以hap作为Aurora应用的上下文。Birt应用配置,指的是部署birt的tomcat;Aurora应用配置,指的是部署Aurora应用的tomcat。其他应用服务器如weblogic和websphere的部署,请参考此文档以及相关应用服务器下面的安装部署文档。

Birt应用配置

1.Birt Runtime下载

下载BIRT3.7以上版本的Runtime 下载地址 (Birt2.x版本在使用动态sql时有内存回收bug,所以推荐birt3.7版本以后的版本)

2.Birt Runtime部署

  1. 1)将下载的Runtime文件解压缩之后可以看到WebViewerExample文件夹,这个是Brit Runtime提供的部署示例文件夹。将这个文件夹拷贝到需要部署Birt 的路径下,将文件夹名字改为方便识别的名字,为了方便举例我们将这个文件夹改名为birtViewer。

  2. 2)在../birtViewer/WEB-INF/lib目录中找到org.eclipse.birt.runtime_3.7.XXXXXX.jar,查看jar中的fontsConfig.xml文件。 在里面找到 <font-path>节点,将需要的字体文件上传到配置的任一目录中,然后给字体文件授权。

  3. 3)配置Context上下文,将birtViewer的上下文Context path配置成与Aurora应用上下文相同 ,这里示例为hap

    <Context path="/hap" docBase="[RealPath]/birtViewer" crossContext="true" debug="0" reloadable="false">
    </Context>
  4. 4)启动Tomcat,在浏览器中测试是否部署成功。

    5)访问报表的地址为http://[ip]:[port]/hap/preview?__report=[path/report_name][&__format=pdf]

3.Tomcat数据源JNID配置

1)安装JDBC驱动

把JDBC.jar(如classes12.jar)放到Tomcat目录下common/lib下,注意如果放在shared/lib下则使用JNDI的时候无法找到

2)配置Tomcat server.xml

conf目录下server.xml文件的全局命名资源GlobalNamingResources元素内添加一项Resource属性

<GlobalNamingResources>
<!-- Test entry for demonstration purposes -->
       <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
       <!--Editable user database that can also be used by UserDatabaseRealm to authenticate users -->
       <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
       description="User database that can be updated and saved"
       factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
       pathname="conf/tomcat-users.xml" />
<!--  新添加的Resource  -->
	<Resource name="jdbc/plm"  
              type="javax.sql.DataSource"  
              password="plm"  
              driverClassName="oracle.jdbc.driver.OracleDriver"  
              maxIdle="10"  
              maxWait="3000"  
              username="plm"  
              url="jdbc:oracle:thin:@10.26.99.101:1521:JXCPLM"  
              maxActive="100"/>   
 </GlobalNamingResources>
 

Table 1. Resource标记属性

属性描述
name指定Resource的JNDI名字
auth指定管理Resource的Manager,它有两个可选值:Container、Application
type指定Resource所属的Java类名
factory指定生成的DataResource的factory类名
maxActive指定数据库连接池中处于活动状态的最大连接数目,0表示不受限制
maxIdle指定数据库连接池中处于空闲状态的最大连接数目,0表示不受限制
maxWait指定获取连接池中连接等待最长时间,超过会抛出异常,-1表示无限
username指定连接数据库的用户名
password指定连接数据库的口令
driverClassName指定连接数据库的JDBC驱动程序
url指定连接数据库的URL

3)配置context

数据源配置完成后,还须配置相关的上下文信息context,来使程序获得JDNI初始化引用,从而定位数据源。由于之前定义的是全局资源,我们可在Context元素中加入关联属性:

<Context path="/hap" docBase="[realPath]/birtViewer" crossContext="true" debug="0" reloadable="false">
	<ResourceLink name="jdbc/plm" global="jdbc/plm" type="javax.sql.DataSource"/>
</ Context>

4)配置birtViewer的web.xml

在birtViewer/WEB-INF/web.xml文件尾部添加

<resource-ref>  		  
	<res-ref-name>jdbc/plm</res-ref-name>  
	<res-type>javax.sql.DataSource</res-type>  
	<res-auth>Container</res-auth>  
</resource-ref>

5)测试数据源连接

下面提供一个jsp文件测试数据源是否配置成功,此jsp文件必须放置在birtViewer目录下

<%@ page import="javax.naming.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="java.sql.*" %>
<html>
	<head>
		<title>Oracle JDBC Test</title>
	</head>
	<body>
<%		
	Connection conn = null;
	Statement stmt = null;
	ResultSet rs = null;
	ResultSetMetaData md = null;
	try{		
		Context initCtx=new InitialContext();
		//获得JNDI初始化上下文信息,即获取目录上下文的引用
		DataSource ds=(DataSource)initCtx.lookup("java:comp/env/jdbc/plm");
		//定位数据源jdbc/plm
		if(ds!=null){
			out.println("get DataSource");
			out.println(ds.toString());
			conn=ds.getConnection();
			if(conn!=null){
				out.println("create connection sucess!");
				stmt=conn.createStatement();
				out.println("createStatement Success!");
				//查询sql
				rs=stmt.executeQuery("select * from sys_service");
				md=rs.getMetaData();
				out.println("<table border=1>");
				out.println("<tr>");
				for(int i=0;i<md.getColumnCount();i++){
					out.println("<td>"+md.getColumnName(i+1)+"</td>");
				}
				while(rs.next()){
					out.println("<tr>");
					out.println("<td>"+rs.getString(1)+"</td>");
					out.println("<td>"+rs.getString(2)+"</td>");
					out.println("<td>"+rs.getString(3)+"</td>");
					out.println("<td>");
				}
				out.println("</table>");
			}
		}
	}catch(Exception e){
		out.println(e.toString());
		System.out.println(e.toString());
	}finally{		
		try{
			if(conn != null)
				conn.close();
		}catch(Exception e1){
		}
		try{
			if(stmt != null)
				stmt.close();
		}catch(Exception e2){
		}
		try{
			if(rs != null)
				rs.close();
		}catch(Exception e3){
		}		
	}
%>
	</body>
</html>

Aurora应用配置

1.添加HttpServlet

1)添加HttpServlet

修改../hap/WEB-INF/web.xml文件,添加如下代码

<servlet>
	<servlet-name>birtForward</servlet-name>
   	<servlet-class>aurora.application.features.HttpForward</servlet-class>
  	<init-param>
   		<param-name>address</param-name>
		<!--必须定义到birtviewer的servlet监听地址-->
   		<param-value>http://127.0.0.1:8090/hap/preview</param-value>
  	</init-param>
  	<init-param>
  		<!--验证访问权限proc,如果不配置此参数,自动跳过验证-->
		<param-name>procedure</param-name>
		<param-value>birt.access_check</param-value>
	</init-param>
	<init-param>
		<!--Bm验证结果的返回路径,验证失败返回的是错误信息,验证成功返回null-->
		<param-name>output</param-name>
		<param-value>/birt/@return</param-value>
	</init-param>
</servlet>   
<servlet-mapping>
 	<servlet-name>birtForward</servlet-name>
	<url-pattern>/preview</url-pattern>
</servlet-mapping>
			

2)访问报表Url

http://[ip]:[port]/preview?__report=[path/reportName][&parameter=][&__format=pdf]

2.权限验证

1)原理

服务端在转发报表请求之前,会先执行procedure参数配置的proc,然后从context中通过output配置的路径获取验证返回结果,如果验证失败返回http500错误信息

2)验证proc代码如下

<?xml version="1.0" encoding="UTF-8"?>
<p:procedure xmlns:a="http://www.aurora-framework.org/application">
  <a:model-execute model="birt.access_check"/>	     
</p:procedure>
				

3)验证Bm代码如下

<?xml version="1.0" encoding="UTF-8"?>
<bm:model xmlns:bm="http://www.aurora-framework.org/schema/bm">
  <bm:operations>
    <bm:operation name="execute">
      <bm:parameters>
        <bm:parameter name="return_value" dataType="java.lang.String" input="false" output="true" 
        outputPath="/birt/@return" required="false"/>
      </bm:parameters>
      <bm:update-sql>           		
      begin
	  ${@return_value}:= SYS_REPORT_AUTHOR_PKG.check_report_author(${/session/@user_id},${/parameter/@param});  				 
      end;           	
      </bm:update-sql>
    </bm:operation>
  </bm:operations>
</bm:model>
				

4)数据库验证机制

请查看附件中文档"Hec2下的报表定义与权限分配.doc"

特别说明

  1. 1.报表模板放置的路径是birtViewer文件夹,而不是hap文件夹

  2. 2.原理是通过Aurora服务端发送Http请求到Birt服务端。Aurora服务端接收Birt服务端返回的结果,再返回给客户端浏览器。如果Birt服务端返回的是文件,如:PDF、Excel、Doc等,那么文件是在Birt服务端已经生成好的。那么报表中引用的资源文件,如图片等目录是针对birtViewer的路径。如果Birt服务端返回的是Html的形式,那么Birt服务端返回的是Html代码。Aurora服务端将从Birt服务端接收的Html代码发送给客户端浏览器解析, 那么报表引用的图片等路径,针对的是Aurora下的路径。比如html通过图片显示条码,是配置在Aurora项目下面的web.xml中,而不是birtViewer项目下的web.xml中。 如果出现图片无法显示的情况,查看html的源码信息,看 图片引用的Aurora路径下面是否可以找到图片。

  3. 3.部署正式环境的时候,需要将在防火墙中将birt应用的tomcat端口屏蔽掉。这样只能通过权限验证通过的转发机制访问报表。

Demo

    Comments

    0 Responses to the article

    暂时没有评论。

    发表评论