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,如需转载请自行联系原作者