`
wuhuizhong
  • 浏览: 684338 次
  • 性别: 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());
}

相关推荐

    spring mvc 接口

    在实际开发中,为了直接返回 JSON 数据给前端,我们需要使用一些 JSON 处理库,比如 Jackson 或 Gson。以下是如何修改 `UserController` 类来使用 `@ResponseBody` 注解来直接返回 JSON 数据: ```java import org....

    德塔Socket流可编程数据库语言引擎系统1.0.0 源码 final1

    这两个方法都接收一个Map对象作为参数,通过`RestDBConfigImpl`来执行实际的设置操作,并将结果转换成JSON字符串返回。 2. `DBCATEGORYController`:这个类处理数据库分类的获取。它提供了两个方法,一个用于获取...

    spring应用中多次读取http post方法中的流遇到的问题

    1. 当Content-Type为application/json时,可以直接使用`@RequestBody`注解接收JSON数据。 2. 对于较旧的项目或特殊情况,可能需要手动读取流,例如通过HttpServletRequest的`getInputStream()`方法。 当需要在...

    Spring MVC面试宝典1.pdf

    在控制器中,可以使用@ResponseBody注解返回JSON数据给前端。 ##### 3.4 如何解决POST请求中文乱码问题,GET的又如何处理呢? - **POST请求**:在web.xml中配置过滤器CharacterEncodingFilter来设置字符编码。 - **...

    springboot_sendSms.zip

    这个名为"springboot_sendSms.zip"的压缩包内容是关于如何在SpringBoot项目中集成阿里云短信服务,以便向手机发送验证码。这在验证用户身份、注册新用户或进行密码重置等场景中非常常见。 首先,我们需要了解阿里云...

    SpringBoot集成mqtt上下线提醒功能设计

    在本文中,我们将深入探讨如何在SpringBoot应用中集成MQTT(Message Queuing Telemetry Transport)协议,实现设备上线和下线的提醒功能。MQTT是一种轻量级的发布/订阅消息传输协议,广泛用于物联网(IoT)场景,因为...

    40 个 SpringBoot 常用注解:让生产力爆表!

    在此示例中,客户端发送的 JSON 数据将被自动转换成 `User` 对象。 ##### 3. `@GetMapping`, `@PostMapping`, `@PutMapping`, `@DeleteMapping`, `@PatchMapping` 这些注解都是 `@RequestMapping` 的便捷版本,...

    springboot项目框架

    - **Controller层**:处理客户端请求,调用Service层的方法,并返回视图或JSON结果。 #### 七、Controller层代码 Controller层代码通常位于`src/main/java/com.example.demo/controller/`目录下。这些类负责接收...

    SpringMVC使用@Valid注解进行数据验证的方法

    在Spring MVC中,数据验证是确保输入数据符合预期格式和规则的重要步骤,这可以提高应用程序的安全性和用户体验。@Valid注解是Spring MVC提供的一种便捷的数据校验方式,它结合了JSR-303(Java Bean Validation)...

    ssm框架介绍及ssm整合配置文件源代码

    - **控制器(Controller)**: 负责接收用户请求,并将请求分发到相应的模型或视图上。 - **模型(Model)**: 包含应用程序的核心数据和业务逻辑。 - **视图(View)**: 显示模型数据,即用户界面。 Spring MVC 提供...

    springmvc-dubbo整合demo

    - **控制器(Controller)**:作为模型和视图之间的桥梁,接收用户请求并调用相应的服务层方法处理业务逻辑。 ##### 1.2 Dubbo Dubbo 是阿里巴巴开源的一款高性能、轻量级的微服务框架,它主要提供了三个核心能力:...

    jquery向后台提交数组的代码分析

    后台Spring MVC的Controller接收方式如下: ```java @ResponseBody @RequestMapping(value = "/box/changeLock") public String changeLock(@RequestParam final Long[] boxIds, final int boxType) { return ...

    websocket_springboot.rar

    WebSocket是一种在客户端和服务器之间建立长连接的协议,它允许双方进行双向通信,即服务器可以主动向客户端推送数据。在Spring Boot框架中集成WebSocket,可以为实时应用提供强大的支持,如在线聊天、股票行情更新...

    53-Spring Boot实现JWT1

    在本文中,我们将探讨如何使用Spring Boot来实现基于JWT(JSON Web Token)的OAuth2.0授权机制。JWT是一种轻量级的身份验证和授权机制,它允许我们在客户端和服务器之间安全地传递信息,而无需在每次请求时都发送...

    java常用单词

    变量是在程序中存储数据值的一种命名标识符。Java中的变量有局部变量、实例变量、静态变量等不同类型。 #### 操作/运算 (Operation) 操作或运算是指对数据进行处理的一系列步骤,例如算术运算、逻辑运算等。 #### ...

    Android 核心面试题

    - 数据交互格式包括XML和JSON,JSON更轻量,易于解析,目前使用更为广泛。 28. XML解析方式: - XML解析方式包括DOM、SAX、Pull等,官方推荐使用Pull解析器。 29. 百度地图核心类和功能: - 百度地图SDK提供的...

    java基础知识要点

    - **XML vs JSON**:两种常用的数据交换格式,XML更适合结构化数据,JSON则更简洁、易于解析。 - **UML (Unified Modeling Language)**:统一建模语言,用于软件工程的设计和文档化。 - **设计模式**:解决常见问题...

    java程序员面试大纲错过了金三银四你还要错过2018吗.docx

    14. **Spring Controller并发安全**:通过线程安全的设计原则,如避免在控制器中使用实例变量,使用`ThreadLocal`等方法确保控制器的线程安全。 #### 五、Netty框架 1. **BIO、NIO和AIO**:阻塞I/O(BIO)、非阻塞...

    spring-boot-web-service-tutorial

    在这个例子中,`/greeting`路径将接收GET请求,`name`参数是可选的,如果没有提供,默认值为"World"。 在处理请求之后,我们需要响应数据。Spring Boot支持多种格式的响应,如JSON和XML。默认情况下,它使用Jackson...

    spring mvc+localResizeIMG实现HTML5端图片压缩上传

    在后端,我们需要创建一个Spring MVC的Controller方法来接收`base64`编码的图片数据,并将其保存为文件。这通常涉及将`base64`字符串解码为二进制数据,然后写入磁盘。注意,为了安全起见,你可能还需要验证和处理...

Global site tag (gtag.js) - Google Analytics