Jodd 介绍

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

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 回帖 • 263 关注
  • jodd
    1 引用
  • Java

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

    3169 引用 • 8208 回帖

相关帖子

回帖

欢迎来到这里!

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

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

推荐标签 标签

  • SendCloud

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

    2 引用 • 8 回帖 • 444 关注
  • 小说

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

    28 引用 • 108 回帖
  • 微服务

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

    96 引用 • 155 回帖
  • Facebook

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

    4 引用 • 15 回帖 • 455 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 582 关注
  • CodeMirror
    1 引用 • 2 回帖 • 126 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 26 关注
  • 笔记

    好记性不如烂笔头。

    306 引用 • 782 回帖
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 26 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 611 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 446 关注
  • Telegram

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

    5 引用 • 35 回帖
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    76 引用 • 390 回帖 • 1 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1425 引用 • 10043 回帖 • 475 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 59 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 553 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 321 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    175 引用 • 992 回帖 • 1 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    96 引用 • 330 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 15 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 2 关注
  • API

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

    76 引用 • 429 回帖
  • 游戏

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

    171 引用 • 813 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖