samtiger


QQ:418148757
Name:yangchuan
数据加载中……
DIY mvc框架
 一直都很犹豫,自己写的东西羞于拿出手来,羞于见世面,主要是觉得,东西太简单,代码太丑陋,功能太少。但一直却又有那么一点点冲动,想找个地方说道说道。就好象自己的孩子再不好,也希望碰面了介绍一下,这是我的娃,男娃。
        起因:08年7月有幸外包到了H公司在L市的bi项目组,更有幸的是,我做了我喜欢的前台编码工作。可是,等我开始正式工作的时候,我才发现我接下来的工作的痛苦。这是一个老系统,利用的是struts+spring+hibernate经典框架,应该说这个东西还是很不错的。就是太麻烦了,我们每次修改一个功能或添加一个功能,至少都要接触到4到6个配置文件,其中业务层的bean需要spring配置两个:为本模块加一bean配置,然后又要将这个配置文件的信息包含到一个总的配置文件里。orm持久层的配置:实体bean需要一个配置,(该系统是利用配置文件读取实体bean的配置文件的),所以也要将这个配置文件包含到另一个文件里。mvc配置文件,该模块需要一个配置文件,当然还需要在web.xml里包含这个配置文件。
      另外还有一点,就是struts1有个缺点就是一个action类配置一个actionForm,要不就是用动态的,要不就是继承它的actionform。这样其实很麻烦,比如我有一个增删查改的页面,我就放到一个action类里去处理,其实在这个类里,我有不同的表单,比如,查询表单,实体表单。针对不同的方法,传入不同的表单对象。还有就是对于以简单的增加删除,很希望,不多做任何事情,直接从页面表单一步就到数据库了。struts1倒是能解决这个问题,但是始终是要多写一个actionform类,还要去配置他。总觉得麻烦。

      综上所述:其实我想解决配置文件多和繁琐的问题,另外就是希望mvc框架提供同一个action可以传入不同的表单实体,同一个action方法可以接受多个不同的表单实体。
      我的愚思: 我是这么想的,我觉得,解决配置文件的问题,完全可以利用注解来配置,我们的业务层,持久层完全可以利用注解来解决,甚至我们的mvc其实也可以利用注解来解决。业务层,持久层就不说了,spring+hibernate早就这么干了。至于mvc,其实流行框架也这么干了,不过我就是想DIY一把,利用spring强大的bean管理能力,mvc的action直接就放在spring里了,通过分析请求地址得到bean的名称,从而知道调用哪一个action,分析请求中的特定参数,来确定访问action bean里对应的方法。
     详细: 整个框架因为小,所以仅需要一个filter就可以了,所有的请求都通过这个filter,在它里面我的主要工作就是分析请求地址,取出它里面含有.do的字串作为action bean的name,然后通过spring返回该action对象。通过取出action参数值,做为此次请求需要调用的action 方法。
在调用实际的action之前我们还需要做一个事情,那就是将提交上来的表单,分门别类的装入到不同的javabean里(实体bean,或查询bean),通过注解访问上边找到的action方法,找到该方法对应的@actionForm注解,提取该方法需要的javabean,迭代出每一个bean的属性名称,以及属性类型,并使用propertyManager所管理的不同类型的属性编辑器将表单里对应的数据转化为属性值存入到javabean里。(当然这里需要将表单里的html元素名称与javabean里的属性名称一致)。最后一步,关于action方法的返回,我做了一个处理器。将返回的数据存入到map中,根据需要做不同的返回。
为了方便处理ajax返回,我也DIY了一个json处理器,将所有对象转化成json字串,供前台页面调用。

      个人体会: 这个框架有几个好处,action 类,不用继承任何类,看上去就是一个简单的java类,方法不再依赖request,response对象,方便做单元测试。同一个方法可以传入不同的javabean对象,可直接将持久层对象与表单数据绑定,不用多写额外的actionForm对象。加上spring的注解功能
基本减少了80%的配置信息,而且不容易因为配置失误而出错。方便做权限管理,通过请求,控制action,控制方法,只要分析请求,就可用权限管路业务。
      我的一个案列:后来利用这个框架为客户做了一个考核系统。整体代码应该说好是非常简洁的。比如我的一个简单存储。就如下简单:
          

@Component("/targetAction")
public class TargetAction {

 @Autowired()
 @Qualifier("targetService")
 private ItargetService itargetService;

 @ActionForm(TblBsTargetInfo.class)
 public Object add(Object form, HttpServletRequest request,
   HttpServletResponse response) {
  
      itargetService.saveTarget((TblBsTargetInfo) form);
     return new JsonResultHandler(“ok”);
 }

 






posted on 2009-03-15 11:32 sam.chuan.yang 阅读(303) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: