Nutz介绍

x33g5p2x  于2021-09-25 转载在 其他  
字(6.8k)|赞(0)|评价(0)|浏览(582)

Nutz介绍

http://www.nutzam.com/core/basic/maven.html/# 官方API手册

https://nutz.cn/yvr/list NutzCN论坛 基本的BUG都能找到

Java 为什么不能是一门敏捷的语言呢?

起码 Java 是一门优美的编程语言,经过10多年的发展,它几乎已经被应用到了任何地方,在高端的企业服务器上, 手持设备的芯片里,车载设备,智能家电甚至火星车上。在功能上,它广泛的涉足到了软件应用的各个领域,现在, 它开始向桌面和图像处理方面频频发力。 从历史上看它是一门成熟的语言,从现在来看,它是世界上使用最广泛的 语言,从将来看,它是最有前途的语言(现在它依然充满了活力和创新)。

但是,在越来越流行的 Web 开发领域, Java 似乎逐渐露出了疲态。是的,脚本语言们卷起了一场热潮,似乎已经 快可以用“革命”两个字来形容了。而Java,被“脚本小子们”诟病最多的便是 低下的开发效率

但是,真的是这样的吗?

从本质上来说, Java 语言本身为程序员提供的帮助只有两点,一是语言的语法,二是内置的类库。 现在 从事 Web 开发,大多是采用第三方的类库(或者说是框架),比如流行的 SSH。 所谓 Java 在 Web 开发的低效,不妨这样说比较贴切一些: 采用第三方类库进行开发比较低效

为了证明这一点,我写作了 Nutz, 它是一组轻便小型的框架的集合, 各个部分可以被独立使用。 而 Nutz 的目标 就是

在力所能及的情况下,最大限度的提高Web开发人员的生产力

是的,提高生产力是这个框架唯一的目标。 就像 Java 设计之初,考虑最多的是程序员的易用性和运行时效率 的权衡, Nutz 也是这样。希望通过 Nutz, Java 的开发人员可以获得更快的开发速度,更少的代码量,并且这些 以不损害运行时效率为前提。

支持的环境

  • JDK5+, 推荐JDK8
  • 任意SQL数据库,例如MySQL,Oracle,SqlServer等等
  • 任意支持servlet 2.5的web容器, 推荐Tomcat 8.5+/Jetty 9.2+

Nutz 为谁而设计?

  • 如果你觉得 Hibernate 控制比较繁琐,iBatis 编写SQL又比较麻烦,Nutz.Dao 专为你设计。
  • 如果你觉得在多个服务器部署或者修改 Spring 配置文件很麻烦,Nutz.Ioc 专为你设计
  • 如果你觉得直接写 XML 配置文件很麻烦,可视化编辑器又没控制感,Nutz.Mvc 专为你设计
  • 如果你觉得 JSON 转换很麻烦(要写超过一行以上的代码),Nutz.Json 专为你设计
  • 如果你觉得 Java 语法不如 Ruby 便捷, Nutz.Castor 以及 Nutz.Lang 专为你设计
  • 如果你以前根本没接触过 SSH ,只使用 JDBC 编程, 整个 Nutz 专门为你设计

Nutz 可以做什么?

  • Dao – 针对 JDBC 的薄封装,事务模板,无缓存
  • Ioc – JSON 风格的配置文件,声明时切片支持
  • Mvc – 注解风格的配置,内置多文件上传功能
  • Json – 解析和渲染
  • Castors – Java 对象类型转换
  • Lang – 更简洁的 Java 函数以及更丰富的反射支持
  • Aop – 轻便快速的切面编程支持
  • Resource – 资源扫描

Nutz.Mvc 概述

http://www.nutzam.com/core/mvc/overview.html

几句话的介绍

Nutz.Mvc 是要和一个 Web 服务器 (比如 Tomcat)一起工作的,它存在的意义就是要把一个标准的 HTTP 请求,转发到某一个 Java 函数中

它的特点是:

  • 帮你做参数的解析 (当然你自己可以随意扩展
  • 如果你愿意,你可以不用 View 来渲染 HTTP 输出流
  • 提供几个基本的渲染方式 (比如 JSP, JSON)
  • 除此以外,不内置更多的功能

每一种 HTTP 请求,标识就是一个 URL,而每一个 Java 函数怎样和一个 URL 关联呢? 最直接的办法就是在函数上声明一个 注解,这个注解,在 Nutz.Mvc 中,叫 @At

为了能让你更快速直观的了解 Nutz.Mvc 的工作方式,我提供下面两张图:

每一次请求,都经过如下流程

Nutz.Mvc 根据 @At 注解,将一个 HTTP 请求映射到了一个函数,函数只有一个参数,会被路径参数 (1045) 填充。

  • Nutz.Mvc 最基本的想法,就是通过注解 @At 将一个HTTP请求路径同一个 Java 函数关联起来。
  • 并且,@At 支持你写多个路径

更详细的流程

声明了 @At 的函数被称为 入口函数
*
任何一个请求,都会经过四道工序

A - 过滤: 你通过 @Filters 注解可以为你的入口函数定义任意多的过滤器
1.
B

适配 这个过程将 HTTP 输入流转换成

入口函数

的参数数组

  • 默认的,它认为输入流是传统的名值对方式
  • 更多的适配方式请参看 关于适配器
  • 文件上传也是一种适配方式,请参看 UploadAdptor

C

调用 调用

入口函数

,你在里面需要调用相关的业务层代码。

  • 如果你的业务比较复杂,为了解耦合,你可能需要 Ioc 容器的帮助,请参看 同 Ioc 容器一起工作 一节

D

渲染 根据

入口函数

的返回,渲染 HTTP Response。

如果返回是个 View,则用这个 View 来渲染 null (null? 是的,你没看错,这种情况 View 接口第三个参数会是 null)

  • 你可以用 org.nutz.mvc.view.ViewWrapper 将你的返回对象以及要返回的视图组合在一起返回,ViewWrapper 也是一个 View

否则用函数的 @Ok 注解声明的 View 来渲染入口函数的返回对象
*
如果你的函数处理过程中抛出了异常,用 @Fail 注解声明的 View 来渲染异常对象
*
返回值会保存在request的attr中,名字是obj

Nutz.Dao 概述

这个就是和Mybaits , JPA , Hibernate 作用一样的持久层框架,用起来非常简单

http://www.nutzam.com/core/dao/hello.html

Nutz.Ioc 概述

Ioc 的概念

Nutz.Ioc 从概念上是很简单:将一部分关于对象的依赖关系单独存储在某种介质里,并且 提供一个接口帮助使用者获得这些对象。

但是将依赖关系存储在什么地方呢? Spring 选的是 XML, Guice 选的 Java (硬编码)

Nutz.Ioc 核心逻辑并没有限定配置信息的存储方式,但它还是提供了一个默认的配置文件 编写方式 – JSON。因为

  • 省却了 XML 书写的烦恼
  • 避免了硬编码 – 修改配置,不需要重新编译工程

当然,你可以扩展它,提供自己的配置文件加载方式, Nutz.Ioc 不反对你这样,它甚至 有点鼓励你这样,虽然 JSON 方式的配置文件书写方式已经工作的很好了。

http://www.nutzam.com/core/dao/hello.html

Nutz.Aop 概述

想必玩过Spring的 都对Aop不陌生吧简单来描述就是将你要干的事情切入到指定方法前或者后进行运行

重要提醒:

  • AOP只能用于Ioc Bean对象, 即从Ioc容器获取的对象, 不是直接new一个对象就能aop的
  • 自定义Aop拦截器,一般情况下别"吃掉"异常, 因为事务拦截器需要检测到异常才能回滚
  • 留意拦截器的先后顺序

http://www.nutzam.com/core/dao/hello.html

Nutz.Json 概述

什么是JSON?

JSON的官方定义 : 一种轻量级的数据交换格式

基本形式如下(严格的JSON格式并不允许注释,但Nutz.Json支持Java风格的注释)

{
/** 块注释 */
    name : "wendal",  // 行末注释
    email: "wendal1985@gmail.com", // 名值对, 即Map类型的Key-Value
    tags : ["java", "python", "linux"], // 数组, 即List或Array
    pets : [   //数组元素可以是对象,数组,普通值
        {
            name : "dongdong",
            type : "dog",
            age : 10
        },
        {
            name : "fengfeng",
            type : "unkown",
            age : -1,
            food : "dog"
        }
    ]
}

Nutz对Json的理解

Nutz把Json结构理解为Map-List, 即Map类型及List类型的嵌套

在Nutz中对Json的操作大多数情况下仅一行语句搞定.

http://www.nutzam.com/core/dao/hello.html

表达式引擎简介

http://www.nutzam.com/core/dao/hello.html

为什么需要 EL 表达式引擎

你,对,就是你,正在看这篇文章的人,我虽然不认识你,但是 我可以负责任的说, 如果你看到这个标题就心里在悄悄的呼喊: “靠,他们连这个都有!我省事了,哇哈哈哈和”。 那么,你绝对属于百分之一的特例。 就是说,绝大多数人的绝大多数项目,是不需要 一个嵌入式的表达式引擎的。因此,提供这个功能的目的就是:

满足一小撮人的一小撮要求

但是,"一小撮人"的"一小撮要求"有很多,作为一个小众类库,为什么单单打算支持这个特性呢? 下面是我的理由:

  • 这个功能是其它模块功能的基础,我们需要它

  • 可能因此吸引其他的开发者对 Nutz 的兴趣

  • 需要嵌入式表达式引擎的人是 Java 开发者的少数人,但是这些人也应该比 Nutz 的用户要多

  • 这些人基本上编程水平要强一些

  • 其他的提交者对增加这个特性没有特别强烈的反对

Mapl 结构

为什么需要 Mapl 结构

一直以来都没有刻意的去思考说需要 Mapl 结构这样的东西. 所谓 Mapl 结构就是 Map-List 结构,我原来就叫 maplist 后来被灰太郎说太长,就改成 “mapl” 了

最初都是 wendal 在重写JSON的时候, 将JSON理解成了Mapl结构. 然后突然在某一天发现, 咦, Mapl对象还可以这么用, 那么用, 慢慢的, 以Mapl 基础的小功能点越来越多, 已经不能够完全的与JSON概念协调, 所以才有了这样一个中间结构.

恩, 上面那段是给灰太狼, wendal看的. 我想你肯定看得头有点大, 要不我再说直白点, Mapl结构 就是为Json服务的, 为什么呢? MD, Json.fromJson()忒难用了, 要是只给它一个Reader, 而不给Type, 那它给我返回的就是 Mapl结构 , 苍天呀, 大地呀, 烦都烦死了.

我要取其中的某个值, 我得遍历N层的Map, List, 每次写这种东西的时候, 我都想哭, 所以干脆对它封装吧, 越封越多, 然后就有了这玩意…

当然, 它也与EL一样满足一小撮人的一小撮要求

提醒: Mapl这个名词,是MapList的缩写

什么是 Mapl 结构?

一种以 Map, List 接口对象所组织起来的结构体系. 类似于JSON结构便于JAVA在内存中处理的结构. 主要提供键值对, 与列表的有机组合, 因这种结构只由Map, List组成, 因些称其为Mapl结构.

Map a = new HashMap();
a.put("name","a");
Map b = new HashMap();
b.put("name","b");
Map c = new HashMap();
c.put("name","c");
List list = new ArrayList();
list.add(a);
list.add(b);
list.add(c);
Map d = new HashMap();
d.put("items", list);

通过上面的代码我们就组织了一个Mapl结构, 它等效于以下的JSON文档:

{"items":[{"name":"a"},{"name":"b"},{"name":"c"}]}

当然, Mapl.仅可以用来表示JSON, 也可以用来表示JAVA对象的结构, 然后有了Mapl., 你会发现, 做转换, 合并, 都是非常轻松滴~~~

具体规则:

  • 对象以Map存储, key为属性名, value为属性值
  • 数组以List存储
  • Map直接存储为Map
  • List直接存储为List
  • 只要不是List, Map存储的, 都认为是可以直接写入对象的

java加强

Java 的函数糖

http://www.nutzam.com/core/dao/hello.html

什么是函数糖?

Java 的语法比 C/C++ 友好很多, 因为它设计之初,就是为了考虑到程序员的使用是否舒适。 当然很多事情愿望是美好的,现实是残酷的。Java 语言本身的语法仍然不可避免的带有着 10年前那种 的僵硬和严谨。这里是一些小小的尝试,你会发现,大多数情况,通过一些静态函数,一行代码完全 可以做很多事情, 而且比“甜甜”的 Ruby 也差不了太多。

你可以查看 org.nutz.langGit@OSC镜像 下 的源代码。为了便于你学习,我将里面部分最常用的用法列在文档里,便于快速学习查看。

我希望在 80% 以上的情况下,这些函数能让你有效的缩短你代码的体积,并且增加代码的可读性。

让 Java 类型不那么强

http://www.nutzam.com/core/dao/hello.html

类型强好,还是类型弱好?

强类型好,尤其是对编译器友好。而且 IDE 支持的比较好。 弱类型好,因为程序员写程序的时候,不需要考虑类型,只需 要考虑逻辑。

其实,即使是 Javascript,这样的弱类型语言,也不能很好的将类型互相转换的很好。

我希望在我编程的时候,大多数时间都强类型。我感觉很安全,但是当我想模糊类型的时候,我能有一个工具,帮我把任何 类型转成我希望的另外的类型。当然,我自己定义的对象,我并不介意写一个转换过程,但是请只让我写一次。

所以,这就是 Nutz.Castors

增强反射 – Mirror

http://www.nutzam.com/core/dao/hello.html

反射的意义

Java 是静态语言。但是 JVM 却不那么静态。静态语言的好处是,IDE 可以提供很高级的重构功能。缺点是你的代码 会比较僵化,像 Javascript 一样的动态语言(或者说,后绑定语言),在编写程序时的随心所欲,估计 Java 程序员 是享受不到了。 但是好在 Java 还提供了“反射”。

在任何时候,你如果想在运行时决定采用哪个实现类,或者调用哪个方法,通过反射都可以实现,虽然不那么方便 (你需要捕捉很多无聊的异常),虽然不那么快。

既然这样,那么能不能让反射工作的更好一些呢? org.nutz.langGit@OSC镜像 包提供了 Mirror<T> 类,通过它,你可以更方便的使用反射的特性

代码模板

http://www.nutzam.com/core/lang/segment.html

什么是代码模板

通过 Java 提供的 String.format() 方法,可以很方便的声明字符串模板,以及占位符。 但是,它不方便的是,如果我的字符串模板两个占位符希望的是同一个值:

文件池

什么是文件池

如果大家写一些稍微复杂的应用,可能或多或少的会使用一下临时文件。或者 希望能有一个目录,保存用户上传的文件。你的用法可能有下面两种:

  • 文件不能超过一定数量,超过了自动删除旧的
  • 文件永远保存,除非程序主动删除

对于网络应用,处理用户上传的文件,有一种比较常用的做法是:

  • 把文件的索引以及一些信息记录在数据库里
  • 把文件内容记录在磁盘里

而 Nutz 的文件池,就是为上述这些场景设计的。

图形处理

http://www.nutzam.com/core/img/overview.html 基础用法

更高级的方法 添加水印 验证码 抠图 …

的是,如果我的字符串模板两个占位符希望的是同一个值:

文件池

什么是文件池

如果大家写一些稍微复杂的应用,可能或多或少的会使用一下临时文件。或者 希望能有一个目录,保存用户上传的文件。你的用法可能有下面两种:

  • 文件不能超过一定数量,超过了自动删除旧的
  • 文件永远保存,除非程序主动删除

对于网络应用,处理用户上传的文件,有一种比较常用的做法是:

  • 把文件的索引以及一些信息记录在数据库里
  • 把文件内容记录在磁盘里

而 Nutz 的文件池,就是为上述这些场景设计的。

图形处理

http://www.nutzam.com/core/img/overview.html 基础用法

更高级的方法 添加水印 验证码 抠图 …

http://www.nutzam.com/core/img/advanced.html
点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^_^

相关文章