Controller里面的init方法可以进行重写吗

Controller里面的init方法可以进行重写吗,譬如,用户登录之后,我所有其他的action都需要这个用户的信息,那么我想把他放在一个类似的基类里面,所有的action都可以去继承,那么我就想去重写一下init

评论区

JFinal

2016-10-12 17:36

在自建的 BaseController 中做这些事情即可,jfinal 社区就是这么用的,直接拿去用就好:
public class BaseController extends Controller {

private Account loginAccount = null;

public Account getLoginAccount() {
if (loginAccount == null) {
loginAccount = getAttr(LoginService.loginAccountCacheName);
if (loginAccount != null && ! loginAccount.isStatusOk()) {
throw new IllegalStateException("当前用户状态不允许登录,status = " + loginAccount.getStatus());
}
}
return loginAccount;
}

public boolean isLogin() {
return getLoginAccount() != null;
}

public boolean notLogin() {
return !isLogin();
}

/**
* 获取登录账户id,默认已经登录,所以不必判断 null 值
*/
public int getLoginAccountId() {
return getLoginAccount().getId();
}

/**
* 使用 ret.getData() 作为参数,调用父类的 renderJson(Object)
* 考虑添加该特性到 jfinal 2.3
*/
public void renderJson(Ret ret) {
renderJson(ret.getData());
}
}

xhao_06

2016-10-12 18:36

有没有事例,发个链接

JFinal

2016-10-12 18:45

@xhao_06 上面贴的就是 jfinal.com 社区的源码,拿着改一下就可以用了

胖之

2016-10-13 14:44

@JFinal 你好问下!
loginAccount = getAttr(LoginService.loginAccountCacheName);
这段代码中getAttr是如何初始化的?我这里写的时候会爆空指针

JFinal

2016-10-13 15:13

@胖之 弄一个全局拦截器,将当前已经登录的用户,直接放进去,在拦截器通过这行代码即可:
inv.getController().setAttr(LoginService.loginAccountCacheName, loginAccount);
前面的 LoginService.loginAccountCacheName 仅仅是一个字符串而已,可以根据自己的喜好来起个名,后面的 loginAccount 是登录后的用户对象

热门反馈

扫码入社