现在一直在用SpringMVC做开发,对于SpringMVC,一直觉得有个值得改进的地方,如何让设计与开发真正分离。先废话下原由:自从2.5开始,通过VelocityLayoutViewResolver使用模板,简化了页面设计,但是仅仅简化的是页面设计,对于后台的Controller代码,一点儿也没有减少,仍然是要在一个方法内取出所有页面所需要的数据。这与Layout模板相违背:Layout模板让我们只关心主页面,而把边角小页面通过#parse('')解决了,不必关心小页面的设计,但是我们仍然要在Controller中取出所有的数据,因为#parse('')只是简单的渲染下页面,它没有取数据的能力!我的想法:增加一个标签,让小页面也有取数据的能力!增加自定义标签#tile('/.../小页面.tile'),与@Controller相对应的,增加一个@Tile注解,让@Controller与@Title各司其职。执行逻辑:一个Http请求过来,$screen_content由主逻辑@Controller来填充,#tile('/.../小页面.tile')由@Tile来填充,其它的不变。预期效果:各个页面负责自己的执行逻辑和数据,小页面的数据不再依赖主页面的@Controller取得,做到页面设计和业务逻辑真正的分离!我目前的实现:由于需要扩展SpringMVC,我做不来,所以即没有增加#tile('')标签,也没有增加@Tile注解。用的是一个ToolBox,tileTool.getHtml('http://xxx/a.tile'),getHtml(String url)实现是通过HttpClient抓取页面内容,然后返回。这样做就是产生多次Http请求,效率会很低的。这个问题一直困扰着我,不知各位XDJM们,有没有解决办法,谢谢!

解决方案 »

  1.   

    个人感觉你这样会导致非常乱。
    这个本来是一个标准的很好理解的MVC框架,但是你这样改动以后会导致VC部分混杂在一起,代码的可读性会非常差。而且不利于维护。
      

  2.   

    你这个应用这么精细了,Spring再支持的话就有点过了!
      

  3.   

    可能是我没有说明白,再补充下:用户故事1:主页由10块组成,每块内容都是动态的;
    用户故事2:信息展示页面由主页面(信息内容)和10块其它相关小页面Tile组成,每块内容都是动态的;解决方法:一个请求对应一个Controller,在这个Controller里取出所有的数据,然后渲染展示。这也是目前SpringMVC的做法。问题1:其实我只关心主页面的内容,对于其它小页面,我不关心,因它它们和我的主页面没有太大的关联;
    问题2:那天模板(Layout)变了,我得修改Contrller了;扩展改进:对于一次请求对应一个主页面,这个Controller取出所有主页面关心的数据,对于其它小页面,我用一种比Controller功能一样,但是不做独立渲染的方面取数据,最后它们把渲染的结果合并一块,输出!
      

  4.   

    昨晚无意中看了下Apache Turbine文档,原来已经有这种功能了,呵呵。可惜Turbine文档太少,到现在一个HelloWorld也没有弄出来。
      

  5.   

    突然发现Velocity有个EventCartridge,把它attach到Context后,但最后render时可以修改内容!!我们何不利用这个特性,在最后render的时候,执行相关的操作?为了让SpringMVC执行自定义的Tile,那么现在问题就是:需要增加HandlerMapping,HandlerAdapter;修改VelocityLayoutView,最后在描述@Controller注解时描述@Tile注解,呵呵,有点难度。想法比较美好,但实现可能就有点难度了,呵呵。