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的重要。
注:写的时候出了点意外,状态不好,写的不对不好的地方,我会修改。