跳轉到內容

使用 Click 框架進行 Java Web 應用程式開發/配置

來自 Wikibooks,開放世界中的開放書籍

本節討論如何設定配置 Click Web 應用程式,涵蓋以下主題

Click 配置檔案包括

Click application configuration files
  • WEB-INF/click.xml - 應用程式配置(必需
  • WEB-INF/velocity.properties - Velocity 屬性(可選)
  • WEB-INF/web.xml - Servlet 配置(必需

Servlet 配置

[編輯 | 編輯原始碼]

為了使 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.

Servlet 對映

[編輯 | 編輯原始碼]

按照慣例,所有 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 應用程式

[編輯 | 編輯原始碼]

click-app 元素定義兩個應用程式本地化屬性 charsetlocale

<!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 頁面模板和宏檔案將載入一次並快取。啟用快取後,將設定以下 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 日誌記錄

[編輯 | 編輯原始碼]

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 屬性

[編輯 | 編輯原始碼]

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 檔案中。為此,您應該在沒有這些受限許可權的開發機器上執行您的應用程式,然後打包部署的檔案。

華夏公益教科書