Jodd 介绍

本贴最后更新于 2626 天前,其中的信息可能已经事过境迁

Jodd 是一个普通开源 Java 包。你可以把 Jodd 想象成 Java 的"瑞士军刀",不仅小,锋利而且包含许多便利的功能。

Jodd 提供的功能有:

  1. 提供操作 Java bean,
  2. 可以从各种数据源加载 Bean,
  3. 简化 JDBC 的接连与代码,
  4. 剖析 SQL 查询,
  5. 处理时间与日期,
  6. 操作与格式化 String,
  7. 搜索本地硬盘上的文件,
  8. 帮助处理 Servlet 请求等。
  9. Madvoc - 一个简单的 MVC 框架,用 CoC 和注解的方式
  10. Petite:一个轻量级的 DI(注入)框架
  11. Proxetta:一个高效的动态代理框架
  12. Db & DbOom:高效,轻量级的数据库处理框架
  13. Paramo:在运行时,非常简单的获取方法和构造方法的参数
  14. JTX:提供一个独立的,轻量级的事务管理器
  15. VTor:实用的验证框架,可以针对任何 Java 对象
  16. Lagarto:高效,灵活的通用 HTML 解析器
  17. Decora:基于模板的页面装饰框架。
  18. Jerry:友好的 jQuery java 解析器,支持 CSS 选择器

Jodd = Tools + IoC + MVC + DB + AOP + TX + JSON + HTML < 1.5 Mb

Jodd 被分成众多模块,按需选择,其中

工具类模块有:

小型框架模块有:

Jodd 使用示例

package org.xiaochen.test.jodd; import java.util.TimeZone; import org.apache.log4j.Logger; import org.junit.Test; import jodd.datetime.JDateTime; /** * JODD中的时间操作类 * @author DJZHOU * */ public class JDateTimeUtil { private Logger log = Logger.getLogger(JDateTimeUtil.class) ; @Test public void testConstructor() { /* * 构造函数的使用 */ JDateTime jdt = new JDateTime(); // set current date and time jdt = new JDateTime(2012, 12, 21); // set 21st December 2012, midnight jdt = new JDateTime(System.currentTimeMillis()); jdt = new JDateTime(2012, 12, 21, 11, 54, 22, 124); // set 21st December 2012, 11:54:22.124 jdt = new JDateTime("2012-12-21 11:54:22.124"); // -//- jdt = new JDateTime("12/21/2012", "MM/DD/YYYY"); // set 21st December 2012, midnight } @Test public void testSet() { JDateTime jdt = new JDateTime(); // set current date and time /* * set方法的使用:设定日期时间 */ jdt.set(2012, 12, 21, 11, 54, 22, 124); // set 21st December 2012, 11:54:22.124 jdt.set(2012, 12, 21); // set 21st December 2012, midnight jdt.setDate(2012, 12, 21); // change date to 21st December 2012, do not change te time jdt.setCurrentTime(); // set current date and time jdt.setYear(1973); // change the year jdt.setHour(22); // change the hour jdt.setTime(18, 00, 12, 853); } @Test public void testGet() { JDateTime jdt = new JDateTime(); // set current date and time /* * get方法的使用:读取日期和时间 */ jdt.getYear(); jdt.getDateTimeStamp(); log.warn(jdt.getDateTimeStamp());//获取当前时间 log.warn(jdt.getJulianDate()); log.warn(jdt.getDay()) ; log.warn(jdt.getDayOfMonth()) ; log.warn(jdt.getDayOfWeek()) ; log.warn(jdt.getDayOfYear()) ; log.warn(jdt.getEra()) ; log.warn(jdt.getFirstDayOfWeek()) ; log.warn(jdt.getFormat()) ; } @Test public void testAdd() { JDateTime jdt = new JDateTime(); // set current date and time jdt.add(1, 2, 3, 4, 5, 6, 7); // add 1 year, 2 months, 3 days, 4 hours... jdt.add(4, 2, 0); // add 4 years and 2 months jdt.addMonth(-120); // go back 120 months jdt.subYear(1); // go back one year jdt.addHour(1234); // add 1234 hours } @Test public void testAdd2() { JDateTime jdt = new JDateTime() ; log.warn(jdt.toString("YYYY-MM-DD")) ; jdt.addDay(-20) ; log.warn(jdt.toString("YYYY-MM-DD")) ; jdt.addDay(10, true) ; log.warn(jdt.toString("YYYY-MM-DD")) ; jdt.addYear(1); log.warn(jdt.toString("YYYY-MM-DD")) ; } @Test public void testFormat() { JDateTime jdt = new JDateTime(); // set current date and time /** * 转换说明 YYYY 年 MM 月 DD 日 D 一周中的第几天 从周一算起 MML 月,长型 MMS 月,短行 DL 一周中的第几天 长型 从周一算起 DS 一周中的第几天 短型 从周一算起 hh 小时 mm 分钟 ss 秒 mss 毫秒 DDD 一年中的第几天 WW 一年中的第几周 WWW 一年中的第几周并用W标识 W 一个月中的第几周 E 年代,公元前还是公元后 TZL 时间长型 TZS 时间短型 * */ log.warn(jdt.convertToDate()) ; log.warn(jdt.toString("YYYY-MM-DD")); log.warn(jdt.toString("YYYY-MM-DD hh:mm:ss"));//转换成字符串 log.warn(jdt.toString("WW"));//本年度第几周 log.warn(jdt.toString("YYYY")) ; } }

JODD 操作 properties 文件

package org.xiaochen.test.jodd; import java.io.File; import java.io.IOException; import org.apache.log4j.Logger; import org.junit.Test; import jodd.props.Props; /** * JODD操作properties文件 * @author DJZHOU * */ public class PropUtil { private static Logger log = Logger.getLogger(PropUtil.class) ; @Test public void propExam(){ /* * 读取prop文件中的属性值 */ Props p = new Props(); log.warn(URLUtil.getClassPath(this.getClass())+"/a.properties") ; try { p.load(new File(URLUtil.getClassPath(this.getClass())+"/a.properties")); } catch (IOException e) { e.printStackTrace(); } String story = p.getValue("a"); log.warn(p.getBaseValue("a")) ; log.warn(story); log.warn(null == p.getValue("a")) ; log.warn(p.toString()) ; p.setValue("c", "cc") ; } }

JODD 操作 email 类

package org.xiaochen.test.jodd; import java.io.File; import java.io.IOException; import org.junit.Test; import jodd.io.FileUtil; import jodd.mail.Email; import jodd.mail.EmailAttachment; import jodd.mail.EmailMessage; import jodd.mail.SendMailSession; import jodd.mail.SmtpSslServer; import jodd.mail.att.ByteArrayAttachment; import jodd.mail.att.FileAttachment; import jodd.util.MimeTypes; /** * JODD操作email类 * * @author DJZHOU * */ public class EmailUtil { public static void main(String[] args) { Email email = Email.create(); email.addMessage(new EmailMessage("消息")); email.addText("邮件内容"); email.embedFile(new File("d:/console.txt")); email.from("771842634@qq.com").to("771842634@qq.com"); email.subject("主题"); SendMailSession mailSession = new SmtpSslServer("smtp.qq.com//发送端邮箱服务器协议", "发送端QQ邮箱", "发送端QQ邮箱密码").createSession(); mailSession.open(); mailSession.sendMail(email); mailSession.close(); System.out.println("发送成功!..."); } @Test public void test() throws IOException { Email email = new Email(); email.setFrom("infoxxx@jodd.org"); email.setTo("igorxxxx@gmail.com"); email.setSubject("test7"); EmailMessage textMessage = new EmailMessage("Hello!", MimeTypes.MIME_TEXT_PLAIN); email.addMessage(textMessage); EmailMessage htmlMessage = new EmailMessage( "" + "Hey!jodd使用示例Hay!", MimeTypes.MIME_TEXT_HTML); email.addMessage(htmlMessage); EmailAttachment embeddedAttachment = new ByteArrayAttachment(FileUtil.readBytes("d:\\c.png"), "image/png", "c.png", "c.png"); email.attach(embeddedAttachment); EmailAttachment attachment = new FileAttachment(new File("d:\\b.jpg"), "b.jpg", "image/jpeg"); email.attach(attachment); } }

String 字符串的操作工具类

package org.xiaochen.test.jodd; import org.junit.Test; import jodd.util.StringUtil; /** * String字符串的操作工具类,太强大以至于我要发疯 * * @author DJZHOU * */ public class StringExamUtil { @Test public void stringExam() { String exam = "abcdefg10101010abcdefg"; String result = ""; /* * replace 字符替换 */ // 将字符串exam中的a替换成b result = StringUtil.replace(exam, "a", "b"); // 将字符串exam中的a替换成8,b替换成9 result = StringUtil.replace(exam, new String[] { "a", "b" }, new String[] { "8", "9" }); // 将字符串exam中的a替换成b 这里是替换字符 result = StringUtil.replaceChar(exam, 'a', 'b'); // 将字符串exam中的a替换成8,b替换成9 这里是替换字符 result = StringUtil.replaceChars(exam, new char[] { 'a', 'b' }, new char[] { '8', '9' }); // 将字符串exam中的第一个a替换成b result = StringUtil.replaceFirst(exam, "a", "b"); // 将字符串exam中的第一个a替换成b 这里是替换字符 result = StringUtil.replaceFirst(exam, 'a', 'b'); // 将字符串exam中的最后一个a替换成b result = StringUtil.replaceLast(exam, "a", "b"); // 将字符串exam中的最后一个a替换成b 这里是替换字符 result = StringUtil.replaceLast(exam, 'a', 'b'); // 将字符串exam中的a和A替换成FF b和B替换成gg 即忽略大小写 result = StringUtil.replaceIgnoreCase(exam, new String[] { "a", "b" }, new String[] { "FF", "gg" }); /* * remove 字符移除 */ // 将字符串exam中的a移除 result = StringUtil.remove(exam, "a"); // 将字符串exam中的a移除 移除的是字符 result = StringUtil.remove(exam, 'a'); // 将字符串exam中的a b移除 移除的是字符 最后一个参数为无限参数 result = StringUtil.removeChars(exam, 'a', 'b'); // 将字符串exam中的a移除 result = StringUtil.removeChars(exam, "a"); /* * 判断字符串是否为空 */ // 判断字符串exam是否为空 System.out.println(StringUtil.isEmpty(exam)); // 判断字符串exam是否不为空 System.out.println(StringUtil.isNotEmpty(exam)); // 判断字符串exam是否为空 这里的空为去掉空格之后 System.out.println(StringUtil.isBlank(" ")); // 判断字符串exam是否不为空 这里的空为去掉空格之后 System.out.println(StringUtil.isNotBlank(" ")); // 判断字符串(无限参数)是否都为空 他们之间的关系为并且 System.out.println(StringUtil.isAllEmpty(exam, " ", "null")); // 判断字符串(无限参数)是否都为空 这里的空为去掉空格之后 他们之间的关系为并且 System.out.println(StringUtil.isAllBlank(exam, " ", "null")); // 对比字符串exam中的第4索引的字符是不是d System.out.println(StringUtil.isCharAtEqual(exam, 4, 'd')); // 对比字符串exam中的第4索引的字符是不是 不是d System.out.println(StringUtil.isCharAtEscaped(exam, 4, 'd')); /* * equals安全的字符串对比是否相等 不需要考虑null.equals等问题 */ // 判断字符串exam与aaa是否相等 System.out.println(StringUtil.equals(exam, "aaa")); // 判断两个数组是否相等 System.out.println(StringUtil.equals(new String[] { "aaa" }, new String[] { "aaa", "bbb" })); // 判断两个数组是否相等 且忽略大小写 System.out.println(StringUtil.equalsIgnoreCase(new String[] { "aaa" }, new String[] { "aaa", "bbb" })); // 获取字符串bbb在数组中的索引 System.out.println(StringUtil.equalsOne("bbb", new String[] { "aaa", "bbb" })); // 获取字符串bbb在数组中的索引 且忽略大小写 System.out.println(StringUtil.equalsOneIgnoreCase("bbb", new String[] { "aaa", "bbb" })); /* * 首字母的更改 */ // 首字母大写 result = StringUtil.capitalize(exam); // 首字母小写 result = StringUtil.uncapitalize(exam); /* * split字符串分割 */ // 将字符串按 , 分割 String[] array = StringUtil.split("1,2,3,4,5,6,7,8", ","); /* * indexOf 获取字符串中的字符索引 */ /* * Strips, crops, trims and cuts */ // 若这个字符串以a为开头,则去掉a result = StringUtil.stripLeadingChar(exam, 'a'); // 若这个字符串以g为结尾,则去掉g result = StringUtil.stripTrailingChar(exam, 'g'); // 若该字符串为"" 则返回null 若不是则返回字符串 result = StringUtil.crop(""); // 裁剪数组 将""变成null StringUtil.cropAll(new String[] { "", " " }); // 去掉字符串两边的空格 result = StringUtil.trimDown(" aa "); // 去掉字符串左边的空格 result = StringUtil.trimLeft(" aa "); // 去掉字符串右边的空格 result = StringUtil.trimRight(" aa "); // 去掉字符串右边的空格 String[] array2 = new String[] { " aa ", " b b" }; /* * 去掉数组内空格 */ StringUtil.trimAll(array2); StringUtil.trimDownAll(array2); for (String string : array2) { System.out.println(string); } /* * 切割字符串 */ // 从字符串的f字符开始切割字符串 保留f result = StringUtil.cutFromIndexOf(exam, 'f'); // 从字符串的fg字符串开始切割字符串 保留fg result = StringUtil.cutFromIndexOf(exam, "fg"); // 检查字符串是否为abc开头,若为此开头,则切割掉abc result = StringUtil.cutPrefix(exam, "abc"); // 检查字符串是否为efg结尾,若为此结尾,则切割掉efg result = StringUtil.cutSuffix(exam, "efg"); // 检查字符串是否为efg开头或结尾,若为此开头或结尾,则切割掉efg result = StringUtil.cutSurrounding(exam, "efg"); // 检查字符串是否为abc开头efg结尾,若为为abc开头efg结尾,则切割掉 result = StringUtil.cutSurrounding(exam, "abc", "efg"); // 截取到字符串的f字符开始切割字符串 不保留f result = StringUtil.cutToIndexOf(exam, 'f'); // 截取到字符串的fg字符串开始切割字符串 不保留fg result = StringUtil.cutToIndexOf(exam, "fg"); /* * 其他很多小巧的方法,可以自行研究 */ System.out.println(result); } }
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 165 关注
  • jodd
    1 引用
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3195 引用 • 8215 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 倾城之链
    23 引用 • 66 回帖 • 160 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 442 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    124 引用 • 74 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖 • 1 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖 • 2 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 1 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 1 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 544 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    494 引用 • 928 回帖 • 1 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 393 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 687 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 445 关注
  • AWS
    11 引用 • 28 回帖 • 8 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 32 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 108 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 806 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 176 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    430 引用 • 1250 回帖 • 599 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 662 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 432 关注
  • CodeMirror
    1 引用 • 2 回帖 • 158 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 3 关注