ActFramework 1.8.32 发布 - 高质量的 Java Web 应用框架

1. ActFramework 1.8.32

ActFramework 是一款高质量的 Java Web 应用框架. 最新的 1.8.32 版本带来了 20 项错误修复和更新. 其中值得关注的有:

1.1 通过 HTTP 访问 CLI 命令 #1305

熟悉 Act 的用户都知道在 Act 提供了大量的内置 CLI 命令, 也提供了非常方便的 CLI 命令创建机制. 如果需要在后端创建一个用户, 只需写出这样的代码即可:

@PropertySpec("id")
@Command(name = "user.create", help = "create user")  
public User create(  
        @Required("specify user email") String email,  
        @Required("specify user password") char[] password,  
        @Optional("specify user role") Role role  
) {  
  User user = findByEmail(email);  
  badRequestIf(null != user, "email[%s] registered already", email);  
  user = new User(email);  
  user.setPassword(password);  
  user.role = null == role ? Role.SUPER_USER : Role.RESTRICTED_USER;  
  return save(user);  
}

使用这个命令则需要在后台通过 telnet 或者 nc 等工具访问服务器的 CLI 服务端口:

这个机制非常方便但在开发时链接 CLI 服务端口会有个问题, 就是服务器在代码更新触发热加载的时候断开 TCP 链接, 因此调试命令需要重新连上 CLI 服务端口, 有点小麻烦. 在 1.8.32 中我们带来了方便的 CLI Over Http 服务机制, 让开发人员在开发时通过 /~/cmd 来访问命令:

这样开发人员无需在后台不停链接 CLI 端口即可随时通过 HTTP 网页来调试 CLI 命令.

1.2 增强 SampleData API, 允许在创建 List/Set 的时候指定创建 Mock 数据的数量 #1301

ActFramework 的 SampleData 提供了强大的 Mock 数据生成 API, 在这个版本中我们进一步增强了这个特性, 可以指定创建 Mock 数据的条目了.

示例代码:

public static class User {  
  public String firstName;  
  public String lastName;  
  public String email;  
}
@GetAction("users/mock")
public List<User> test() {  
  return SampleData.generateList(User.class, 7);  
}

测试:

1.3 从浏览器直接访问返回 Iterable 类型数据的端点, 自动以 HTML table 形式生成响应 #1298

这个增强的结果在上面已经显示出来了. 以前的版本从浏览器访问直接数据返回端点都是以 JSON 形式显示结果的. 看官可能会提问题了, 如果我通过 ajax 形式访问数据端点也会拿到 HTML table 形式的响应吗? 答案是在 ajax 请求中设定好 Accept=application/json ActFramework 会以 JSON 形式发回数据的. 拿刚刚上面的例子来测试:

较真的看官可能又要问了, 如果我就想在浏览器中看 JSON 数据而不是 HTML table 数据怎么办. 这个也不是问题, 使用 _accept=json 请求参数即可:

1.4 HTML-Table 增强 - 表头始终处于页面顶部

1.5 IStorageService 对错误处理的增强 #1295

以前当 IStorageService 发生存储项目未找到, 或者访问受限的错误, 都会导致发出 500 服务器错响应. 现在 ActFramework 能更好地处理这些错误情况, 当发生资源未找到时, 会处理为 404 响应. 访问受限会处理为 403 响应.

1.6 异步结果处理增强 - 使用最初指定的 Content-Type 来生成异步处理结果 #1286

在 ActFramework 中如果有工作是耗时较长的, 比如某些数据报表生成, 可以采用异步处理方式. 

示例代码:

@Async  
@ReportProgress  
@GetAction("/users/async")  
public List<User> simulateLongTimeOperation(ProgressGauge gauge) {  
  final int sz = 100;  
  List<User\> userList = new ArrayList<>(sz);  
  gauge.updateMaxHint(sz);  
  for (int i = 0; i < sz; ++i) {  
  $.sleep(50);  
  userList.add(SampleData.generate(User.class));  
  }  
  return userList;  
}

访问该接口:

以前的版本无论用那种请求类型访问最后都只能看到上面的结果 - JSON 形式生成的响应. 在这个版本里我们缓存了最初的请求响应类型, 并在最后生成结果响应的时候应用请求的响应类型. 下面是演示:

用 html-table 方式访问 /users/async:

用 xlsx 方式访问 /users/async:

2. Act-Beetl 1.7.2

更新 beetl 至 3.0.19.RELEASE

3. Act-BeetlSQL 1.8.2

更新 beetlsql 至 2.12.20.RELEASE

4. Act-Morphia 1.9.0

Act-morphia 是转为 ActFramework 应用程序设计的 MongoDB 访问库. v1.9.0 带来的改进有:

4.1 Dao.update API 改进:

下面的情况如果 firstName 为 null, 则会调用 mongodb 的 $unset 操作删掉 firstName 字段:

4.2 加载 Entity 的时候自动初始化集合类型字段

假设你有下面的 Model 类型:

@Entity("emp")
public class Employee extends MorphiaModel<Employee> {
    public String firstName;
    public String lastName;
    public List<AuditRecord> auditRecords;
}

从数据库中 load 一个 Employee 实例, 假设该记录没有 auditRecords 数据, 以前该字段会是 null, 现在则自动将 auditRecords 字段设置为空 List. 这样做的好处是避免对 auditRecord 字段进行操作的时候还需要进行空值检查.

5. Act-Excel 1.9.0, Act-Excel-java7 1.9.0

5.1 支持不同的输出主题

示例代码:

默认主题:

春意盎然:

五十度灰:

金秋:

5.2 提供帮助方法让应用自己控制 Excel 文档生成

群里有人提出需要定时生成 Excel 文档, 不希望还需要从 HTTP 走一遍, 于是将内部的逻辑抽取出来提供了下面的静态方法方便程序员使用:

ExcelDirectRender.generateExcelFile(Object data, File targetFile);

6. OSGL-Tool 1.24.0 

osgl-tool 是一套 Java 工具库, ActFramework 中大量使用了 osgl-tool 来简化开发. v1.24.0 版本带来一下改变:

6.1 UserAgent 使用 LFU Cache 来替代 HashMap #234

UserAgent 字串解析是一件耗时的工作. 因此我们总是希望将结果缓存下来. 以前的版本采用简单的 HashMap 来缓存 UserAgent 解析结果. 这个速度当然很快,  然而带来的麻烦是 UserAgent 的种类基本上是一个开发的数量, 根据 whatismybrowser 的统计, 有超过 2400 万的不同的 UserAgent 字串. 随着时间的推移, HashMap 的 UserAgent 缓存将吃光服务器上的堆空间.

这个版本中我们使用了 LFU (最低访问次数) 缓存来存储 1000 个 UserAgent 解析结果, 这样大多数常用的 UserAgent 会被缓存起来, 既满足了性能的要求, 也不会对服务器堆空间带来长期的压力.

6.2 Crypto 增加 RSA 方法 #233

在 Crypto 工具类上增加 RSA 的方法:

public static KeyPair generateKeyPair();
public static KeyPair generateKeyPair(int keysize);
public static String encryptRSA(String value, byte[] publicKey);
public static String encryptRSA(String value, String urlSafeBase64EncodedPublicKey);
public static String decryptRSA(String value, byte[] privateKey);
public static String decryptRSA(String value, String urlSafeBase64EncodedPrivateKey);

6.3 UserAgent - 支持 Microsoft Edge #230

6.4 添加 S.acronym(CharSequence) 静态方法

String a = S.acronym("OpenSourceGeneralLibrary"); // a = 'OSGL'

7. 总结

以上就是本次更新中值得关注的部分. 最后给自己的博客做一个友情链接, 请大家观赏一下 如何用不到 70 行 Java 代码撸一个简单的文件上传服务

猜你喜欢

转载自www.oschina.net/news/113849/actframework-1-8-32-released