15 Commits

Author SHA1 Message Date
James
2224e0d212 [maven-release-plugin] prepare release enjoy-4.2 2019-06-02 22:07:53 +08:00
James
1a6006fe36 jfinal enjoy 4.2 2019-06-02 22:04:57 +08:00
James
12c3b5fdb5 jfinal enjoy 4.1 release ^_^ 2019-05-30 22:52:36 +08:00
James
f065faf4e7 [maven-release-plugin] prepare for next development iteration 2019-05-29 21:56:23 +08:00
James
b4e277fcc0 [maven-release-plugin] prepare release enjoy-4.1 2019-05-29 21:56:19 +08:00
James
bbc1e24b87 [maven-release-plugin] prepare for next development iteration 2019-05-21 22:57:57 +08:00
James
34c1a9e53a [maven-release-plugin] prepare release enjoy-4.0 2019-05-21 22:57:51 +08:00
James
f6a855b6bf enjoy 4.0 release ^_^ 2019-05-21 22:52:26 +08:00
James
4377d19e2f [maven-release-plugin] prepare for next development iteration 2019-04-07 22:30:17 +08:00
James
820f2806ec [maven-release-plugin] prepare release enjoy-3.8 2019-04-07 22:30:15 +08:00
James
808bdf6079 enjoy 3.8 2019-04-07 22:23:49 +08:00
James
eac1d8d055 enjoy 3.8 2019-04-07 21:45:28 +08:00
James
d5a88b8be4 enjoy 3.8 2019-04-07 21:36:00 +08:00
James
fd5d554171 enjoy 3.8 2019-04-07 21:34:21 +08:00
James
6d18be3df8 [maven-release-plugin] prepare for next development iteration 2019-03-19 16:31:01 +08:00
9 changed files with 70 additions and 113 deletions

View File

@@ -2,15 +2,25 @@
Enjoy 是基于 Java 语言的极轻量极魔板引擎。极轻量级仅 171K 并且不依赖任何第三方。极简设计仅 if、for、switch、set、define、include、render 七个核心指令,让学习成本低到极致。独创 DKFF(Dynamic Key Feature Forward) 词法分析算法与 DLRD (Double Layer Recursive Descent)语法分析算法,避免使用 javacc、antlr、jflex 生成器,令代码量少到极致。 Enjoy 是基于 Java 语言的极轻量极魔板引擎。极轻量级仅 171K 并且不依赖任何第三方。极简设计仅 if、for、switch、set、define、include、render 七个核心指令,让学习成本低到极致。独创 DKFF(Dynamic Key Feature Forward) 词法分析算法与 DLRD (Double Layer Recursive Descent)语法分析算法,避免使用 javacc、antlr、jflex 生成器,令代码量少到极致。
#### Maven 坐标
```java
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>enjoy</artifactId>
<version>4.2</version>
</dependency>
```
#### Enjoy 主要特点 #### Enjoy 主要特点
- 消灭传统模板引擎中大量繁杂概念,仅七个核心指令,学习成本极低 - 消灭传统模板引擎中大量繁杂概念,仅七个核心指令,学习成本极低
- 独创 DKFF 词法分析算法与 DLRD 语法分析算法,避免使用 javacc、antlr - 独创 DKFF 词法分析算法与 DLRD 语法分析算法,避免使用 javacc、antlr
- 功能强大,极为简单覆盖掉 freemarker、velocity 的核心功能
- 扩展性强,支持多种扩展方式,且是唯一支持指令级扩展的模板引擎
- 与 java 打通式设计,在模板中与 java 交互极为方便 - 与 java 打通式设计,在模板中与 java 交互极为方便
- 贴近 java 使用直觉,为 java 开发者量身打造 - 贴近 java 使用直觉,为 java 开发者量身打造
- 功能强大,极为简单覆盖掉 freemarker、velocity 的核心功能
- 扩展性强,支持多种扩展方式,且是唯一支持指令级扩展的模板引擎
- 回归模板引擎渲染 View 数据的本质,采用指令式设计,避免 view 层表达复杂逻辑 - 回归模板引擎渲染 View 数据的本质,采用指令式设计,避免 view 层表达复杂逻辑
- 体积小,仅 171K,且不依赖于任何第三方 - 体积小,仅 227 KB,且不依赖于任何第三方
#### 简单示例: #### 简单示例:

View File

@@ -4,7 +4,7 @@
<artifactId>enjoy</artifactId> <artifactId>enjoy</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>enjoy</name> <name>enjoy</name>
<version>3.7</version> <version>4.2</version>
<url>http://www.jfinal.com</url> <url>http://www.jfinal.com</url>
<description>Enjoy is a simple, light, rapid, independent, extensible Java Template Engine.</description> <description>Enjoy is a simple, light, rapid, independent, extensible Java Template Engine.</description>

View File

@@ -30,11 +30,6 @@ import java.util.Map;
@SuppressWarnings({"serial", "rawtypes", "unchecked"}) @SuppressWarnings({"serial", "rawtypes", "unchecked"})
public class Kv extends HashMap { public class Kv extends HashMap {
@Deprecated
private static final String STATE_OK = "isOk";
@Deprecated
private static final String STATE_FAIL = "isFail";
public Kv() { public Kv() {
} }
@@ -46,68 +41,6 @@ public class Kv extends HashMap {
return new Kv(); return new Kv();
} }
@Deprecated
public static Kv ok() {
return new Kv().setOk();
}
@Deprecated
public static Kv ok(Object key, Object value) {
return ok().set(key, value);
}
@Deprecated
public static Kv fail() {
return new Kv().setFail();
}
@Deprecated
public static Kv fail(Object key, Object value) {
return fail().set(key, value);
}
@Deprecated
public Kv setOk() {
super.put(STATE_OK, Boolean.TRUE);
super.put(STATE_FAIL, Boolean.FALSE);
return this;
}
@Deprecated
public Kv setFail() {
super.put(STATE_FAIL, Boolean.TRUE);
super.put(STATE_OK, Boolean.FALSE);
return this;
}
@Deprecated
public boolean isOk() {
Boolean isOk = (Boolean)get(STATE_OK);
if (isOk != null) {
return isOk;
}
Boolean isFail = (Boolean)get(STATE_FAIL);
if (isFail != null) {
return !isFail;
}
throw new IllegalStateException("调用 isOk() 之前,必须先调用 ok()、fail() 或者 setOk()、setFail() 方法");
}
@Deprecated
public boolean isFail() {
Boolean isFail = (Boolean)get(STATE_FAIL);
if (isFail != null) {
return isFail;
}
Boolean isOk = (Boolean)get(STATE_OK);
if (isOk != null) {
return !isOk;
}
throw new IllegalStateException("调用 isFail() 之前,必须先调用 ok()、fail() 或者 setOk()、setFail() 方法");
}
public Kv set(Object key, Object value) { public Kv set(Object key, Object value) {
super.put(key, value); super.put(key, value);
return this; return this;

View File

@@ -16,6 +16,9 @@
package com.jfinal.kit; package com.jfinal.kit;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
/** /**
* 反射工具类 * 反射工具类
*/ */
@@ -29,6 +32,45 @@ public class ReflectKit {
} }
} }
public static String getMethodSignature(Method method) {
StringBuilder ret = new StringBuilder()
.append(method.getDeclaringClass().getName())
.append(".")
.append(method.getName())
.append("(");
int index = 0;
Parameter[] paras = method.getParameters();
for (Parameter p : paras) {
if (index++ > 0) {
ret.append(", ");
}
ret.append(p.getParameterizedType().getTypeName());
}
return ret.append(")").toString();
}
/*
public static String getMethodSignature(Method method) {
StringBuilder ret = new StringBuilder()
.append(method.getDeclaringClass().getName())
.append(".")
.append(method.getName())
.append("(");
int index = 0;
java.lang.reflect.Type[] paraTypes = method.getGenericParameterTypes();
for (java.lang.reflect.Type type : paraTypes) {
if (index++ > 0) {
ret.append(", ");
}
ret.append(type.getTypeName());
}
return ret.append(")").toString();
}*/
} }

View File

@@ -17,7 +17,6 @@
package com.jfinal.template; package com.jfinal.template;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
@@ -117,16 +116,10 @@ public class Template {
* 适用于代码生成器类似应用场景 * 适用于代码生成器类似应用场景
*/ */
public void render(Map<?, ?> data, File file) { public void render(Map<?, ?> data, File file) {
FileOutputStream fos = null; try (FileOutputStream fos = new FileOutputStream(file)) {
try {
fos = new FileOutputStream(file);
render(data, fos); render(data, fos);
} catch (FileNotFoundException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} finally {
if (fos != null) {
try {fos.close();} catch (IOException e) {e.printStackTrace(System.err);}
}
} }
} }

View File

@@ -28,10 +28,10 @@ import com.jfinal.template.stat.Scope;
* *
* field 表达式取值优先次序,以 user.name 为例 * field 表达式取值优先次序,以 user.name 为例
* 1假如 user.getName() 存在,则优先调用 * 1假如 user.getName() 存在,则优先调用
* 2假如 user 为 Model 子类,则调用 user.get("name") * 2假如 user 具有 public name 属性,则取 user.name 属性值
* 3假如 user 为 Record,则调用 user.get("name") * 3假如 user 为 Model 子类,则调用 user.get("name")
* 4假如 user 为 Map,则调用 user.get("name") * 4假如 user 为 Record,则调用 user.get("name")
* 5假如 user 具有 public name 属性,则取 user.name 属性值 * 5假如 user 为 Map则调用 user.get("name")
*/ */
public class Field extends Expr { public class Field extends Expr {

View File

@@ -44,10 +44,13 @@ public class FieldKit {
LinkedList<FieldGetter> ret = new LinkedList<FieldGetter>(); LinkedList<FieldGetter> ret = new LinkedList<FieldGetter>();
ret.addLast(new GetterMethodFieldGetter(null)); ret.addLast(new GetterMethodFieldGetter(null));
ret.addLast(new RealFieldGetter(null));
// ret.addLast(new ModelFieldGetter()); // ret.addLast(new ModelFieldGetter());
// ret.addLast(new RecordFieldGetter()); // ret.addLast(new RecordFieldGetter());
ret.addLast(new MapFieldGetter()); ret.addLast(new MapFieldGetter());
ret.addLast(new RealFieldGetter(null));
// 挪到第二的位置addSharedObject(..., modelObj) 用法可以获取到 model 中的 public 属性
// ret.addLast(new RealFieldGetter(null));
ret.addLast(new ArrayLengthGetter()); ret.addLast(new ArrayLengthGetter());
// ret.addLast(new IsMethodFieldGetter()); // ret.addLast(new IsMethodFieldGetter());

View File

@@ -18,7 +18,6 @@ package com.jfinal.template.source;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.net.URL; import java.net.URL;
@@ -141,9 +140,8 @@ public class ClassPathSource implements ISource {
public static StringBuilder loadFile(InputStream inputStream, String encoding) { public static StringBuilder loadFile(InputStream inputStream, String encoding) {
StringBuilder ret = new StringBuilder(); StringBuilder ret = new StringBuilder();
BufferedReader br = null;
try { try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, encoding))) {
br = new BufferedReader(new InputStreamReader(inputStream, encoding));
// br = new BufferedReader(new FileReader(fileName)); // br = new BufferedReader(new FileReader(fileName));
String line = br.readLine(); String line = br.readLine();
if (line != null) { if (line != null) {
@@ -159,16 +157,6 @@ public class ClassPathSource implements ISource {
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
// com.jfinal.kit.LogKit.error(e.getMessage(), e);
e.printStackTrace();
}
}
}
} }
public String toString() { public String toString() {

View File

@@ -19,7 +19,6 @@ package com.jfinal.template.source;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import com.jfinal.template.EngineConfig; import com.jfinal.template.EngineConfig;
@@ -92,9 +91,8 @@ public class FileSource implements ISource {
public static StringBuilder loadFile(File file, String encoding) { public static StringBuilder loadFile(File file, String encoding) {
StringBuilder ret = new StringBuilder((int)file.length() + 3); StringBuilder ret = new StringBuilder((int)file.length() + 3);
BufferedReader br = null;
try { try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), encoding))) {
br = new BufferedReader(new InputStreamReader(new FileInputStream(file), encoding));
// br = new BufferedReader(new FileReader(fileName)); // br = new BufferedReader(new FileReader(fileName));
String line = br.readLine(); String line = br.readLine();
if (line != null) { if (line != null) {
@@ -110,16 +108,6 @@ public class FileSource implements ISource {
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
// com.jfinal.kit.LogKit.error(e.getMessage(), e);
e.printStackTrace();
}
}
}
} }
public String toString() { public String toString() {