精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-11-03
最近参与的项目,很多的地方都是需要报表的,因为牵扯各地区的费用及信息广泛。所以光报表就有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的重要。
注:写的时候出了点意外,状态不好,写的不对不好的地方,我会修改。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-11-18
好像有点跑题了,lz的主题还是挺吸引人的。期待lz更好的文章!
|
|
返回顶楼 | |
浏览 2119 次