使用 Click 框架進行 Java Web 應用程式開發/配置
本節討論如何設定配置 Click Web 應用程式,涵蓋以下主題
Click 配置檔案包括
|
|
為了使 Click Web 應用程式正常執行,必須在 Web 應用程式的/WEB-INF/web.xml檔案中配置 ClickServlet。下面提供了一個簡單的 Web 應用程式,它將所有*.htm請求對映到 ClickServlet。
<web-app>
<servlet>
<servlet-name>click-servlet</servlet-name>
<servlet-class>net.sf.click.ClickServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>click-servlet</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
</web-app>
預設情況下,ClickServlet將嘗試使用路徑載入應用程式配置檔案/WEB-INF/click.xml
如果在WEB-INF目錄下找不到此檔案,則 ClickServlet 將嘗試從類路徑中載入它,作為/click.xml.
按照慣例,所有 Click 頁面模板都應具有 .htm 副檔名,並且 ClickServlet 應對映到處理所有 *.htm URL 請求。使用此約定,您可以讓所有靜態 HTML 頁面使用 .html 副檔名,它們不會被處理為 Click 頁面。
請注意,您應該始終將load-on-startup元素設定為 0,以便在伺服器啟動時初始化 servlet。這將防止第一個使用該應用程式的客戶端出現任何延遲。
TheClickServlet在啟動時執行儘可能多的工作以提高以後的效能。Click 啟動和快取策略是在“中的 Click 應用程式模式元素中配置的click.xml”配置檔案。
Click 應用程式的核心是click.xml配置檔案。此檔案指定應用程式頁面、標題、格式物件和應用程式模式。
請參閱 附錄 C:Click DTD 以瞭解 click-app XML 定義。
下面提供了一個簡單的 Click 應用程式配置檔案
<click-app>
<pages package="com.mycorp.page"/>
</click-app>
一個帶選項的配置檔案示例是
<click-app charset="UTF-8" locale="de">
<pages package="com.mycorp.page">
<page path="index.htm" classname="com.mycorp.page.Home"/>
</pages>
<format classname="com.mycorp.util.Format"/>
<mode value="profile"/>
<file-item-factory classname="com.mycorp.util.AppFileItemFactory"/>
</click-app>
根 click-app 元素定義兩個應用程式本地化屬性 charset 和 locale。
<!ELEMENT click-app (pages?, headers?, format?, mode?, controls?, file-item-factory?)>
<!ATTLIST click-app charset CDATA #IMPLIED>
<!ATTLIST click-app locale CDATA #IMPLIED>
charset 屬性定義
- Velocity 模板
- HttpServletRequest 字元編碼
- 頁面內容型別字元集
的字元編碼集。locale 屬性定義應用程式的預設語言環境。如果定義了此值,它將覆蓋請求返回的語言環境。
例如,以下配置將應用程式字元集設定為 UTF-8,並將預設語言環境設定為德語 (de)
<click-app charset="UTF-8" locale="de">
..
</click-app>
click-app 的第一個子元素是必需的pages元素,它定義了 Click 頁面的列表。
<!ELEMENT pages (page*)>
<!ATTLIST pages package CDATA #IMPLIED>
<!ATTLIST pages automapping (true|false) "true">
<!ATTLIST pages autobinding (true|false) "true">
pages 元素可以指定一個預設的 package 名稱,該名稱將作為任何定義頁面的類名的字首。
pages 元素還定義了 automapping 屬性。
page 元素定義 Click 應用程式頁面。
<!ELEMENT page (header*)>
<!ATTLIST page path CDATA #REQUIRED>
<!ATTLIST page classname CDATA #REQUIRED>
每個頁面的 path 必須是唯一的,因為 Click 應用程式將 HTTP 請求對映到頁面路徑。
Click 應用程式將使用配置的頁面 classname 為給定請求建立一個新的 Page 例項。所有頁面都必須是 Page 的子類並提供一個公共無引數建構函式,以便可以例項化它們。
頁面還可以定義 header 值,這些值將在下一主題中討論。
當 Click 應用程式啟動時,它將檢查所有頁面定義。如果存在嚴重配置錯誤,ClickSerlvet 將記錄一個ERROR訊息並丟擲一個 UnavailableException。如果發生這種情況,Click 應用程式將永久不可用,直到修復錯誤並重新啟動 Web 應用程式。
頁面自動對映將使用一組簡單的規則自動配置應用程式頁面。這使您可以大大簡化配置檔案,因為您只需要定義不符合自動對映規則的頁面。
自動對映將嘗試將 Web 應用程式中的每個頁面模板 (*.htm) 和 JSP 檔案(不包括 WEB-INF 和 click 目錄下的檔案)與一個 Page 類關聯。自動對映的頁面將在手動定義的頁面載入後加載,手動定義的頁面優先。當啟用自動對映時,Click 應用程式將在除錯或跟蹤模式下記錄頁面對映。
例如,給定一個頁面路徑到類對映
index.htm => com.mycorp.page.Home
search.htm => com.mycorp.page.Search
contacts/contacts.htm => com.mycorp.page.contacts.Contacts
security/login.htm => com.mycorp.page.security.Login
security/logout.htm => com.mycorp.page.security.Logout
security/change-password.htm => com.mycorp.page.security.ChangePassword
這將使用包字首手動定義配置為
<click-app>
<pages package="com.mycorp.page" automapping="false">
<page path="index.htm" classname="Home"/>
<page path="search.htm" classname="Search"/>
<page path="contacts/contacts.htm" classname="contacts.Contacts"/>
<page path="security/login.htm" classname="security.Login"/>
<page path="security/logout.htm" classname="security.Logout"/>
<page path="security/change-password.htm" classname="security.ChangePassword"/>
</pages>
</click-app>
使用自動對映,您只需要定義 Home 頁面,它不會自動對映到 index.html。
<click-app>
<pages package="com.mycorp.page">
<page path="index.htm" classname="Home"/>
</pages>
</click-app>
頁面模板名稱到類名約定是
change-password.htm => ChangePassword
change_password.htm => ChangePassword
changePassword.htm => ChangePassword
ChangePassword.htm => ChangePassword
在自動對映頁面時,如果找不到類,Click 將嘗試新增 'Page' 字尾到類名(如果不存在)並對映它。例如
customer.htm => CustomerPage
change-password.htm => ChangePasswordPage
使用頁面自動對映,可能存在您不希望應用自動對映的資源。例如,在使用包含大量.htm檔案的 JavaScript 庫時,您不希望自動對映嘗試為每個檔案查詢 Page 類。
在這些情況下,您可以使用 pagesexcludes元素。
<!ELEMENT excludes (#PCDATA)>
<!ATTLIST excludes pattern CDATA #REQUIRED>
例如,如果我們的應用程式使用 TinyMCE JavaScript 庫,我們可以配置我們的頁面自動對映以排除所有.htm位於/tiny_mce目錄下的檔案。
<click-app>
<pages package="com.mycorp.page">
<excludes pattern="/tiny_mce/*"/>
</pages>
</click-app>
排除模式可以使用逗號分隔的符號指定多個目錄或檔案。例如
<click-app>
<pages package="com.mycorp.page">
<excludes pattern="/dhtml/*, /tiny_mce/*, banner.htm, about.htm"/>
</pages>
</click-app>
從頁面自動對映中排除的 HTM 檔案由具有啟用快取標頭的內部 Page 類處理。
預設情況下,所有頁面都啟用了自動繫結。啟用自動繫結後,ClickServlet 將自動
- 在呼叫頁面建構函式後將所有公共控制元件新增到頁面
- 在呼叫頁面建構函式後將所有請求引數繫結到公共欄位
- 在渲染之前將所有公共欄位新增到頁面模型
您可以透過將 autobinding 屬性設定為 false 來關閉此行為,例如
<click-app>
<pages package="com.mycorp.page" autobinding="false"/>
</click-app>
可選的headers元素定義了一個header元素的列表,該列表將應用於所有頁面。
<!ELEMENT headers (header*)>
Theheader元素定義將應用於 HttpServletResponse 的標頭名稱和值對。
<!ELEMENT header (#PCDATA)>
<!ATTLIST header name CDATA #REQUIRED>
<!ATTLIST header value CDATA #REQUIRED>
<!ATTLIST header type (String|Integer|Date) "String">
頁面標題在 Page 構造完成但onInit()呼叫之前設定。頁面隨後可以使用headerspropertysetHeader()方法修改其
標頭通常用於關閉瀏覽器快取。預設情況下,如果您未在應用程式中定義,Click 將使用以下無快取標頭值:headers元素。
<headers>
<header name="Pragma" value="no-cache"/>
<header name="Cache-Control"
value="no-store, no-cache, must-revalidate, post-check=0, pre-check=0"/>
<header name="Expires" value="1" type="Date"/>
</headers>
或者,您可以在頁面中或透過設定標頭值,為所有應用程式頁面分別定義標頭。例如,要關閉登入頁面的快取,請注意日期型別的值應為長數字值。
<page path="login.htm" classname="com.mycorp.page.Login"/>
<header name="Pragma" value="no-cache"/>
<header name="Expires" value="1" type="Date"/>
</page>
如果要為特定頁面啟用快取,可以設定以下頁面快取控制標頭。這將標記頁面為可快取,持續時間為 1 小時,之後應重新載入。
<page path="home.htm" classname="com.mycorp.page.Home"/>
<header name="Cache-Control" value="max-age=3600, public, must-revalidate"/>
</page>
要在全域性範圍內應用標頭值,請在標頭元素中定義標頭值。例如,
<click-app>
<pages>
..
</pages>
<headers>
<header name="Pragma" value="no-cache"/>
<header name="Cache-Control"
value="no-store, no-cache, must-revalidate, post-check=0, pre-check=0"/>
<header name="Expires" value="1" type="Date"/>
</headers>
</click-app>
可選的格式元素定義應用於所有頁面的 Format 物件類名。
<!ELEMENT format (#PCDATA)>
<ATTLIST format classname CDATA #FIXED "net.sf.click.util.Format">
預設情況下,所有 Click 頁面都配置有 **net.sf.click.util.Format** 物件。該格式物件在使用名稱的 Velocity 頁面模板中可用:$format.
要指定自定義格式類,請在 click-app 描述符中配置一個格式元素。例如,
<click-app>
..
<format classname="com.mycorp.util.CustomFormat"/>
</click-app>
可選的模式元素定義應用程式日誌記錄和快取模式。
<!ELEMENT mode (#PCDATA)>
<ATTLIST mode value (production|profile|development|debug|trace) "development">
預設情況下,Click 應用程式在開發模式下執行,這將關閉頁面模板快取,並將日誌記錄級別設定為資訊.
要更改預設應用程式模式,請在 click-app 描述符中配置一個模式元素。例如,要指定生產模式,您需要新增以下模式元素:
<click-app>
..
<mode value="production">
</click-app>
應用程式模式配置可以透過設定系統屬性來覆蓋"click.mode"。這可以在生產系統上除錯問題的情況下使用,您將模式更改為跟蹤透過設定以下系統屬性並重新啟動應用程式。
- -Dclick.mode=trace
Click 應用程式模式及其對頁面自動載入、Velocity 快取、啟動時載入模板和日誌記錄級別的設定如下所示:
| 應用程式模式 | 頁面自動載入 | Velocity 快取 | 啟動時載入模板 | Click 日誌記錄級別 | Velocity 日誌記錄級別 |
|---|---|---|---|---|---|
| 生產 | 否 | 是 | 是 | 警告 | ERROR |
| 個人資料 | 否 | 是 | 是 | 資訊 | ERROR |
| 開發 | 是 | 否 | 否 | 資訊 | ERROR |
| 除錯 | 是 | 否 | 否 | 除錯 | ERROR |
| 跟蹤 | 是 | 否 | 否 | 跟蹤 | 警告 |
啟用頁面自動載入時,任何新的頁面模板和類都將在執行時自動載入。這些頁面使用 頁面自動對映 規則載入。
頁面自動載入對於快速開發非常方便,因為您不必重新啟動應用程式伺服器即可獲取新的頁面。
啟用 Velocity 快取時,Velocity 頁面模板和宏檔案將載入一次並快取。啟用快取後,將設定以下 Velocity 執行時屬性:
webapp.resource.loader.cache=true
webapp.resource.loader.modificationCheckInterval=0
velocimacro.library.autoreload=false
停用 Velocity 快取時,Velocity 模板和宏檔案將在每次更改時重新載入。停用快取後,將設定以下 Velocity 執行時屬性:
webapp.resource.loader.cache=false
velocimacro.library.autoreload=true
模板重新載入對於應用程式開發很有用,因為您可以在執行的應用程式伺服器上編輯頁面模板,並立即看到更改。但是,這**不應**用於生產環境,因為 Velocity 在內省模板時會使用大量記憶體,並且模板重新載入速度明顯更慢。
Click 和 Velocity 執行時使用 ClickLogger 記錄訊息。執行時記錄器將向控制檯傳送訊息System.out。例如,以下日誌記錄輸出是應用程式模式為時的 HomePage 請求:跟蹤:
[Click] [debug] GET https://:8080/quickstart/home.htm [Click] [trace] invoked: HomePage.<<init>> [Click] [trace] invoked: HomePage.onSecurityCheck() : true [Click] [trace] invoked: HomePage.onInit() [Click] [trace] invoked: HomePage.onGet() [Click] [trace] invoked: HomePage.onRender() [Click] [info ] renderTemplate: /home.htm - 6 ms [Click] [trace] invoked: HomePage.onDestroy() [Click] [info ] handleRequest: /home.htm - 24 ms
任何未處理的Throwable錯誤由 ClickServlet 記錄。
當應用程式不在生產模式下時,錯誤頁面會顯示詳細的除錯資訊。當應用程式模式為生產時,不會顯示任何除錯資訊,以防止洩露敏感資訊。此行為可以透過修改已部署的click/error.htm頁面模板來更改。
可選的控制元件元素定義了一個控制元素,這些元素將在應用程式啟動時部署。
<!ELEMENT controls (control*)>
The控制註冊將在 click 應用程式啟動時呼叫其 onDeploy() 方法的 Control 類。
<!ELEMENT control (#PCDATA)>
<!ATTLIST control classname CDATA #REQUIRED>
例如,要註冊一個CustomField控制元件類,您需要將以下元素新增到您的click.xml檔案中
<click-app>
..
<controls>
<control classname="com.mycorp.control.CustomField"/>
</controls>
</click-app>
可選的檔案項工廠元素定義要用於處理多部分檔案上傳請求的 Commons FileUpload FileItemFactory 物件。
<!ELEMENT file-item-factory (property*)>
<ATTLIST file-item-factory classname CDATA #FIXED "org.apache.commons.fileupload.disk.DiskFileItemFactory">
<!-- FileItem Factory property set after factory creation. -->
<!ELEMENT property (#PCDATA)>
<!ATTLIST property name CDATA #REQUIRED>
<!ATTLIST property value CDATA #REQUIRED>
預設情況下,檔案上傳請求使用 DiskFileItemFactory 處理。
還可以透過指定屬性元素來設定工廠屬性。這些屬性值將使用 OGNL 型別強制轉換應用於 FileItemFactory。例如,
<click-app>
..
<file-item-factory classname="org.apache.commons.fileupload.disk.DiskFileItemFactory">
<property name="sizeThreshold" name="524288"/>
</file-item-factory>
</click-app>
Velocity 執行時引擎在ClickServlet啟動時透過一系列屬性進行配置。設定的預設 Velocity 屬性為
resource.loader=webapp
webapp.resource.loader.class=org.apache.velocity.tools.view.servlet.WebappLoader
webapp.resource.loader.cache=[true|false] depending on application mode
webapp.resource.loader.modificationCheckInterval=0 depending on application mode
velocimacro.library.autoreload=[true|false] depending on application mode
velocimacro.library=click/VM_global_library.vm
有關這些屬性的詳細資訊,請參閱 Velocity 配置鍵和值開發者指南。請注意,在跟蹤模式下,ClickServlet 將記錄啟動時使用的 Velocity 屬性。
如果您想新增一些自己的 Velocity 屬性,或替換 Click 的屬性,請在WEB-INF目錄中新增一個名為 velocity.properties 的檔案。Click 將自動獲取此檔案並載入這些屬性。
例如,假設我們有自己的 Velocity 宏庫,名為mycorp.vm,我們可以透過新增一個velocimacro.library屬性來覆蓋預設的WEB-INF/velocity.properties檔案到我們的 Web 應用程式。在此檔案中,我們接下來將定義屬性為
velocimacro.library=mycorp.vm
請勿將 Velocity 宏放置在 WEB-INF 目錄下,因為 Velocity ResourceManager 將無法載入它們。
設定您自己的宏檔案的最簡單方法是在 Web 應用程式的根目錄下新增一個名為macro.vm的檔案。在啟動時,Click 將首先檢查此檔案是否存在,如果存在,它將使用該檔案,而不是click/VM_global_library.vm.
Click 框架使用 Velocity Tools 的WebappLoader載入模板。這避免了在 JEE 應用程式伺服器上使用 Velocity 的FileResourceLoader相關的問題。
為了使預先配置的資源(模板、樣式表等)可供 Web 應用程式使用,Click 會在啟動時自動將配置的類路徑資源部署到/click目錄(如果尚未存在)。
您可以修改這些支援檔案,Click 不會覆蓋它們。這些檔案包括
- click/error.htm - 頁面 [pages.html#page-error-handling 錯誤處理] 模板
- click/control.css - 控制元件級聯樣式表
- click/control.js - 控制元件 JavaScript 庫
- click/not-found.htm - [pages.html#page-not-found 頁面未找到] 模板
- click/VM_Global_library.vm - 一個空的 Velocity 宏庫
如果 Click 由於受限的檔案系統許可權而無法部署這些檔案,將記錄警告訊息。
如果您的應用程式伺服器具有受限許可權,您將需要將這些自動部署檔案打包到 Web 應用程式的 WAR 檔案中。為此,您應該在沒有這些受限許可權的開發機器上執行您的應用程式,然後打包部署的檔案。
