跳转到内容

使用 Click 框架/控件进行 Java Web 应用程序开发

来自维基教科书,开放的书籍,开放的世界

Click 提供了一套丰富的控件,支持客户端渲染和服务器端处理。本节涵盖以下主题

虽然本节提供了有关控件工作原理的概述,但请参阅 Javadoc,其中提供了大量信息和示例。

Control 接口

[编辑 | 编辑源代码]

在 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() - 销毁事件处理程序。

Control 回调

[编辑 | 编辑源代码]

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,您可以跳过此步骤并转发到下一页。

Control 类

[编辑 | 编辑源代码]

核心控件类定义在包 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

Control 属性

[编辑 | 编辑源代码]

要自定义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=&nbsp;
 
 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进行任何字符串格式化。

华夏公益教科书