2017-10-19 18:50

这种重写的方式非常好,注意一个重要问题, Map postParamMap 这个属性去掉 static 关键字,否则有线程安全问题

此外,可以引入一个中间控制器继承一下 Controller,例如叫: PostBodyController,在这个中间控制器中覆盖掉 getPara(...) 方法,那么在以后碰到这类传参方式可以让你的最终 MyController 继承 PostBodyController,这样就可以重用代码了

大致如下:
public class PostBodyController extends Controller {
// 覆盖掉父类的 getPara 实现
public String getPara(...) {
....
}
}

最终的控制器如 UserController 如下:
public class UserController extends PostBodyController {
// 这里可使用普通的 validator
@Before(UserValidator.class)
public void index() {
...
}
}

2017-10-19 18:43

@i++ 下个版本会处理这个需求,感谢你的反馈

2017-10-19 18:41

异常:java.lang.NoClassDefFoundError: com/alibaba/druid/filter/Filter

缺少 druid 的 jar 包, 在首页下载 jfinal demo,里面有这个 jar 包,或者通过 maven 引入,下载 jfinal demo for maven

2017-10-19 17:17

@淡定007 没通过 render , 那就是当时就向客户端发送数据了, 我前面所说的前提就是用 controller 中的 render 系列的方法

如果你自行通过 response.getWriter() 或者 getOutputStream(), 自然就要求拦截器中的 inv.invoke() 放在前在了

2017-10-19 17:13

刚想到了一个更简单的办法:
1:Validator 中的 controller 属性是 protected 的,你可以通过定制一个自己的 MyValidator ,将父类的 controller 换成自己的 Controller 实现类 MockController

2:做一个 MockController 继承一下 Controller ,并持有当前请求的 controller 对象

3:在 MockController 中覆盖掉父类的 getPara(...) 这类方法,接管当前正在请求的真正的 controller 对象的行为

4:getPara() 接管之前,将当前真正的 controller 对象内的属性获取到,并且解析成为可以被 validate 的形式

记得搞定后回来分享

2017-10-19 17:09

jfinal 默认的 Validator 是为 form 表单这类参数准备的

2017-10-19 17:09

@JennyJingXiao Validator 本质就是一个拦截器,你可以参考 Validator 中的代码改造为一个自己的 PostBodyValidator 出来,然后定制自己的 validateXxx 方法

2017-10-19 17:06

这种情况下,参数是通过什么方式获取的? 是不是通过
HttpKit.readData(getRequest()) 获取到的?

2017-10-19 17:00

@lyq027 jfinal 的数据库功能,本质就是将 sql 与其参数直接转手给 jdbc,所以,只要是 jdbc 可以做到的, jfinal 都支持

2017-10-19 16:59

不会的, 所有拦截器与action执行完成以后,render 的动作才被真正执行,这个是确信无疑的,调试一下

当你调用 render 方法时,jfinal 内部仅仅是 new 出来一个 XxxRender 对象,并不会真正调用 XxxRender 中的 render() 方法,只有当拦截器与 controller 的事情完事以后, XxxRender.render() 才真正被执行

2017-10-19 16:39

@lyq027 用一个 as 就可以了,例如: select sum(money) as money

不用 as 的话,也可以,只是不方便: model/record.get("sum(money)");

2017-10-19 16:15

把 sql 写好就可以了,然后 model.find(sql, ....) 或者 Db.find(sql, ...) 都可以

2017-10-19 12:35

@小毅好 参考下这个贴子:http://www.jfinal.com/feedback/2267

2017-10-19 10:50

用下面的方法先拿到 controller 对象:
Controller controller = inv.getController();

然后获取数据就与在 controller 中一样了