能否在调用Controller的action之前,固定运行某个Controller里面的函数

需求有点复杂,一开始项目只要支持get和post的x-www-form-urlencode就可以了,但到中期发现还需要application/json方式,前端用的vue,所以后端的接口都是高度集成的(就10个左右接口)。

想了一些办法,但是感觉代码改动最小的方式就是重载Controller,参考以下了帖子:http://www.jfinal.com/feedback/57

但是此贴的一个问题是每次取参数都必须进行比较复杂的判读,我的想法是,每次进入action,就固定先判断一次,以后的取参数,就简单高效一些。

大致代码如下:

public class ExtController extends Controller {

private JSONObject jsonObj = null;

Map<String,Object> map=null;


//注意,必须在读取参数之前先调用此函数,来确保Json数据被读入

public JSONObject readJson(){

jsonObj = null;

map=new HashMap<String,Object>();

if ("application/json".equals(getRequest().getContentType())|| "text/json".equals(getRequest().getContentType())) {

String readData = HttpKit.readData(getRequest());

jsonObj = JSONObject.parseObject(readData);

//为了兼容get和post(www-form-url)方式,把JsonObj转成String,存入Map

Set<String> keySet= jsonObj.keySet();

Object value;

for(String key:keySet){

value = jsonObj.get(key);

if(value instanceof JSONArray || value instanceof JSONObject){

map.put(key, value.toString()); //看源码实际调用的是toJSONString()

}else{

map.put(key, value);

}

}

}

return jsonObj;

}

@Override

public String getPara() {

if(jsonObj!=null){

return map.toString();

}

return super.getPara();

}


@Override

public String getPara(String name) {

if(jsonObj!=null){

return (String)map.get(name);

}

return super.getPara(name);

}

}

现在的最大问题,必须在每个Action函数的入口处马上调用readJson()这个函数,如下代码:

//测试参数传递专用,没有实际作用

public void testJson(){

this.readJson();  //必须先调用

String tmp=getPara("data");

List<Integer> ids=JSON.parseArray(tmp,Integer.class);

tmp=getPara("test");

                ..........

            }

不知道能否有办法,自动做到这一步?

评论区

wumugulu

2018-03-24 10:33

把动作设在getpara等读取参数的方法里就好了噻;设个标志如果还没有做,就先readJson,否则就直接从map中取值;

JFinal

2018-03-24 11:59

做一个全局拦截器来做这事很方便,在 controller 中进行的操作可以放在拦截器中来做,然后通过 inv.getController().setAttr(...) 传递过去

当然,你还可以通过在 BaseController 中弄一个属性来传递,大至如下:
BaseController c = (BaseController)inv.getController();
c.setXxx(xxx);
inv.invoke();

rirai

2018-03-24 15:26

@wumugulu 谢谢你的思路,我一开始也是这么做的,但是每个读取的动作都要判断一次,我的想法是省去这个判断。其实就是有点小小的洁癖而已。哈哈。

rirai

2018-03-24 15:36

@JFinal 谢谢,我原来也想这么干的,但是感觉一涉及拦截器就有点高大上,不太敢用。现在试了一下,果如君言,现在发现Jfinal越来越好用了,非常灵活和强大!!!

热门反馈

扫码入社