GridReport报表数据解析及传递,struts自定义result的重要性

最近参与的项目,很多的地方都是需要报表的,因为牵扯各地区的费用及信息广泛。所以光报表就有200多张。看最近项目里报表编写的代码,有些想法,所以记录下来,一是分享,是自己也想吸收大家的意见。(注:这篇文章,不是讲某种报表的配置方法,而是报表应该怎么传输数据,更方便、快捷、有效的一种方案,有什么不足之处,提出来虚心受教,请不要谩骂)

1.大家都知道,报表有很多种,图形报表FusionCharts、锐浪GridReport,数据如何和报表相关(JS文件中有函数),文档中依然写明,不多做阐述。

2.比如FusionCharts的图形报表,它的数据和flash图形文件的数据关联,有xml文件,JSON格式数据。

以上两种方法我个人是不建议使用,xml文件的使用占空间,数据量的大的时候,io操作异常频繁。

JSON格式,数据传输的时候较为麻烦。

3.其实在各种报表的文档中已有方法。就是将xml文件的内容,解析成字符串的形式,但其格式仍然是xml文件内容的格式。只是将xml文件写成一个字符串。

4.正题来了,就是在什么地方将数据转换成报表所需要的数据格式呢?

我看过一些报表,有得人,将数据的格式写成js的变量。

var dataString ='<chart yAxisName="Sales Figure" caption="Top 5 Sales Person" numberPrefix="$" useRoundEdges="1" bgColor="FFFFFF,FFFFFF" showBorder="0">\n\
	<set label="Alex" value="25000"  /> \n\
	<set label="Mark" value="35000" /> \n\
	<set label="David" value="42300" /> \n\                             NO!!!!!!!!!!!!!!!!!!!!!!
	<set label="Graham" value="35300" /> \n\
	<set label="John" value="31300" />\n\
\n\
</chart>';

 然后他可以把数据库中的数据取出,经过ajax请求后,将value值替换。

这种方式不可取,如果我需要将label是可变的,那怎么办,当然也有办法,不过很笨。

再着,我200张报表都这么写,我相信我会很恶心。  也不利于维护。

5.在action,bo,dao,解析都是不应该的。 这样的话,我们就需要一个类特殊的类,去解析这些数据,去格式化这些数据。

6.方法:

struts的自定义result类型,就是我们所需要的了。

(1)定义一个GridReportResult类,然后我们这里将数据格式化。细节部分我就不多说了。

比如:

public class GridResult extends BaseResult// BaseResult基础返回结果抽象类
{
	private static Logger log = Logger.getLogger(GridResult.class);

	protected void doExecute(String arg0, ActionInvocation invocation) throws Exception
	{
		// TODO Auto-generated method stub
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/json;charset=" + request.getCharacterEncoding());
		PrintWriter output = response.getWriter();

		StringBuffer sb = new StringBuffer();// 报表数据字符串
		try
		{

			BaseAction baseAction = (BaseAction) invocation.getAction();

			sb.append("<report>\n");
			sb.append("<xml>\n");

代码过多就不贴了。大家应该能明白我的意思。
 

(2)在struts的配置文件中去定义

<action name="getGridXml" class="base.web.actions.report.GridReportAction"
			method="getReportXml">
                     <!-- gridResult自定义返回类型-->
			<result name="success" type="gridResult"></result>
		</action>

(3)js中获取数据,ajax的方法,我就不多说了。获取result直接是一个格式化好数据,那我就可以直接给相应的函数了,不需要自己再次格式化了。

GridReport ---------------> data格式

就是---------------->gridResult

综上所述,我想说的就是报表所需的格式化的数据,我们都可以用一个自定义的result给他封装好,那么我们js中所获得的数据,就很简单了。

100张同一类型的报表,我都可以使用这一个gridResult 结果类型。

由此可见,struts自定义result的重要。

注:写的时候出了点意外,状态不好,写的不对不好的地方,我会修改。