【深度精讲】JFinal中的Ret和Kv工具类的区别,你用对了吗?
在JFinal中有两个类Map的工具类,一个是有状态的Ret,一个是无状态的Kv,各种自己的应用场景,你用对了吗?

下面我们从多个方面来探究一下,JFinal针对这两个类的设计:
一、位置-com.jfinal.kit包

com.jfinal.kit包,JFinal里的核心工具类包,里面还有我们常用来判断和处理字符串用的StrKit工具类。加载读取配置文件用的PropKit工具类。用户密码Md5或者加盐加密用的HashKit工具类等。
总之,这个工具类包下面都是我们日常开发中常用的.(不接受反驳 (#^.^#))
二、Kv.java详解

Kv继承HashMap,拥有HashMap的所有特性,你可以把Kv.java当做一个更好用的HashMap。
场景使用:主要用来做参数,传递参数

例1、下面来看一个Service里封装的例子:

这是Service中封装的一个根据关联类型和关联对象ID 删除符合条件数据的一个数据库操作。这里用Kv来构造了删除使用的参数,是deleteBy(Kv params)这个方法的参数。
例2、再来看一个JFinal微信开发中 对微信API的一个封装:

这个场景下,使用Kv包装作为接口的参数,去调用微信API。
例3、在Controller层 使用Kv把前端传递的参数封装起来,更方便的调用非结构化参数,非Bean,非Model的参数传递

Controller.java中默认提供了getKv()这个方法,如果前端传递的参数是一个Model,比如参数是user.id=1 user.name="张三" 此时我们后端可以使用getModel(User.class,"user")去获取一个用model包装的参数集合。如下图案例所示:
这里需要注意的是modelName.attrName这种形式,使用的attrName必须与数据表字段名完全一样。

如果传递的参数与Model不同,但是也是user.id这种形式的参数,一般我们后端可以封装一个JavaBean,然后使用getBean(MyBean.class,"user") 也可以得到一组bean封装的参数集合。如下图所示:

注意:getBean方法用于支持传统Java Bean,包括支持使用jfinal生成器生成了getter、setter方法的Model,页面表单传参时使用与setter方法相一致的attrName,而非数据表字段名
除了以上两种情况,如果前端一个表单提交的数据,表单没有设置域,直接传递的零散的表单项和值,则可以使用getKv()拿到所有前端提交过来的参数,按照HashMap的形式包装起来,方便后面使用。
其实:如果希望传参时避免使用modelName前缀,可以使用空串作为modelName来实现:getModel(User.class, ""); 这对开发纯API项目非常有用。
但是这里我们主要来探究Kv的方式:

Kv里提供了很多快速参数转型的方法:在Service里可以快速根据参数的名字作为Kv里的Key获取转型数据值。

在Service里 我们可以使用这些方法,拿到我们需要的参数值。

特别注意:上面这个案例还能看出一个Ret和Kv的区别,就是一个主要作为参数,一个主要作为返回值。
三、Ret.java详解

从上图可以看出,Ret和Kv一样 都是继承了HashMap,是一个更好用的HashMap,唯一不同的是加入了状态state,主要是用来做返回值,用来返回操作处理的数据和状态的。也用于服务器对客户端请求响应JSon数据通讯。

例1、Service层操作返回值,标明返回的数据、状态信息。

这里我列举一个更新密码的例子,拿到原密码和新密码之后做完判断和更新后,根据最后执行是否成功,返回一个Ret值,或者是success或者是error,这里具体看看封装的Ret是这样的:

调用了Ret里的fail和ok方法,设置了success和error分别对应的两个状态。

最后会设置这个状态名字是state值要么是ok要么是fail

那么,我们Controller层拿到这个service的返回值,如果前端是Ajax请求或者是作为API接口,用JSON数据格式通讯的话,可以直接使用renderJson(ret)了。

总结:这个就是Ret作为Service返回值和服务器与客户端做JSON数据通讯,返回的Json数据的典型应用场景,跟Kv还是有区别的,就只在这个状态上。
希望,这个对比试验可以让大家清晰的认识同样继承了HashMap的两个工具类,在应用场景上的区别,用对JFinal,用好JFinal。
如果您对次图文教程有任何意见和改进建议,请一定关注JFinal学院公众号:jfinalxueyuan 留言告诉我们。
如果您在本文中有所收获,想关注更多JFinal课程,也请一定关注JFinal学院公众号:jfinalxueyuan ,更多精彩课程,等着你。

【深度精讲】JFinal中的Ret和Kv工具类的区别,你用对了吗?的更多相关文章
- TypeScript完全解读(26课时)_8.ES6精讲-ES6中的类(进阶)
8.TypeScript完全解读-ES6精讲-类(进阶) 在index.ts内引入 Food创建的实例赋值给Vegetabled这个原型对象,这样使用Vegetables创建实例的时候,就能继承到Fo ...
- Nutz中那些好用的工具类
Nutz 是国产的精品开源框架,它全无依赖,只以1兆多的身材,就可以实现SSH全部功能的90%以上.内容主要涵盖了:Ioc.Aop.MVC.Dao.Json等WEB开发的方方面面. 它不仅轻巧,而且 ...
- Java中的4个并发工具类 CountDownLatch CyclicBarrier Semaphore Exchanger
在 java.util.concurrent 包中提供了 4 个有用的并发工具类 CountDownLatch 允许一个或多个线程等待其他线程完成操作,课题点 Thread 类的 join() 方法 ...
- Java中的AES加解密工具类:AESUtils
本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...
- java中redis的分布式锁工具类
使用方式 try { if(PublicLock.getLock(lockKey)){ //这里写代码逻辑,执行完后需要释放锁 PublicLock.freeLock(lockKey); } } ca ...
- java高并发系列 - 第16天:JUC中等待多线程完成的工具类CountDownLatch,必备技能
这是java高并发系列第16篇文章. 本篇内容 介绍CountDownLatch及使用场景 提供几个示例介绍CountDownLatch的使用 手写一个并行处理任务的工具类 假如有这样一个需求,当我们 ...
- java.util.concurrent中的几种同步工具类
java.util.concurrent并发包中提供了一系列的的同步工具类,这些基础类不管是否能在项目中使用到,了解一下使用方法和原理对java程序员来说都是有必要的.博主在看<java并发编程 ...
- C#中SQLite的使用及工具类
目录 SQLite简介 存储类 亲和类型 引用System.Data.SQLite.dll 软件包分类 使用本机库预加载 常用部署包 工具类 参考资料 SQLite简介 SQLite是一款轻型的数据库 ...
- Java中的操作日期的工具类
import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; imp ...
随机推荐
- 关于java中equals与==的区别的小实验
java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符. 做了几个小实验比较结果. 实验一: String ...
- POJ-3616
Milking Time Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10434 Accepted: 4378 Des ...
- InnoSetup自动检测并安装.Net Framework
InnoSetup可在在脚本中插入[Code]代码段,其中的代码可以通过事件驱动,支持的主要事件如下: function InitializeSetup(): Boolean; ——安装程序初始化,返 ...
- SVN needs-lock 设置强制只读属性【转】
https://www.jianshu.com/p/5942ab19620b 设置后向svn服务器添加文件时,会自动带上svn:needs-lock属性,默认是只读的要签出才能修改,以避免不必要的编辑 ...
- Centos7更新阿里yum源
一.下载repo文件 wget http://mirrors.aliyun.com/repo/Centos-7.repo 二.备份并替换系统的repo文件 cp Centos-7.repo /etc/ ...
- MFC——4个基本类中的成员函数介绍
09121852 杜军 机械设计及理论 1. CMainFrame ActivateFrame使框架对用户可视并可用 CalcWindowRect每当主框架窗口的客户区尺寸发生变化或控制条的位置发生变 ...
- Linux系统下使用split命令分割大文件 (转载)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://snailwarrior.blog.51cto.com/680306/140531 ...
- Celery 基本使用
1. 认识 Celery Celery 是一个 基于 Python 开发的分布式异步消息任务队列,可以实现任务异步处理,制定定时任务等. 异步消息队列:执行异步任务时,会返回一个任务 ID 给你,过一 ...
- 洛谷 P2048 [NOI2010]超级钢琴(优先队列,RMQ)
传送门 我们定义$(p,l,r)=max\{sum[t]-sum[p-1],p+l-1\leq t\leq p+r-1 \}$ 那么因为对每一个$p$来说$sum[p-1]$是一个定值,所以我们只要在 ...
- 基于testcontainers的现代化集成测试进阶之路
大型的软件工程项目除了大量的产品级代码外必不可少的还有大量的自动化测试.自动化测试包含从前端到后端甚至到产品线上不同模块和环境的各种类型的测试.一个比较经典的关于自动化测试分布的理论就是测试金字塔,是 ...