改进前
@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/