在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... 阅读详情

相关推荐

避坑指南:RK3576+Android14适配移远5G模组(RG200U)时,我遇到的3个‘巨坑’及解决方案

本文详细记录了RK3576芯片适配Android14系统与移远RG200U 5G模组过程中遇到的三大技术难题:RIL服务启动失败、HIDL兼容性矩阵配置错误及ttyUSB权限冲突。通过实战案例提供了动态库拷贝、HIDL版本链声明和SELinux策略调整等解决方案,帮助开发者高效完成5G模组集成,特别适用于基于kernel6.1的嵌入式开发场景。

weixin_30664051的博客 390

Jfinal获取前台json格式数据

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

Trialknight的博客 2228

宜搭子表单(自定义页面全部展示)

效果:增加自定义页面添加表格组件,配置数据源变量: formUuid'表单编码'变量: pageSize10变量: currentPage1。

2301_80286061的博客 2277

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

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

weixin_33974433的博客 405

一文读懂AI大模型时代的RAG技术

RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合检索技术与生成模型的技术架构,旨在通过动态引入外部知识库增强大语言模型(LLM)的生成能力。其核心思想是通过检索系统从外部数据源(如企业知识库、实时文档等)获取相关信息,并将检索结果作为上下文输入生成模型,以提高生成答案的准确性、时效性和专业性

awei0916的专栏 2119

深入解析WIFI与蓝牙模块电路设计:从原理到实战

本文深入解析了WIFI与蓝牙模块的电路设计,从核心原理到实战应用。文章以AP6256模块为例,详细拆解了电源树、时钟电路、接口设计及天线射频路径等关键环节,并提供了PCB布局布线的实用准则与调试方法,旨在帮助硬件工程师设计出稳定可靠的无线产品,规避常见陷阱。

weixin_29186249的博客 150

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

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

扶摇的博客 3632

海思ISP实战:YUV Sharpen参数调试全解析

本文深入解析了在海思ISP平台上进行YUV Sharpen参数调试的实战经验。文章以海思3516EV300芯片为例,详细拆解了EdgeFiltStr、TextureFreq等核心参数的作用与协同策略,并重点阐述了如何通过ISO联动调试,在图像清晰度与噪声抑制之间取得最佳平衡,为图像调试工程师提供了宝贵的避坑指南和实战参考。

grape的博客 209

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万+

《HiVT: Hierarchical Vector Transformer for Multi-Agent Motion Prediction》论文阅读之HiVT

目录摘要1.介绍2.相关工作3.方法3.1. 总体框架3.2 场景表示 3.3 分层向量Transformer3.3.1 局部编码器3.3.2 全局交互模块3.3.3 多模态未来解码器3.4 训练4.实验4.1 实验设置4.2 消融研究 4.3. 结果5.结论 准确预测周围交通参与者的未来运动对于自动驾驶车辆的安全至关重要。最近,矢量化方法由于能够捕捉交通场景中的复杂交互而在运动预测领域占据主导地位。然而,现有的方法忽略了问题的对称性并且受到昂贵的计算成本的影响,面临着在不牺牲预测性能的情况

Gavinmiaoc的博客 3340

STM32G0/G4无刷电机硬件设计与FOC控制实现

无刷直流电机(BLDC)和永磁同步电机(PMSM)的矢量控制依赖于高精度电流采样、实时SVPWM调制与闭环PI调节等核心技术。其底层实现需兼顾电机本体建模、坐标变换(Clark/Park)、死区补偿及硬件资源约束。STM32G0系列凭借CORDIC协处理器与超低功耗特性,适用于成本敏感型有感FOC应用;而STM32G4集成运放、FMAC滤波器与高级定时器,可支撑高性能无感控制与多源传感融合。该技术广泛应用于机器人关节、智能云台、伺服驱动等场景,是嵌入式电机控制工程师必须掌握的工程化落地能力。

weixin_35751412的博客 121

JFinal常用功能,非常方便

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

weixin_33717298的博客 265

VMware Horizon 8 2111 部署系列(十一)准备RDS主机

RDS (Remote Desktop Service),即远程桌面服务。我们可以使用 Microsoft 远程桌面服务 (RDS) 提供 RDS 主机上的桌面会话并将应用程序传送给多个用户。

白昼的技术专栏 3470

JFinal中json的使用

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

Gavin的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

关于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

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

groovy基本语法--JSON

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

u011861874的博客 3673

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、付费专栏及课程。

余额充值