ActFramework 是一款高質量的 Java Web 應用框架. 最新的 1.8.32 版本帶來了 20 項錯誤修復和更新. 其中值得關注的有:
熟悉 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 命令.
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); }
測試:
這個增強的結果在上面已經顯示出來了. 以前的版本從瀏覽器訪問直接數據返回端點都是以 JSON 形式顯示結果的. 看官可能會提問題了, 如果我通過 ajax 形式訪問數據端點也會拿到 HTML table 形式的響應嗎? 答案是在 ajax 請求中設定好 Accept=application/json
ActFramework 會以 JSON 形式發回數據的. 拿剛剛上面的例子來測試:
較真的看官可能又要問了, 如果我就想在瀏覽器中看 JSON 數據而不是 HTML table 數據怎麼辦. 這個也不是問題, 使用 _accept=json
請求參數即可:
以前當 IStorageService 發生存儲項目未找到, 或者訪問受限的錯誤, 都會導致發出 500 伺服器錯響應. 現在 ActFramework 能更好地處理這些錯誤情況, 當發生資源未找到時, 會處理為 404 響應. 訪問受限會處理為 403 響應.
在 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
:
更新 beetl 至 3.0.19.RELEASE
更新 beetlsql 至 2.12.20.RELEASE
Act-morphia 是轉為 ActFramework 應用程式設計的 MongoDB 訪問庫. v1.9.0 帶來的改進有:
下面的情況如果 firstName
為 null
, 則會調用 mongodb 的 $unset 操作刪掉 firstName 欄位:
假設你有下面的 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
欄位進行操作的時候還需要進行空值檢查.
示例代碼:
默認主題:
春意盎然:
五十度灰:
金秋:
群裡有人提出需要定時生成 Excel 文檔, 不希望還需要從 HTTP 走一遍, 於是將內部的邏輯抽取出來提供了下面的靜態方法方便程式設計師使用:
ExcelDirectRender.generateExcelFile(Object data, File targetFile);
osgl-tool 是一套 Java 工具庫, ActFramework 中大量使用了 osgl-tool 來簡化開發. v1.24.0 版本帶來一下改變:
UserAgent
使用 LFU Cache 來替代 HashMap #234UserAgent 字串解析是一件耗時的工作. 因此我們總是希望將結果緩存下來. 以前的版本採用簡單的 HashMap 來緩存 UserAgent 解析結果. 這個速度當然很快, 然而帶來的麻煩是 UserAgent 的種類基本上是一個開發的數量, 根據 whatismybrowser 的統計, 有超過 2400 萬的不同的 UserAgent 字串. 隨著時間的推移, HashMap 的 UserAgent 緩存將吃光伺服器上的堆空間.
這個版本中我們使用了 LFU (最低訪問次數) 緩存來存儲 1000 個 UserAgent 解析結果, 這樣大多數常用的 UserAgent 會被緩存起來, 既滿足了性能的要求, 也不會對伺服器堆空間帶來長期的壓力.
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);
UserAgent
- 支持 Microsoft Edge #230S.acronym(CharSequence)
靜態方法String a = S.acronym("OpenSourceGeneralLibrary"); // a = 'OSGL'
以上就是本次更新中值得關注的部分. 最後給自己的博客做一個友情連結, 請大家觀賞一下 如何用不到 70 行 Java 代碼擼一個簡單的文件上傳服務