`
wuhuizhong
  • 浏览: 668005 次
  • 性别: Icon_minigender_1
  • 来自: 中山
社区版块
存档分类
最新评论

在JFinal的Controller中接收json数据

    博客分类:
  • Java
阅读更多

原文  http://boytnt.blog.51cto.com/966121/1698113

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真是的很小巧。

分享到:
评论
3 楼 wuhuizhong 2016-03-16  

jFinal支持Rest风格吗?可以想spring mvc那样支持post body json自动转换成bean吗?
http://www.oschina.net/question/852601_128718
2 楼 wuhuizhong 2016-03-15  
在jfinal中应如何获取前端ajax提交的Json数据?
http://www.oschina.net/question/735772_149076
1 楼 wuhuizhong 2016-03-15  
jfinal如何处理json请求的数据:
问题:
在某些api接口开发的过程中,需要以json来做数据交互。
如果不用 params={k:v}这种表单方式传递json给服务端,
而是把request的Content-type设置为"application/json; charset=UTF-8",
把json字符串放入到body中,
请问jfinal有没有什么快捷方法可以从body中取出json数据。
看request文档,request.getInputStream()只能调用一次。
////
类似jfinal微信从request里得到微信的xml信息

答案:
在 Controller 中使用 jfinal 提供的 HttpKit 直接读取可:
public void index() {
  String jsonStr = HttpKit.readIncommingRequestData(getRequest());
}

相关推荐

Global site tag (gtag.js) - Google Analytics