对 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/

你可能感兴趣的:(SMART)