最近在开发一个基于数据仓库的报表展示的项目,用的是SSH架构,项目已经开发的差不多了,最近客户又提出了动态首页的需求,具体是这样的:就是不同的用户有不同的报表阅读权限,那么他登陆系统后,首页上的报表也应该针对不同的权限有不同,所以就提出了动态首页的概念。
实现起来,我想到:专门开个动态首页的action,在里面遍历用户的菜单,随机选择几个链接,然后根据链接反射对应业务报表的action中的方法,得到其中的报表数据,再返回给动态首页的jsp。
于是问题来了:跳转业务报表的action中的方法是没有问题,可以实现,但是有去无回啊!!!一句mapping.findForward()就不知道跳到哪里去了,回不到原本调用它的地方了!唉~~~早知如此何必当初呢??我当时要是把封装报表数据的代码全部放到service中该有多好啊(现有的实现是在service中写sql查询数据,action中组装成jsp中要求的报表格式数据)!oh my God!现在杯具了!上百个报表的方法,难道一个个改过来???
[quote]问题补充:
w582875929 写道
如果是新加页面的话原来的获得报表数据的action要做相关调整
处理前台报表的action加个type属性,记录我需要返回的报表的result的name,再跳到指定的报表的相关数据处理action
首先所有首页需要的报表的相关action的result都要多加个前台新页面的result
如果你用的事struts1的话就麻烦点
就要把所有 return resultName(报表页面的结果) 返回页面的地方加个if判断如果type为空的话则正常返回报表,如果不为空说明是前台请求则转向type所指的新前台页面。
如果你用的struts2的话
加个全局的拦截器,在action返回结果之后。判断type的值,如果为空返回action的result结果,如果不为空则返回type所指的result的结果
杯具的是我的项目正好用的是struts1,框架从struts1迁移到struts2方便吗??
其实需求是这样的,就是动态首页要同时显示四个报表Flash,也就是说要同时请求四个普通的action;我想这样做,就是动态首页的action接受到请求后转发给四个业务action去处理,然后action拦截器拦截,转发到动态首页的四个iframe,在iframe内做处理,只显示图表Flash,其他内容不显示,现在问题来了,怎样在动态action内同时转发到四个业务action呢??或者这样也可以:就是在动态action内同时请求四个业务action,并且它们都能返回到调用它的动态action内,然后再forward到动态首页,这样做有个好处,动态首页内就不需要iframe了。[/quote]
你这样做就不能用跳转向action来做,一个action发4个请求(不会)。要么就在前台报表处理的action直接调用需要的4个报表的数据处理service然后跳首页也可以。
或者
你前台的action不做什么处理,就是取4个链接和4个链接的type封装一下再转前台。前台4个报表的iframe就取各自的链接和type去请求就可以了。
struts1 迁移 struts2 建议不要,虽然都叫struts但两个框架的差别很大。个人觉得还是老老实实改result得了(这是我能想到的最简单的方法)。毕竟框架这种东西还是不要随便乱改的好,万一(后果很严重,老板很生气)。
看看还有没有更好的方法 我只是个初级啊 水平有限
用了ssh是为了啥?。。还是多看看别人的例子,可以少走弯路。。提高程序的scalable
[quote]
就是不同的用户有不同的报表阅读权限,那么他登陆系统后,首页上的报表也应该针对不同的权限有不同,所以就提出了动态首页的概念。
[/quote]
既然这样,那直接由一个Action负责根据当前用户的权限查询对应的报表操作,然后返回到页面,页面组装某种展现形式。这样不行吗?
在首页中加iframe链接到相关报表页面。
iframe的src可以动态产生,根据某种规则与你随机选取的用户菜单关联起来应该可以吧
你这页面都发生了变化,那只能新加页面或在原来的报表页面对不要的东西进行控制。
不过你是在原来的基础上扩展项目,前面项目已经稳定了如果该原来的东西对项目可能照成的影响会令你更后悔。
建议还是新做页面,把原来的报表复制变去掉不要的按钮啊什么东西的应该还好改吧,反正可以多算工作量多算钱吗。
[color=brown]毕竟做要比该简单哦(如果该直接做的就另当别论了)-个人感觉[/color]
如果是新加页面的话原来的获得报表数据的action要做相关调整
处理前台报表的action加个type属性,记录我需要返回的报表的result的name,再跳到指定的报表的相关数据处理action
首先所有首页需要的报表的相关action的result都要多加个前台新页面的result
[color=red]如果你用的事struts1的话就麻烦点[/color]
就要把所有 return resultName(报表页面的结果) 返回页面的地方加个[color=red]if[/color]判断如果type为空的话则正常返回报表,如果不为空说明是前台请求则转向type所指的新前台页面。
[color=red]如果你用的struts2的话[/color]
加个全局的拦截器,在action返回结果之后。判断type的值,如果为空返回action的result结果,如果不为空则返回type所指的result的结果