使用Click框架進行Java Web應用開發/附錄A:常見問題
好的,您已經閱讀了文件並查看了示例應用程式,但仍然有一些內容您不理解。您該怎麼辦?
您可以訪問click-user和click-development郵件新聞組。這是您在開源專案中獲得支援的地方。它是免費的、友好的,並且通常響應速度很快。這些新聞組是其他人提問的地方,也是使用者和開發人員討論想法的地方。強烈推薦,所以不要害羞。
要註冊這些郵件組,請點選以下連結
- click-user - 用於Click使用討論和幫助
- click-development - 用於Click框架開發討論
如果您需要Click的商業支援或培訓,您可以從Avoka Technologies獲得。
更多詳細資訊,請傳送郵件至Malcolm Edgar。
推薦的Click開發工具包括
- ClickIDE
- ClickIDE是由Naoki Takezoe開發的Eclipse Web Tools Project (WTP)外掛。
- 要使用ClickIDE外掛,請建立一個“動態Web專案”,然後選擇“Click”專案Faclet。
- NBClick
- Click的NetBeans外掛正在由Geertjan Wielenga和Ahmed Mohombe開發。
- Velocitywebedit
- Velocitywebedit是Eclipse的Velocity和HTML編輯器外掛。
安裝Velocity Web Edit後,將Eclipe的*.htm檔案關聯配置為使用Velocity編輯器。透過Eclipse選單執行此操作:視窗 > 首選項 > 常規 > 檔案關聯
- Veloeclipse
- Eclipse的Velocity和HTML編輯器外掛
- Veloedit
- Eclipse的Velocity和HTML編輯器外掛
在Click中,沒有任何東西阻止您手動佈局HTML表單。它只是為您提供了自動執行此操作的選項。
您可以使用多種方法生成HTML,每種方法都有其優缺點
這是一種80/20方法,您可以快速開發內容,但它可能無法滿足您所有的UI樣式要求。請注意,表單控制元件提供了許多[click-api/net/sf/click/control/Form.html#auto-layout 自動佈局]選項,請參閱[examples.html click-examples]“表單屬性”以進行演示。表單控制元件還在表單的HTML元素中呈現類屬性“form”、“fields”、“errors”和“buttons”,從而可以進行細粒度的CSS控制。
例如,您可以將表單配置為在頂部顯示標籤,並希望增加欄位之間的垂直間距。要執行此操作,只需在表單前面定義CSS樣式即可
<style type="text/css">
td.fields { padding-top: 0.75em; }
</style>
$form
欄位還使用“id”屬性呈現,從而可以操作各個欄位。
這是一種確保Web應用程式中通用外觀的好方法,但您需要親自動手編寫一些程式碼。
Panel控制元件支援自定義Velocity模板,這是一種建立可重用HTML部分的理想方法,您可以將其包含在許多頁面中。Panel還支援巢狀控制元件,使您的部分能夠支援基於控制元件的行為。
這很容易做到,並且可以在您的Web應用程式中實現良好的重用。
這為您提供了最終的演示控制,但在您的Web應用程式中不提供任何重用。
要實現這一點,可以使用頁面模板技術,該技術在頁面模板主題中進行了詳細說明。在您的Web應用程式中強烈建議使用頁面模板,因為它提供了許多好處,包括
- 大大減少了需要維護的HTML數量
- 確保您的應用程式具有統一的外觀和風格
- 使您的應用程式更健壯,因為需要測試的程式碼更少
控制元件監聽器方法必須返回一個布林值,以指示是否應該繼續處理頁面的控制元件和方法。要繼續處理,監聽器方法應返回true,要中止則應返回false。您可能希望中止進一步處理的原因是,您可以直接導航到另一個頁面,而不是繼續執行其他可能很耗時的控制元件或頁面方法。您可以將此功能用作break或goto語句。例如
public boolean onLogoutClick()
{
setRedirect(Logout.class);
return false;
}
要排除在共享表單類中顯示某些欄位,請使用Form.removeFields()方法。
您甚至可以在頁面模板中執行此操作。只需確保在$form呈現自身之前呼叫它即可。例如
$form.removeFields(["field11", "field15", "field22"])
$form
Click為應用程式本地化和國際化(I18N)需求提供了良好的支援。
Page類使用[click-api/net/sf/click/Page.html#getMessage(java.lang.String) getMessage(String)]方法支援頁面特定的字串本地化包。例如,一個Login類在類路徑上有三個區域設定字串屬性檔案
- /com/mycorp/pages/Login.properties
- /com/mycorp/pages/Login_en.properties
- /com/mycorp/pages/Login_fr.properties
在您的Login Page類中,您可以使用getMessage()方法來查詢請求本地化的訊息字串。
public void onInit()
{
addModel("title", getMessage("title"));
}
在您的HTML頁面模板中,您還可以使用MessagesMap物件訪問本地化訊息,該物件使用名稱“messages”新增到模板中。例如
<h2>$messages.title</h2>
您還可以使用控制元件名稱查詢約定在頁面屬性檔案中定義Field和ActionLink標籤和標題值。
- ActionLink.getLabel()
- ActionLink.getTitle()
- Field.getLabel()
- Field.getTitle()
- FieldSet.getLegend()
Field控制元件類共享一個通用的訊息屬性檔案
- /click-control.properties
field類提供了一些getMessage(String)方法,這些方法支援本地化字串和訊息格式化。
要將頁面編碼為UTF-8字元集,您需要建立一個WEB-INF/velocity.properties檔案,其中包含以下屬性
input.encoding=UTF-8
這將配置Velocity執行時以使用UTF-8。
您還需要將頁面標頭的內容型別設定為UTF-8。您可以使用headers元素在您的WEB-INF/click.xml檔案中為所有應用程式頁面全域性執行此操作
<click>
..
<headers>
<header name="Content-Type" value="text/html;charset=UTF-8"/>
</headers>
..
</click>
這將設定頁面的HttpServletResponse的“Content-Type”標頭為“text/html;charset=UTF-8”。或者,您可以覆蓋Page getContentType()方法以使用此內容型別。
您可以在WEB-INF/click.xml:
<click charset="UTF-8">
..
</click>
中指定應用程式字元集。此字元集用於Velocity輸入編碼和響應Content-Type。因此,如果您在WEB-INF/click.xml中指定了字元集,則無需建立WEB-INF/velocity.properties.
如果您想在Velocity模板中使用其他字元集,可以透過WEB-INF/velocity.properties.
您可以使用Post Redirect模式來防止多次提交表單。使用此模式,一旦使用者提交了表單,您就會重定向到另一個頁面。如果使用者隨後按下重新整理按鈕,他們將對當前頁面進行GET請求。
要防止使用者使用瀏覽器後退按鈕重新提交表單,請使用Form onSubmitCheck()方法
public class Purchase extends Page
{
..
public boolean onSecurityCheck()
{
return form.onSubmitCheck(this, "/invalid-submit.html");
}
}
Click不支援*.html檔案作為Click頁面。這些檔案不會由ClickServlet處理,旨在用作靜態內容。
要使Click和Cayenne能夠很好地協同工作,您需要將以下JAR檔案包含在您的WEB-INF/lib目錄中
- ashwood-1.1.jar
- cayenne-nodeps-1.2.x.jar
- click-1.x.jar
- click-extras-1.x.jar
- log4j-1.2.x.jar
- oro-2.0.8.jar
預設的Cayenne JAR包含Velocity 1.3,它與使用Velocity 1.5-dev的Click不相容,因此我們使用Cayenne無依賴項JAR。當使用Cayenne nodeps JAR時,我們需要新增一些其他Java庫,包括ashwood、log4j和oro。
要將Spring與Click整合,請配置SpringClickServlet而不是普通的ClickServlet。SpringClickServlet包含在Extras庫中。
但是,Spring MVC框架與Click不相容。Spring框架使用類似於Struts和WebWork的低階命令模式設計。Spring使用DispatcherServlet將請求路由到Controller物件,然後將ModelAndView結果傳遞到渲染層。
public interface Controller
{
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception;
}
在Spring MVC中,整合外掛點是Controllers。
Click使用更高級別的設計結構,專注於頁面和控制元件。Click使用自己的ClickServlet來排程對Pages和Controls的請求,它們是Click的外掛點。
Click完全支援JSP頁面。
JSP頁面可以像Velocity模板一樣自動載入,也可以在click.xml檔案中顯式定義。
<page path="customers-table.jsp" class="com.mycorp.pages.CustomersTable"/>
頁面的模型資料值會自動作為屬性新增到請求中,以便在JSP中使用。
其他作為請求屬性新增的Click值包括
- context - Servlet上下文路徑,例如 /mycorp
- format - 用於格式化物件顯示的[click-api/net/sf/click/util/Format.html Format]物件
- forward - JSP頁面資源(.jsp檔案)
- messages - 頁面[click-api/net/sf/click/Page.html#getMessage(java.lang.String) getMessage()]方法的[click-api/net/sf/click/util/MessagesMap.html MessagesMap]介面卡
- path - 頁面的對映請求[click-api/net/sf/click/Page.html#path path]。請注意,這將具有.htm副檔名而不是.jsp副檔名
Click速度很快。
當Click框架處理請求時,它會建立相對較少的物件。這些物件包括Page、Context、Format和一些Controls,而Controls又包含一些列表、對映和字串。
現代JVM分配少量/中等數量的短生命週期物件的速度非常快。
Click實際執行的工作量非常少。
TheonProcess()方法遍歷Controls列表並執行簡單的操作。
ControltoString()方法在渲染表格時可能會分配大型StringBuffer,但表單很少超過4000個字元。當Click建立新的StringBuffer時,它會嘗試確定最大可能的尺寸,以避免額外的記憶體分配和arraycopy操作。
Click幾乎沒有使用反射。反射僅由Control回撥監聽器使用。
okButton.setListener(this, "onOkClicked");
處理請求的下一步是渲染響應。Velocity主要負責此步驟。
Velocity也很快。
雖然在這個領域很難獲得具體的效能資料,但直到最近,Velocity都被認為比JSP快。然而,Velocity郵件列表上的近期討論表明,JSP編譯器已經改進到JSP比Velocity略有效能優勢的程度。無論如何,JSP和Velocity都非常快。
通常建議不要為Click頁面編寫JUnit風格的自動化單元測試,因為成本效益比非常差。如果Click頁面中存在複雜的業務邏輯,則應將此程式碼重構到一個業務級服務類中,以便可以輕鬆地對其進行單元測試並在多個地方重用。
如果您仍然需要為Click頁面編寫單元測試,請使用Click模擬MockContext和MockRequest類,這些類位於mock發行版目錄中。
Click最初不與Velocity一起使用Log4J,因為與垃圾回收VelocityEngines相關的追加程式關閉記憶體洩漏。此問題已在最新的Velocity 1.5開發流中解決。
由於IBM WebSphere應用伺服器的某些版本上出現的類載入器問題,因此未使用Commons Logging。
FreeMarker是一個功能強大的模板引擎,它與Velocity一起被評估用於Click。雖然FreeMarker具有許多Velocity不具備的複雜功能,但選擇Velocity是因為它更容易學習,並且不使用XML風格的標記語法。
與Velocity相比,FreeMarker的優勢之一是錯誤報告。Click透過使用Velocity 1.5的新增增強錯誤報告功能解決了此問題。
Click將渲染包含錯誤的原始碼。例如
- 頁面解析錯誤
- 空指標錯誤
因為現有的框架無法滿足我的需求。Struts的功能不多,而Tapestry過於複雜。有關更全面的答案,請參閱為什麼選擇Click。

