![ActFramework 1.8.32 發佈 - 高質量的 Java Web 應用框架](http://p2.ttnews.xyz/loading.gif)
1. ActFramework 1.8.32
ActFramework 是一款高質量的 Java Web 應用框架. 最新的 1.8.32 版本帶來了 20 項錯誤修復和更新. 其中值得關注的有:
1.1 通過 HTTP 訪問 CLI 命令 #1305
熟悉 Act 的用戶都知道在 Act 提供了大量的內置 CLI 命令, 也提供了非常方便的 CLI 命令創建機制. 如果需要在後端創建一個用戶, 只需寫出這樣的代碼即可:
<code>@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);
}/<code>
使用這個命令則需要在後臺通過 telnet 或者 nc 等工具訪問服務器的 CLI 服務端口:
![ActFramework 1.8.32 發佈 - 高質量的 Java Web 應用框架](http://p2.ttnews.xyz/loading.gif)
這個機制非常方便但在開發時鏈接 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 數據的條目了.
示例代碼:
<code>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);
}/<user>/<code>
測試:
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 中如果有工作是耗時較長的, 比如某些數據報表生成, 可以採用異步處理方式.
示例代碼:
<code>@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;
}/<user>/<user>/<code>
訪問該接口:
以前的版本無論用那種請求類型訪問最後都只能看到上面的結果 - 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 類型:
<code>@Entity("emp")
public class Employee extends MorphiaModel<employee> {
public String firstName;
public String lastName;
public List<auditrecord> auditRecords;
}/<auditrecord>/<employee>/<code>
從數據庫中 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 走一遍, 於是將內部的邏輯抽取出來提供了下面的靜態方法方便程序員使用:
<code>ExcelDirectRender.generateExcelFile(Object data, File targetFile);/<code>
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 的方法:
<code>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);/<code>
6.3 UserAgent - 支持 Microsoft Edge #230
6.4 添加 S.acronym(CharSequence) 靜態方法
<code>String a = S.acronym("OpenSourceGeneralLibrary"); // a = 'OSGL'/<code>
閱讀更多 Java架構師日記 的文章