Ruby on Rails 他山的宝石 - 改进我们的struts!

ROR的飓风劲吹,仁者心动。
我们开发团队mvc一直是用struts,我准备用它的 convention over configuration  之风清洗一下我们的struts使用,顺便把CRUD通用业务操作也完善起来,重复的工作让它最简,且保留扩展点。在看ROR的帖子时扫到了Jdonframework,也借鉴了一些思路。
       下来我把基本的思路描述一下:
       ROR用约定的url格式+反射简化了大量配置xml内容,如下:
       http://localhost/app[b]/user/view/3,明显,前缀user代表DomainObject,后面的view代表业务方法,最后为id参数.
      首先,在struts中,我完全支持粗粒度的Action设计,即一组相关操作置入一个DispatchAction,这个类的用法不简洁,需要在ActionMapping节点中配上parameter="method",然后采用这种url:
http://localhost:8080/app/user.do?method=view&id=1
无疑,ROR的方式更自然和简洁一些。这一步修改并不复杂,我重载ActionServlet(只重载RequestProcessor类就可以了),使其默认的根据Path寻找action的规则变成:首先全路径查找,如果找不着,使用前缀查找,如:
http://localhost:8080/app/user/view.do?id=3,首先会根据/user/view在struts-config.xml中查,若查不到,再用/user查。这样作的目的是:一个UserAction假如有CRUD等方法,还是要配置两处的,因为涉及表单的ActionMapping得有input节点和name(action form),而只读操作并不需要这些,这也是struts的一处硬伤。


接下来,我们扩展一下DispatchAction,预制view、delete、edit这几个常用方法,抽取其共同流程(按约定),并留出扩展点,url中的后缀,即view就以是Action中的方法了,

由于我们是采用spring+hibernate+struts的,并不能完全的DDD,所以,在action中根据前缀定位到Manager的实例,来方便一些通用的CRUD操作(原先我的设想是用spring接管action,注入一些特性,但现在这种用url反射的方法更简单一点)。

另外,在传统的struts-config.xml中有很多看起来冗余的配置项,例如:
<action type="xxx" input="/edit/xxx.jsp">
    <forward name="success" path="/edit/xxx.jsp"/>
</action>
这个forward一般情况下就是一个多余配置,95%以上的表单错误信息都会显示在编辑jsp页本身上。

稍微复杂一点的是edit动作,它隐藏了readyAdd、readEdit、insert、update这几个分支,完全用url中的参数或表单中用于过渡的令牌字来判断,保存操作涉及一个manyToOne属性的问题。我会在我的domain包中建一个RelationshipMapping类和一个单例的RelationshipMappingRegistry类,来辅助处理它。


至于扩展点,我想至少有这几个:
propected void populateObject(HttpServletRequest request, Object object, ActionForm form);
protected void populateForm(AbstractEditorForm form, DomainObject object);
 protected void refererData(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) ;

从名字可以看出,populateObject是负责把domain object正确地解析为dto(即ActionForm)的,而populateForm刚好相反,在save前将dto->domain object,这里需要作的只是一些一对多关系,普通的beanUtils就代劳了。第三个方法是edit方法中需要提供的相关字典数据,比如说,在编辑页面中,有一个select,需要一个部门的列表,它需要在上下文中预置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值