Jodd 介绍

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

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

    1083 引用 • 3461 回帖 • 287 关注
  • jodd
    1 引用
  • Java

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

    3167 引用 • 8207 回帖 • 2 关注

相关帖子

回帖

欢迎来到这里!

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

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

推荐标签 标签

  • etcd

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

    5 引用 • 26 回帖 • 493 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    535 引用 • 672 回帖
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 496 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6510 引用 • 29257 回帖 • 246 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 6 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 592 关注
  • V2Ray
    1 引用 • 15 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    395 引用 • 3408 回帖
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 107 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    169 引用 • 799 回帖
  • 微服务

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

    96 引用 • 155 回帖 • 1 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    15 引用 • 7 回帖 • 7 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    82 引用 • 122 回帖 • 614 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 22 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 68 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    77 引用 • 1741 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    131 引用 • 3639 回帖
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 7 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    491 引用 • 1383 回帖 • 372 关注
  • Swagger

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

    26 引用 • 35 回帖 • 12 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 229 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖