在JFinal的Controller中接收json数据

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

1
2
3
4
5
6
7
8
9
10
11
12
{
    "type":1,
    "key":"keyword",
    "paging":{
        "size":50,
        "index":0
    },
    "sort":{
        "field":"time",
        "type":"desc"
    }
}


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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两个类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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解析提交的数据了,:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@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("测试");
}


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * 取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);
}


使用的时候一句就行了:

1
QueryRequest requst = getRequestObject(QueryRequest.class);



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

1
2
3
4
5
6
7
8
9
10
11
12
13
$.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时会有问题。




     本文转自 BoyTNT 51CTO博客,原文链接:http://blog.51cto.com/boytnt/1698113,如需转载请自行联系原作者




上一篇:SAP OData的CSRF token在ABAP Netweaver服务器上是怎么生成的


下一篇:技术主管一直做微服务 程序员不干了