对 Action 方法参数的改进方案

改进前

@Request.Post("/login")
public View submit(Map<String, Object> fieldMap) {
    // 获取表单数据
    String username = CastUtil.castString(fieldMap.get("username"));
    String password = CastUtil.castString(fieldMap.get("password"));
    boolean isRememberMe = fieldMap.get("rememberMe") != null;

    ...
}

可见,此时 Action 方法中需要定义一个 Map<String, Object>,然后需要一个个地去转型,虽然可以用,但过于麻烦。


现提出以下改进方案:


方案一

@Request.Post("/login")
public View submit(
    @Param("username") String username, 
    @Param("password") String password, 
    @Param("isRememberMe") boolean isRememberMe
) { 
    ...
}

若 Param 注解的 value 属性值与 Action 方法参数名相同,则可省略。


方案二

@Request.Post("/login")
public View submit(Params params) {
    // 获取表单数据
    String username = params.get("username");
    String password = params.get("password"));
    boolean isRememberMe = params.get("rememberMe") != null;

    ...
}

Params 具有自动封装并自动转型的能力。


方案三

@Request.Post("/login")
public View submit(LoginForm loginForm) {
    // 获取表单数据
    String username = loginForm.getUsername();
    String password = loginForm.getPassword();
    boolean isRememberMe = loginForm.getRememberMe() != null;
    ...
}

其中,LoginForm 需要自定义,一般被称为 ActionForm,实际上是一个 POJO,可同时包含多个 ActionForm 参数。


请大家投票,哪个方案最好?也欢迎有更好的方案!


结论

根据大家的建议与 Smart 的轻量级路线,最终采用方案二。以前在 Action 方法里使用 Map<String, Object> 参数,现在可简化为 Param 参数了,该特性目前在 2.2-SNAPSHOT 版本中,请通过源码查看:

Smart 源码:http://git.oschina.net/huangyong/smart

Smart Sample 源码:http://git.oschina.net/huangyong/smart-sample


感谢 abel533 的努力!他为 Smart 编写了一个基于注解的参数绑定特性,可参考他所开源的项目 Args:

http://git.oschina.net/free/Args/tree/smart_args_plugin/

转载于:https://my.oschina.net/huangyong/blog/215190

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值