`

java利器---jodd

阅读更多

网上对Jodd的描述如下:

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选择器

 

除此之外还包含一个很小,但实用的基于JSP的MVC框架。

---------------------------------------------------
不扯哪些没有的了,还是通过例子来说明问题比较好。

去官方下载最新的jodd吧,我下载的版本是jodd-3.3.3  下载地址:http://jodd.org

- BeanUtil的使用

通过BeanUtil,可以对bean的属性进行控制(注入);类型转换等

public class UserPojo {
    private String name;
    private String add;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAdd() {
        return add;
    }
}

----------------------------------------

    @Test
    public void testBeanUtil() {
        UserPojo userPojo = new UserPojo();
        BeanUtil.setProperty(userPojo, "name", "zhaoyang"); //设置name属性值为zhaoyang
        System.out.println(">>>>> " + BeanUtil.getProperty(userPojo, "name")); //获取name属性值

        BeanUtil.setDeclaredProperty(userPojo, "add", "beijing");   //add是只读属性,如果用setProperty(~)就会报错,可以用声明式属性,强制属性赋值
        System.out.println(">>>>> " + BeanUtil.getDeclaredProperty(userPojo, "add"));

        int dd = TypeConverterManager.convertType("23", Integer.class);  //类型转换,将字符串“23”转换为Integer类型
        System.out.println("@@ " + (dd - 3));

        System.out.println("#### " + BeanTool.attributesToString(userPojo));  //打印出bean的结构
    }

执行结果:

BeanTool还有其他一些常用的方法,如

copy(java.lang.Object source, java.lang.Object destination)  :只copy公共属性

copyFields(java.lang.Object source, java.lang.Object destination)  copy 所有的字段值到目标对象

copyProperties(java.lang.Object source, java.lang.Object destination) 

load(java.lang.Object bean, java.lang.Object source) 

另外 BeanTemplateParser可以把Bean按照模版的显示方式进行解析,转换。官方例子

// prepare template
String template = "Hello ${user.name}. Today is ${dayName}.";
...
 
// prepare context
Foo foo = newFoo();
foo.getUser().setName("John Doe");
foo.setDayName("Saturday");
...
// parse
BeanTemplateParser btp = newBeanTemplateParser();
String result = btp.parse(template, foo);
// result == "Hello John Doe. Today is Saturday."

 

日期处理 - JDateTime

日期设置。可以通过构造函数,或者set(~)进行

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

或者:

JDateTime jdt = new JDateTime();            // set current date and time
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);                // change just time, date remains the same

 

读取日期和时间

    @Test
    public void testJDateTime() {
        JDateTime jDateTime = new JDateTime();
        int year = jDateTime.getYear();
        System.out.println(">>>> " + year);
        System.out.println("@@@@ " + JDateTime.JANUARY);

        System.out.println("### " + jDateTime.getFormat());
        System.out.println("### " + jDateTime.toString("YYYY-MM-DD hh")); //转换为字符串,可以自定义格式

        jDateTime.convertToDate();  //日期转换为java.util.Date
        jDateTime.convertToSqlDate(); //转换为java.sql.Date

        jDateTime.add(-1,0,0);    //日期向后减去1年
        System.out.println("$$$$ " + jDateTime.toString("YYYY-MM-DD hh")); //转换为字符串,可以自定义格式
    }

执行结果:



JDateTime jdt = newJDateTime(1975, 1, 1);
jdt.toString();                     // "1975-01-01 00:00:00.000"
jdt.toString("YYYY.MM.DD");         // "1975.01.01"
jdt.toString("MM: MML (MMS)");      // "01: January (Jan)"
jdt.toString("DD is D: DL (DS)");   // "01 is 3: Wednesday (Wed)"
JDateTime jdt = newJDateTime(1968, 9, 30);
jdt.toString("'''' is a sign, W is a week number and 'W' is a letter");
// "' is a sign, 5 is a week number and W is a letter"
 
jdt.parse("2003-11-24 23:18:38.173");
jdt.parse("2003-11-23");                // 2003-11-23 00:00:00.000
jdt.parse("01.01.1975", "DD.MM.YYYY");  // 1975-01-01
jdt.parse("2001-01-31", "YYYY-MM-***"); // 2001-01-01, since day is not parsed
 
JDateTime jdt = newJDateTime();
JdtFormatter fmt = newDefaultFormatter();
fmt.convert(jdt, "YYYY-MM.DD");         // external conversion
 
JdtFormat format = newJdtFormat(newDefaultFormatter(), "YYYY+DD+MM");
jdt.toString(format);
format.convert(jdt);
 
DateFormat df = newSimpleDateFormat();
df.format(jdt.convertToDate());         // date formatter

 

属性读取 - Props

属性文件如下:

key1=value1

key2 : value2

 

[section1]

key.with.macro = val_${key}

 

[ ]

key<profile1> = value A

key<profile2> = value B

默认 props文件是UTF8编码,无论是什么编码,Props加载properties文件用 ISO 8859-1这种编码格式

基本使用方式:

Props p = new Props();

p.load(new File("example.properties"));

...

String stroy = p.getValue("story");

----------- Sections 的获取-------------

properties文件如下:

[users.data]

weitht = 49.5

age=23

获取方式:

users.data.weitht = 49.5

users.data.age = 63

--------- Profiles的获取 -------------

properties文件如下:

db.port=3086
 
db.url<develop>=localhost
db.username<develop>=root
 
db.url<deploy>=192.168.1.101
db.username<deploy>=app2499

或者是:

db.port=3086
 
[db<develop>]
url=localhost
username=root
 
[db<deploy>]
url=192.168.1.101
username=app2499

获取方法为:

String url = props.getValue("db.url", "develop");
String user = props.getValue("db.username", "develop");

----------- 宏命令 -----------------

key1=Something ${foo}
...
foo=nice

key1的结果为 Something nice

key1=**${key${key3}}**
key3=2
key2=foo

key1的结果为:**foo**

--------------------------------

放送和接收邮件 - Email

官方有详尽的说明(http://jodd.org/doc/email.html)

1.首先定义一个邮件(可以是HTML格式的,也可以是普通格式的)

Email email = Email.create()
    .from("...@jodd.org").to("...@jodd.org")
    .subject("Hello HTML!")
    .addHtml("<b>HTML</b> message...");

2.添加一个带附件的邮件

Email email = Email.create()
                .from("weird@beotel.rs")
                .to("weird@beotel.rs")
                .subject("test5")
                .addText("Здраво!")
                .addHtml("<html><META http-equiv=Content-Type content=\"text/html; charset=utf-8\">"+
                        "<body><h1>Здраво!</h1><img src='cid:huh2.jpg'></body></html>")
                .embedFile("d:\\huh2.jpg")
                .attachFile("d:\\cover.jpg");

3.定义邮件服务器,发送邮件

SmtpServer smtpServer = newSmtpServer("mail.beotel.rs", newSimpleAuthenticator("user", "pass"));
...
SendMailSession session = smtpServer.createSession();
session.open();
session.sendMail(email1);
session.sendMail(email2);

session.close();

4. 用SSL发送邮件

SmtpServer smtpServer = newSmtpSslServer("smtp.gmail.com", "user@gmail.com", "password"));
...
SendMailSession session = smtpServer.createSession();
session.open();
session.sendMail(email);

session.close();

5.接收邮件

Pop3Server popServer = newPop3Server("pop3.beotel.yu",
        newSimpleAuthenticator("username", "password"));
ReceiveMailSession session = popServer.createSession();
session.open();
System.out.println(session.getMessageCount());
ReceivedEmail[] emails = session.receiveEmail(false);
if(emails != null) {
    for(ReceivedEmail email : emails) {
        System.out.println("\n\n===["+ email.getMessageNumber() + "]===");
         
        // common info
        Printf.out("%0x", email.getFlags());
        System.out.println("FROM:"+ email.getFrom());
        System.out.println("TO:"+ email.getTo()[0]);
        System.out.println("SUBJECT:"+ email.getSubject());
        System.out.println("PRIORITY:"+ email.getPriority());
        System.out.println("SENT DATE:"+ email.getSentDate());
        System.out.println("RECEIVED DATE: "+ email.getReceiveDate());
         
        // process messages
        LinkedList<emailmessage> messages = email.getAllMessages();
        for(EmailMessage msg : messages) {
            System.out.println("------");
            System.out.println(msg.getEncoding());
            System.out.println(msg.getMimeType());
            System.out.println(msg.getContent());
        }
         
        // process attachments
        List<EmailAttachment> attachments = email.getAttachments();
        if(attachments != null) {
            System.out.println("+++++");
            for(EmailAttachment attachment : attachments) {
                System.out.println("name: "+ attachment.getName());
                System.out.println("cid: "+ attachment.getContentId());
                System.out.println("size: "+ attachment.getSize());
                attachment.writeToFile(newFile("d:\\", attachment.getName()));
            }
        }
    }
}
session.close();</emailmessage>

类型转换 - Converter

如图示,非常丰富:

更加偏爱的一种转换方法:

TypeConverterManager.convertType("173", Integer.class);  

就是使用 TypeConverterManager对象

 

当然还可以自定义转换器

 

查找文件和文件夹

FindFile

例子:

FindFile ff = newWildcardFindFile("*")
    .setRecursive(true)
    .setIncludeDirs(true)
    .searchPath("/some/path");
 
File f;
while((f = ff.nextFile()) != null) {
    if(f.isDirectory() == true) {
        System.out.println(". >"+ f.getName());
    } else{
        System.out.println(". "+ f.getName());
    }
}

--------------------

FindFile ff = newWildcardFindFile("*")
    .setRecursive(true)
    .setIncludeDirs(true)
    .searchPath("/some/path");
 
Iterator<File> iterator = ff.iterator();
 
while(iterator.hasNext()) {
    File f = iterator.next();
    if(f.isDirectory() == true) {
        System.out.println(". >"+ f.getName());
    } else{
        System.out.println(". "+ f.getName());
    }
}

--------- FileScanner ------------------

FileScanner fs = newFileScanner() {
    @Override
    protectedvoidonFile(File file) {
        System.out.println(file.getName());
    }
}.includeDirs(true).recursive(true).includeFiles(false);
fs.scan("d:\\temp\\");

 

----------------- WildcardFileScanner ------------------------

WildcardFileScanner wfs = newWildcardFileScanner("**/file/**", true);
List<File> files = wfs.list("/some/path");
0
2
分享到:
评论
3 楼 aa51513 2016-07-01  
图片看不成
2 楼 jhonnnnnn 2015-11-14  
图片看不成
1 楼 jhonnnnnn 2015-11-14  
图片看不成

相关推荐

    Java常用工具包 Jodd

    Java常用工具包Jodd是一个强大的开源库,专为Java开发者设计,提供了许多实用的功能和类,以简化开发过程。这个工具包涵盖了多个领域,包括HTTP客户端、数据转换、日期时间处理、字符串操作、I/O流、线程管理、对象...

    《基于YOLOv8的智慧工地深基坑降水井运行状态监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    最新多模板仿互站友价虚拟物品在线交易商城源码 补丁更新10.31

    内附安装教程,含14套模板。 此源码为商业版全功能无授权版,1031全新的友价虚拟物品在线交易商城   模板源码,含14套模板带熊掌号及百度主动提交插件   源码运行环境,以下是友价虚拟物品在线交易   商城模板源码1031商业版的修复内容:   手机端:   新增手机版任务大厅功能   更新商家版会员中心界面   电脑端:   编辑商品视频栏目直接以弹窗方式展开,不用切换页面   调整保证金规则(有订单未完成,禁止解冻保证金)   新增商品问答功能   新增评价视频晒单功能   完善退款记录功能,每次退款跟处理结果都做记录(旧的只能保留最+新一次的退款记录)   支付宝等付款时,资金记录里同时记录交易号   阿里云OSS设置开关功能(后台基本设置-存储接口里)   开通阿里云OSS产品效果图也能存储的功能   友价   查看更多关于 友价 的文章   虚拟物品在线交易商城模板源码1023商业版源码安装教程   1.把程序上传到网站根目录下,不支持二级目录安装;   2.用EditPlus或者Notepad等代码编辑软件打开数据库配置文件:config/config.php 把里面的数据库信息改为自己的mysql数据库信息   文件内有标注,根据标注提示修改   3.导入数据库。把数据库目录下的shujku.sql数据库备份文件还原到你的mysql数据库内。   4.修改熊掌号地址,用editplus或者Notepad等代码编辑软件打开文件 user/baidu.php 把里面的这个域名 www.baidu.com 改为自己的   5.修改邮件通知名称,文件路径 yjadmin1/shop.php 把里面的关于 商业源码 这个名称,改为自己的,建议不要太长,否则会被屏蔽

    苏苏源码-jspm008-就业信息管理系统(论文+PPT).zip

    苏苏源码-jspm008-就业信息管理系统(论文+PPT)

    Ubuntu18.04与PX4环境下基于虚拟机的无人机仿真开发环境搭建及应用

    内容概要:本文详细介绍了基于Ubuntu 18.04系统的PX4虚拟机环境的安装、配置和使用方法。该虚拟机预装了完整的PX4源码和编译工具链,支持Gazebo单机和多机仿真。文中涵盖了环境变量检查、源码编译、Gazebo启动、多机仿真配置以及常见问题解决等多个方面。同时,提供了针对硬件资源有限情况下的优化建议,如开启3D加速、使用HEADLESS模式等。 适用人群:具有一定Linux基础和PX4开发经验的研发人员,特别是希望快速搭建无人机仿真环境进行算法验证和技术探索的开发者。 使用场景及目标:适用于需要快速验证无人机控制算法、测试多机协同飞行、模拟复杂环境条件(如强风干扰)的研究和开发工作。目标是减少环境配置的时间成本,专注于飞控逻辑和算法的开发与测试。 其他说明:尽管虚拟机环境极大地方便了开发,但对于长期深入开发和大规模仿真,仍建议在物理机上安装双系统或更高性能的计算平台。此外,文中提到的一些特定配置和优化技巧有助于提高仿真效率和稳定性。

    三菱FX系列PLC解密软件详解与实操指南

    内容概要:本文详细介绍了三菱FX系列PLC解密软件及其使用方法。首先解释了为何需要解密PLC程序以及解密的实际应用场景,如旧设备改造和功能升级。接着展示了具体的解密技术和工具,包括Python和C#实现的解密算法,以及关键的串口通信配置和密码校验机制。文中还提供了详细的视频教程链接,指导用户逐步完成解密过程,并强调了合法合规使用的必要性和注意事项。此外,分享了一些实用技巧,如针对不同型号PLC的特殊操作和避免常见错误的方法。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些需要对三菱FX系列PLC进行维护、升级或二次开发的专业人士。 使用场景及目标:适用于需要对三菱FX系列PLC程序进行解密、分析或修改的工作场合,目的是解决因程序加密带来的技术难题,提高工作效率和设备利用率。 其他说明:文中提供的所有信息仅供技术交流和个人学习使用,请确保在合法合规的前提下进行任何操作。

    多媒体计算机系统组成专业知识讲座.pptx

    多媒体计算机系统组成专业知识讲座.pptx

    苏苏源码-jspm006-东风锻造有限公司重大停管理系统(论文+PPT).zip

    苏苏源码-jspm006-东风锻造有限公司重大停管理系统(论文+PPT)

    libd-0.1.0.tar.gz

    该资源为libd-0.1.0.tar.gz,欢迎下载使用哦!

    2023年全国计算机二级JAVA考试练习题及答案.docx

    2023年全国计算机二级JAVA考试练习题及答案.docx

    redis 免安装版本使用

    redis 免安装版本

    Simulink调用神经网络模型进行回归预测、分类和时间序列分析的技术详解

    内容概要:本文详细介绍了如何在Simulink中调用训练好的神经网络模型,涵盖回归预测、分类任务和时间序列分析三大应用场景。首先,通过MATLAB训练神经网络模型并保存,然后在Simulink中利用MATLAB Function模块或其他相关模块加载模型进行预测。对于回归预测,展示了如何训练前馈网络并将其应用于发动机性能预测;对于分类任务,提供了设备故障分类的具体实现方法;对于时间序列分析,则通过LSTM网络预测股价走势。文中还强调了数据预处理、模型保存格式选择、Simulink模块配置以及常见问题解决方法。 适合人群:具有一定MATLAB和Simulink基础,希望将神经网络模型应用于实际工程项目的工程师和技术人员。 使用场景及目标:适用于需要将神经网络模型集成到Simulink环境中的项目,如工业自动化、金融数据分析等领域。主要目标是提高模型部署效率,优化预测精度,减少开发周期。 其他说明:文中提供了详细的代码示例和注意事项,帮助读者更好地理解和实践。建议读者在实践中结合具体需求调整参数和配置,以达到最佳效果。

    Spring的声明式事务在多线程的场景当中会失效,解决方案

    Spring的声明式事务在多线程的场景当中会失效,解决方案,但是我们最好不要在一个事务中开启另一个事物;除非我们将事物的上下文传递到另一个事物中,但spring并不会这样做,所以通常我们要手动设置将事物回滚;获得conection,然后手动设置事务的回滚;

    工业自动化中昆仑通态触摸屏与台达变频器Modbus通讯控制详解

    内容概要:本文详细介绍了如何通过Modbus RTU协议实现昆仑通态触摸屏与台达变频器的通讯控制。主要内容涵盖硬件接线、参数配置、程序编写以及调试方法。文中提供了详细的接线步骤、参数设置指导、示例代码和常见问题解决办法,帮助读者掌握触摸屏与变频器之间的通讯流程和技术要点。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些需要进行触摸屏和变频器通讯对接工作的人员。 使用场景及目标:适用于需要实现触摸屏与变频器通讯控制的实际工程项目。主要目标是通过Modbus RTU协议完成两者之间的数据交互,从而实现对变频器的远程监控和控制。 其他说明:文章不仅提供了理论知识,还结合了大量实践经验,特别是针对一些容易出现的问题给出了详细的解决方案。这对于初学者来说非常有帮助,可以减少调试时间和错误发生的概率。

    ### 2024中国CGO增长峰会:聚焦消费驱动增长与品牌全球化战略布局

    内容概要:2024年中国CGO增长峰会在厦门举办,围绕“踏浪而行”的主题,探讨中国经济增长的新方向和策略。峰会汇集了众多知名企业和专家学者,共同探讨了中国经济从投资驱动向消费驱动转型的趋势,强调了品牌建设、数字化转型、消费升级的重要性。著名社会学家孙立平提出,中国经济已进入收缩期,需转向消费主导型增长;德勤中国首席经济学家许思涛则认为,中国经济长期增长率将保持在4%左右,消费将成为主要驱动力。会上,多家知名企业分享了各自的创新实践,如恒源祥的数字转型、小红书的生活服务种草模式、见福便利店的数字化升级等。峰会还特别关注了品牌出海的战略,强调全球化布局和本地化运营的重要性。 适合人群:企业高管、品牌营销专家、经济学家、政府官员及相关从业者。 使用场景及目标:①了解中国经济增长的新趋势和政策导向;②学习品牌建设和数字化转型的最佳实践;③探讨消费市场的新机遇和挑战;④探索品牌出海的路径和策略。 其他说明:峰会不仅是一次思想碰撞的盛会,也是品牌企业寻找增长路径、推动中国经济发展的平台。会议强调了信心的重要性,鼓励企业在AI时代提升学习力,勇于探索和创新,以应对复杂多变的经济环境。

    基于MATLAB/Simulink的三相感应电机SVPWM逆变器仿真与优化

    内容概要:本文详细介绍了如何使用MATLAB/Simulink构建和优化三相感应电机的空间矢量脉宽调制(SVPWM)逆变器仿真模型。首先,文章解释了SVPWM的基本原理及其在电机控制中的应用,接着逐步指导读者搭建三相逆变器、实现SVPWM算法以及设置电机模型参数。文中还提供了多个实用技巧,如互锁逻辑、扇区判断、占空比计算、死区时间和参数调优方法。此外,作者强调了仿真过程中需要注意的关键点,如直流母线电压利用率、电流THD和转矩脉动等性能指标的监控。 适合人群:具有一定MATLAB/Simulink基础,从事电机控制系统设计的研究人员和技术人员。 使用场景及目标:适用于希望深入了解SVPWM逆变器工作原理及其实现细节的技术人员。通过本文的学习,读者能够掌握从理论到实践的完整流程,从而更好地应用于实际工程项目中。 其他说明:文章不仅提供了详细的代码片段和参数设置指南,还分享了许多实战经验和调试技巧,帮助读者避开常见的陷阱并提高仿真的准确性。

    2023年新版计算机二级办公软件WORD试题讲解步骤.doc

    2023年新版计算机二级办公软件WORD试题讲解步骤.doc

    超级简易的书店管理系统

    超级简易的书店管理系统

    2023年计算机一级考试题1000道.doc

    2023年计算机一级考试题1000道.doc

    chromedriver-win32-137.0.7123.0.zip

    chromedriver-win32-137.0.7123.0.zip

Global site tag (gtag.js) - Google Analytics