Jodd 介绍

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

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思源笔记

    1062 引用 • 3455 回帖 • 151 关注
  • jodd
    1 引用
  • Java

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

    3202 引用 • 8217 回帖

相关帖子

回帖

欢迎来到这里!

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

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

推荐标签 标签

  • abitmean

    有点意思就行了

    36 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 1 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 2 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 119 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 2 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1432 回帖 • 1 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 563 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    955 引用 • 944 回帖
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖 • 1 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    246 引用 • 1338 回帖
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 184 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 3 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 178 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    172 引用 • 1539 回帖
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 7 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    46 引用 • 114 回帖 • 166 关注
  • 微软

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

    8 引用 • 44 回帖 • 1 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 818 回帖
  • danl
    180 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 506 关注
  • V2Ray
    1 引用 • 15 回帖 • 3 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 2 关注
  • Word
    13 引用 • 41 回帖 • 1 关注