使用 Click 框架/控件进行 Java Web 应用程序开发
Click 提供了一套丰富的控件,支持客户端渲染和服务器端处理。本节涵盖以下主题
虽然本节提供了有关控件工作原理的概述,但请参阅 Javadoc,其中提供了大量信息和示例。
在 Click 中,控件提供处理用户输入的服务器端组件,并将它们的显示渲染给用户。控件相当于 Visual Basic 控件或 Delphi 组件。
控件使用 onProcess 方法处理用户输入,并使用 toString() 方法渲染它们的 HTML 显示。下图 1 说明了 Control 被处理和渲染的执行顺序。
图 1. 后续序列图 - 由 Enterprise Architect 创建,由 Sparx Systems 提供
在 Click 中,所有控件类都必须实现 Control 接口。下图 2 说明了 Control 接口。
图 2. Control 接口图 - 由 Enterprise Architect 创建,由 Sparx Systems 提供
Control 接口上的方法包括
- getContext() - 提供对请求上下文的访问。
- getHtmlImports() - 定义控件的 HTML 标头导入。
- getId() - 定义控件的 HTML id 属性。
- setListener() - 设置控件的操作回调侦听器。
- getMessages() - 定义控件的本地化消息映射。
- getName() / setName() - 定义控件在页面模型或表单字段中的名称。
- getParent() / setParent() - 定义控件的父级。
- onDeploy() - 在启动时部署资源。
- onInit() - 初始化事件处理程序。
- onProcess() - 处理请求事件处理程序。
- onDestroy() - 销毁事件处理程序。
Click 控件提供类似于 java.awt.ActionListener 回调的事件回调机制。
要定义控件侦听器,只需设置侦听器对象实例和要调用的侦听器方法的名称。例如
public class SimpleCallback extends Page
{
public SimpleCallback()
{
ActionLink clickLink = new ActionLink("clickLink");
clickLink.setListener(this, "onClick");
addControl(clickLink);
}
public boolean onClick()
{
System.out.println("onClick invoked");
return true;
}
}
侦听器方法可以具有任何名称,但它必须不接受参数并且必须返回布尔值或 java.lang.Boolean 值。
当回调方法返回 true 时,其他 Control 的处理将继续,并且将调用 Pages 的 onGet() 或 onPost() 事件处理程序。如果控件返回 false,则不会执行进一步的 Control 处理,并且不会调用 Page 的 onGet() 或 onPost() 方法。
能够停止进一步的处理并执行其他操作非常方便。例如,您的 Pages onGet() 或 onPost() 方法可能执行昂贵的数据库操作。通过在事件处理程序中返回 false,您可以跳过此步骤并转发到下一页。
核心控件类定义在包 net.sf.click.control 中。此包包含用于基本 HTML 元素的控件。
扩展控件类在 Click Extras 包 net.sf.click.extras.control 中提供。Click Extras 类可能包含对第三方框架的依赖项。
下图 3 说明了这些控件类的一部分。
图 3. 包类图 - 由 Enterprise Architect 创建,由 Sparx Systems 提供
关键控件类包括
- ActionLink - 提供一个锚链接,可以调用回调侦听器。
- Field - 提供抽象表单字段控件。
- Form - 提供用于处理、验证和渲染的表单控件。
- Submit - 提供一个 input 类型为 submit 的控件,可以调用回调侦听器。
- TextField - 提供一个 input 类型为 text 的控件,可以调用回调侦听器。
控件类旨在支持子类化以实现自定义行为。所有控件字段的可见性都为 protected,并且具有公共访问器方法。
您还可以聚合控件以构建更复杂的控件。例如,CreditCardField 使用 Select 控件来渲染不同的信用卡类型。
用于字段验证消息和 HTML 格式化字符串的 Control 字符串在属性文件中外部化。通过使用这些属性文件,您可以将 Click 应用程序本地化为您的特定语言和方言。
消息按特定顺序查找,使您可以为您的控件、各个页面或整个应用程序定制特定消息。本地化消息解析的顺序如下
- 页面范围消息
- 消息查找首先解析为 Page 类的消息包(如果存在)。例如,登录页面可能定义消息属性
- /com/mycorp/page/Login.properties
- 如果您想为特定页面定制消息,这里就是放置它们的地方。
- 全局页面范围消息
- 接下来,消息查找解析为全局页面消息包(如果存在)。
- /click-page.properties
- 如果您希望消息在整个应用程序中使用,这里就是放置它们的地方。
- Control 范围消息
- 接下来,消息查找解析为 Control 类消息包(如果存在)。例如,CustomTextField控件可能定义消息属性
- /com/mycorp/control/CustomTextField.properties
- 全局 Control 范围消息
- 最后,消息查找解析为全局应用程序 Control 消息包(如果消息尚未找到)。全局 Control 属性文件是
- /click-control.properties
要自定义click-control.properties只需将此文件添加到您的类路径并调整特定值即可。
请注意,在自定义消息属性时,您必须包含所有属性,而不仅仅是您要覆盖的属性。
# Click Control messages
field-maxlength-error={0} must be no longer than {1} characers
field-minlength-error={0} must be at least {1} characters
field-required-error=You must enter a value for {0}
file-required-error=You must enter a filename for {0}
label-required-prefix=
label-required-suffix=<span class="required">*</span>
label-not-required-prefix=
label-not-required-suffix=
not-checked-error=You must select {0}
number-maxvalue-error={0} must not be larger than {1}
number-minvalue-error={0} must not be smaller than {1}
select-error=You must select a value for {0}
table-first-label=First
table-first-title=Go to first page
table-previous-label=Prev
table-previous-title=Go to previous page
table-next-label=Next
table-next-title=Go to next page
table-last-label=Last
table-last-title=Go to last page
table-goto-title=Go to page
table-page-banner=<span class="pagebanner">{0} items found, displaying {1} to {2}.</span>
table-page-banner-nolinks=
<span class="pagebanner-nolinks">{0} items found, displaying {1} to {2}.</span>
table-page-links=<span class="pagelinks">[{0}/{1}] {2} [{3}/{4}]</span>
table-page-links-nobanner=<span class="pagelinks-nobanner">[{0}/{1}] {2} [{3}/{4}]</span>
# Message displayed when a error occurs when the application is in "production" mode
production-error-message=<div id='errorReport' class='errorReport'>The application encountered an unexpected error. </div>
Field 类支持资源包的层次结构,用于显示验证错误消息和显示消息。可以通过 Field 方法访问这些本地化消息
- getMessage(String)
- getMessage(String, Object)
- getMessage(String, Object[])
- getMessages()
- setErrorMessage(String)
- setErrorMessage(String, Object)
这些方法使用Locale请求的,以查找字符串资源包,并使用MessageFormat进行任何字符串格式化。