JFinal中接收URL中的参数或者model中的参数是很方便的,但是对于web2.0的网站来说,经常会以json方式提交比较复杂的数据,比如一个查询,包含了各种过滤条件和排序分页,前端脚本可能提交的数据是这样的:

{
    "type":1,
    "key":"keyword",
    "paging":{
        "size":50,
        "index":0
    },
    "sort":{
        "field":"time",
        "type":"desc"
    }
}


像SpringMVC就提供了@RequestBody将数据绑定到json对象上,但是jFinal不支持,需要自己从POST中读取并解析这个json数据,先定义一个与请求同结构的Java对象,比如起名叫QueryRequest:

packagecom.demo;

import com.demo.Paging;
import com.demo.Sort;

public class QueryRequest {
    private int type;
    private String key;
    private Paging paging;
    private Sort sort;

    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
    public String getKey() {
        return key;
    }
    public void setKey(String key) {
        this.key = key;
    }
    public Paging getPaging() {
        return paging;
    }
    public void setPaging(Paging paging) {
        this.paging = paging;
    }
    public Sort getSort(){
        return sort;
    }
    public void setSort(Sort sort){
        this.sort = sort;
    }
}


其中用到了Paging和Sort两个类:

package com.demo;

public class Paging {
    private int size;
    private int index;
    
    public int getSize() {
        return size;
    }
    public void setSize(int size) {
        this.size = size;
    }
    public int getIndex() {
        return index;
    }
    public void setIndex(int index) {
        this.index = index;
    }
}
package com.demo;

public class Sort {
    private String field;
    private String type;
    
    public String getField() {
        return field;
    }
    public void setField(String field) {
        this.field = field;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
}


然后在Controller里就从request中读取json字符串,然后调用fastjson解析提交的数据了,:

@Before(POST.class)
public void getData(){
    try{
        //从requst中读取json字符串
        StringBuilder json = new StringBuilder(); 
        BufferedReader reader = this.getRequest().getReader();
        String line = null;
        while((line = reader.readLine()) != null){
            json.append(line);
        }
        reader.close();

        //调用fastjson解析出对象
        QueryRequest request = JSONObject.parseObject(json.toString(), QueryRequest.class);
        
        //然后就可以使用request得到请求的所有数据了
        //下略
        //.......
    }
    catch(Exception ex){
        //异常处理,略
    }
    
    renderText("测试");
}


转换部分会经常使用,可以提出来:

/**
 * 取Request中的数据对象
 * @param valueType
 * @return
 * @throws Exception 
 */
protected <T> T getRequestObject(Class<T> valueType) throws Exception {
    StringBuilder json = new StringBuilder();
    BufferedReader reader = this.getRequest().getReader();
    String line = null;
    while((line = reader.readLine()) != null){
        json.append(line);
    }
    reader.close();
    
    return JSONObject.parseObject(json.toString(), valueType);
}


使用的时候一句就行了:

QueryRequest requst = getRequestObject(QueryRequest.class);



另外附上前端ajax调用的脚本:

$.ajax({
    "url": "/home/getDate",      //路径
    "cache": false,              //不缓存
    "async": true,               //异步
    "type": "POST",              //POST方式提交
    "dataType": "json",          //json格式,重要
    "contentType": "application/json",      //json格式
    "data": {},                  //要提交的数据对象
    success: function (json) { //成功处理
    },
    error: function (x, e) {  //异常处理
    }
});


PS:很喜欢jFinal,相比于SpringMVC庞大的体积,jFinal真是的很小巧。

PPS:使用的是jFinal-2.0,配合fastjson-1.2.3,之前用fastjson-1.2.4时会有问题。