在Jfinal,用Groovy实现类似Spring对application/json的处理插件

Java轻量级框架选择 目前,打算做一个手机应用的程序,包括android和ios,并都打算使用原生开发。与前端应用交互的后台打算使用Java来开发(本来想用Groovy,但还是对其不熟悉,只好作罢)。用Java就涉及框架选择问题,想选择一个轻量级的,毕竟自己一个人做,所以想用一个开发效率高、很轻、又不失扩展能力的,所以如果没有太好选择的话,就还是使用SSH。后来发现了Spring boot、JFinal和Nutz,最后 阅读详情

文章目录

转自我原先在Jfinal官网写的文章

序

偷懒,关于如何实现 Message 与 Bean 多对多映射,有思路但是还没有理清逻辑,所以先转载一下自己的文章,养成写作的习惯,不能再鸽了,以下内容是之间复制过来,没有做任何调整,毕竟我现在有点头昏脑胀。

原文

最近要写个公司内部使用的代码生成器,想学习新东西,打算 用 Groovy 和 JFinal。
发现 JFinal 对 body 中 Json 处理不如 Spring 那样方便,无法自动将 Json 转成 Bean 传入 action 中, 就研究源码,写了一个插件,将相关操作进行封装,工程中只要引入插件就可以了。
有两个前提条件, 如果你也用 Groovy 开发 JFinal ,这个插件可以直接使用,否则需要改写成 Java 版本,由于 Groovy 的语法挺好理解的(我最后这版使用比较多的 Groovy 的特性,原先 Java 版本写法的注释为了代码的简洁,我都删除了),这个改写并不难,我就不实现了;另一个是我发现 Groovy 有原生的 Json 实现,我将原先的 fastjson 改成了 GroovyJson ,如果 java 要用请自行改成 FastJson 或者其他 json 实现(在我写这篇文章的时候,FastJson 还是个不错的,但是最近出现太多的问题了,建议使用 Jackson 2)。
在我的基础上还可以增加对更多 contentType 类型的处理。

插件代码

    /**
     * 对ContentType的处理插件
     * @author MRZC
     *
     */
    class ContentTypePlugin implements IPlugin{
     
        @Override
        public boolean start() {
            // 引入FastJson作为Json转换的实现
            Config.constants.jsonFactory = new GroovyJsonFactory()
            // 引入 ContentType 的拦截器
            Config.interceptors.addGlobalActionInterceptor new ContentTypeInterceptor()
            return true
        }
     
        @Override
        public boolean stop() {
            // 没有释放的资源
            true
        }
    }
     
    import com.jfinal.aop.Interceptor as JfianlInterceptor
     
    /**
     * 对application/json的拦截器
     * @author MRZC
     *
     */
    class ContentTypeInterceptor implements JfianlInterceptor {
        @Override
        public void intercept(Invocation inv) {
            def controller = inv.controller
            def contentType = controller.request.contentType
            def parameterTypes = inv.method.parameterTypes
            // 判断contentType 是否包含 application/json,并且action函数是否只有一个参数
            if(contentType?.indexOf("application/json") > -1 && parameterTypes.length == 1) {
                // 将body体中的json转成bean
                def arg = JsonKit.parse(controller.rawData, parameterTypes[0])
                // 替换原先的参数
                inv.setArg(0, arg)
            }
            inv.invoke()
        }
    }
    /**
     * Groovy版本IJsonFactory实现
     * @author MRZC
     *
     */
    class GroovyJsonFactory implements IJsonFactory {
     
        @Override
        public Json getJson() {
            new GroovyJson();
        }
    }
     
    /**
     * Json 转换 Groovy 实现
     * @author MRZC
     *
     */
    class GroovyJson extends Json {
     
        @Override
        public String toJson(Object o) {
            JsonOutput.toJson o
        }
     
        @Override
        public <T> T parse(String json, Class<T> t) {
            def jsonSlurper = new JsonSlurper()
            def map = jsonSlurper.parseText json
            if(t == Object || t == GroovyObject)
            {
                return map
            }
            t.newInstance map
        }
    }

使用样例

    class Main extends JFinalConfig{
        static void main(args) {
            UndertowServer.start(Main, 80, true);
        }
     
        @Override
        public void configConstant(Constants me) {
            me.devMode = true
        }
     
        @Override
        public void configRoute(Routes me) {
            me.add("/", Index);
        }
     
        @Override
        public void configEngine(Engine me) {}
     
        @Override
        public void configPlugin(Plugins me) {
            // 引入对ContentType的处理插件
            me.add new ContentTypePlugin()
        }
     
        @Override
        public void configInterceptor(Interceptors me) {}
     
        @Override
        public void configHandler(Handlers me) {}
    }
     
    class Index extends Controller {
        public index(User u) {
            // 将请求Json再转成Json输出,用于验证
            renderJson(JsonKit.toJson(u))
        }
        public groovy(o) {
            // 验证默认的Map类型
            renderText o.getClass().toString() + " " + o.name
        }
    }
     
    class User {
        def name;
    }
nGrinder中快速编写groovy脚本04-发送POST请求 发送post请求,也有两种方式: 一种是在UI界面添加后自动生成脚本,一种是直接在脚本中添加 一、通过UI方式发送json格式的post请求 通过 UI 设置:脚本 -&amp;amp;gt; 新建脚本 -&amp;amp;gt; 显示高级配置 当选择了请求方法为POST后,在高级配置中可以选择Content-Type,并展示相应的参数。 生成代码如下: import static net.grinder.script.G... 阅读详情

相关推荐

统信UOS开发环境支持Java

集成了JDK和多种IDE,为开发者提供了从代码编写、编译、调试到部署的一站式开发解决方案。

RZer的博客 2254

Jfinal获取前台json格式数据

参考文章https://blog.youkuaiyun.com/whz110/article/details/84770680 参考上面的文章的话,最后在封装数据的时候会报错,下面代码为解决问题之后的代码: 前台页面代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> ...

Trialknight的博客 2228

2024年【MCM/ICM】美国大学生数学建模竞赛优秀论文(免费下载)

美国大学生数学建模竞赛(MCM/ICM)由美国数学及其应用联合会主办,是最高的国际性数学建模竞赛,也是世界范围内最具影响力的数学建模竞赛,一般也指数学建模竞赛。赛题内容涉及经济、管理、环境、资源、生态、医学、安全、等众多领域。竞赛要求三人(本科生和研究生均可参加)为一组,在四天时间内,就指定的问题完成从建立模型、求解、验证到论文撰写的全部工作,体现了参赛选手研究问题、解决方案的能力及团队合作精神。为现今各类数学建模竞赛之鼻祖。

weixin_43608857的博客 1841

JFinal应对Content-Type为application/json的ajax请求参数处理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33974433的博客 405

通义千问语言模型Qwen2.5架构详解

此外,将基于API的模型 Qwen-Plus 与领先的专有和开源模型进行了对比,包括 GPT4-o、Claude-3.5-Sonnet、Llama-3.1-405B和DeepSeek-V2.5。Qwen2.5-Math-72B-Instruct的整体性能超越了Qwen2-Math-72B-Instruct和GPT4-o,甚至是非常小的专业模型如 Qwen2.5-Math-1.5B-Instruct也能在与大型语言模型的竞争中取得高度竞争力的表现。近来也出现了明显的转向小型语言模型(SLMs)的趋势。

搏博的专栏 1万+

魔兽世界怀旧服宏命令全解析:从自动换装到智能判定,老玩家才知道的黑科技

本文全面解析魔兽世界怀旧服宏命令的高级应用,从自动换装到智能判定,揭秘老玩家专属的黑科技技巧。深入探讨怀旧服特有的宏命令机制,包括施法队列、装备切换系统和职业专属技巧,帮助玩家在经典旧世版本中提升战斗效率。

weixin_29230865的博客 730

JFinal接收前端json格式参数+浏览器数据传输格式

文章目录JFinal接收前端json格式参数+浏览器数据传输格式1、Request请求传输数据的三种格式①Query String Parameters格式②Form Data格式③Request Payload格式2、前端传JSON对象错误示范!!!3、后端接收json格式参数总结参考连接 JFinal接收前端json格式参数+浏览器数据传输格式 前一段时间前端说,想要给接口传json格式的数据,因为这样写参数的时候比较方便(因为传的参数真的很多,一个个拼接也很麻烦),不需要再去拼接参数成标准的URL格式

扶摇的博客 3632

主流双目相机技术参数横向评测:从ZED到国产新锐

本文对主流双目相机技术参数进行了横向评测,涵盖ZED、Bumblebee等国际品牌及国产新锐产品。详细分析了分辨率、帧率、视场角等关键参数,并针对机器人导航、AR/VR交互、工业检测等场景提供选型建议。特别推荐ZED相机在科研领域的成熟应用,以及国产方案在长基线设计和主动双目技术上的创新突破。

weixin_33670786的博客 318

Jfinal(二)--------Controller层get 、post接收参数

一.上一讲收尾(暂时不描述,贴代码) 1.controller   HelloController.java package com.kjst.sjzx.base.controller; import com.jfinal.core.Controller; public class HelloController extends Controller{ /** * 显示hell

aoaoxiaoxian的博客 1万+

基于STM32L4XX、HAL库的Ra-01SC-P LoRa模块驱动程序设计

0x22) { // SX1276/SX1278版本号。// 发射功率(2-20)// 工作频率(Hz)// 编码率(5-8)

zhusl6688的博客 425

Claude Code 100个真实案例 - 用AI绘制CAD机械图纸(工程师看了直呼内行)

本案例展示如何使用 Claude Code 配合 Python 的 `ezdxf` 库,从零开始生成专业级 CAD 机械图纸。我们将绘制一个完整的法兰盘零件图,包含主视图、俯视图、标注尺寸、粗糙度标记和标题栏,最终生成标准 DXF 文件,可直接在 AutoCAD 或 FreeCAD 中打开编辑。

yueyeguzhuo的专栏 894

JFinal常用功能,非常方便

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33717298的博客 265

为什么 ChatGPT 生成的下载地址会长成 sky-metal-cards-jerry.quirkypony34.chatgpt.site 这种奇怪的样子

我今天看到的这条地址,确实很容易让人产生一种感觉,ChatGPT 明明只是生成了几张 PNG 图片和一个压缩包,为什么最终拿到的却不是类似这种看起来很正规的下载链接,而是一长串带有、UUID、apidecks的地址。更容易让人疑惑的是,其中还出现了一个平时很少见到的域名。这并不是浏览器随机生成的临时 URL,也不是某个来历不明的第三方文件服务器。根据 OpenAI 在 2026 年公布的 ChatGPT Sites 文档和相关服务条款,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 61

JFinal中json的使用

我们来说一说jfinal中的json使用。在struts2中或者是别的框架我相信大家都知道怎么使用json向前台传值。json字符串拼接,或者用第三方jar包解析对象成json字符串。

Gavin的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

关于JFinal中对应Content-Type为application/json,text/json的ajax请求参数处理

ajax传json或在后端通过HttpPost提交请求时,设置的Content-Type:application/json或者text/json时,request.getParameter()并不能取到对应的参数,就会导致JFinal的Controller中getPara()方法也无法取到对应的参数。我对对Final稍加改动可轻松应对json请求参数。 图片.png (这是我...

qq_37955980的博客 1227

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

groovy基本语法--JSON

1、groovy提供了对JSON解析的方法       ①JsonSlurper   JsonSlurper是一个将JSON文本或阅读器内容解析为Groovy数据的类结构,例如map,列表和原始类型,如整数,双精度,布尔和字符串。       ②JsonOutput   此方法负责将Groovy对象序列化为JSON字符串 2、解析JSON字符串 def jsonSlurp...

u011861874的博客 3673

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

json 反射java 实体_java反射实现javabean转json

BeantoModel->利用cglibBeanMap.create(src);直接将Bean装成Map,然后model._setAttrs(map)即可。ModeltoBean麻烦一点,最简单的方法是用json了。这个bean.dao.put应该是不对的,应该是bean.put吧,还有也不需要转换成map吧,model自带getAttrs方法获取map我想讲一个其它的bean而不是继承mo...

weixin_39845613的博客 148

jfinal获取参数

最新使用jfinal开发服务端,遇到了些有趣的问题,发出来大家一起讨论一下获取参数:常用的是this.getPara("参数名"),但是前端传送的是无名的json串,所以需要用this.getParaMap()或this.getParaNames().nextElement().toString()获取,经过测试this.getParaNames().nextElement().toString(...

xcgh的博客 2660

【Groovy】json 字符串反序列化 ( 使用 JsonSlurper 进行 json 字符串反序列化 | 根据 map 集合构造相关类 )

一、使用 JsonSlurper 进行 json 字符串反序列化、 二、根据 map 集合构造相关类、 三、完整代码示例、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 5903

jfinal中json字符串转对象类

String json = getRawData(); User user = FastJson.getJson().parse(json, User.class);

学习激发潜力 510

JFinal json转成model

使用Jackson 或者 FastJson来处理String objJson = getPara("obj"); PatrolObj obj2 = Jackson.getJson().parse(objJson, PatrolObj.class);

yaksok的博客 3700

关于JSON字符串转Javabean耗时长问题

问题描述: 在维护项目代码时,发现有接口响应耗时太长,遂进行优化处理; 接口逻辑: 1.根据条件在MongoDB中查询数据; 2.遍历数据进行统计、分析; 3.响应请求并做Redis缓存。 问题定位: 在对结果数据进行遍历统计、分析时,对JSON数据做了转Javabean的操作,单条数据转换耗时高达18ms,导致响应时间超时; 问题原因: 在使用 JavaBean bean = ...

DWJ的博客 3872

react-native使用总结

1. 行内样式和外部样式合并 下面4个View共用styles.rect_view样式,但是又要有各自的样式,代码实现如下: <View style={{...styles.rect_view, backgroundColor: 'red'}} /> <View style={{...styles.rect_view, backgroundColor: 'blue'}} /&gt...

Mybells 767

groovy 打印json_groovyJSON - Groovy教程

JSON本章介绍了如何使用Groovy语言来解析和生成对象。JSON功能功能库JsonSlurperJsonSlurper是一个将JSON文本或阅读器内容解析为Groovy数据的类结构,例如地图,列表和原始类型,如整数,双精度,布尔和字符串。JsonOutput此方法负责将Groovy对象序列化为JSON字符串。使用JsonSlurper解析数据JsonSlurper是一个将JSON文本或阅读器内...

weixin_30940057的博客 560

在GAE上使用Groovy建立Application

文章内容节选自 http://blog.springsource.com/2009/04/07/write-your-google-app-engine-applications-in-groovy/ 不过内容会更简单一些,主要介绍一些配置方式,开发IDE选择Eclipse3.4,因为Google只提供了Eclipse的插件 将会建立一个Groovy风格的Servlet,以及一个类似Gs...

天水一方 176
上一篇: 优雅的解决SpringBoot集成RabbitMQ序列化和反序列化的思路2
下一篇: DLNU weekly(May 18,2013)解题报告
明日之春
博客等级 码龄15年 3粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值