跳转到内容

使用 Click 框架进行 Java Web 应用程序开发 / 为什么选择 Click

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

本主题讨论了 Click 背后的设计理念和背景,并希望能解释为什么有人会构建另一个 Java Web 应用程序框架。

Click 是一个现代 JEE Web 应用程序框架,提供了一种自然的富客户端风格的编程模型。Click 的主要功能包括

易于学习

[编辑 | 编辑源代码]

Click 被设计成易于学习,以便新开发人员能够在一天内快速上手。对于具有广泛技能水平和动机的商业开发团队来说,这一点非常重要。

我将 Tapestry(2.3)引入开发团队的经验是,它对于普通开发人员来说过于复杂,难以学习。我引入了 Tapestry 的两个开发团队最终放弃了它,并恢复使用 Struts。

Click 也比 Struts 更容易学习。Struts 框架虽然本质上是一个简单的命令模式设计,但它的设计却相当复杂和混乱。

为了支持易于采用,Click 提供了开源框架中最完善的文档,并包含了许多工作示例。

面向组件和页面的设计

[编辑 | 编辑源代码]

如果您使用过 Swing、VB 或 Delphi 等传统 GUI 编程,您就会知道 JEE Web 开发存在严重问题。JEE Web 开发速度缓慢、复杂且容易出错。

第一代 JEE Web 框架之一是 Struts,它提供了一种命令模式设计和一组 JSP 标签库。不幸的是,使用 Struts,您仍然需要处理底层细节,将 URL 映射到操作,并使用原始的 ActionForms。它并没有为您提供太多帮助。

Tapestry 是最早的基于组件的 JEE Web 框架之一,引入了组件层次结构、页面和基于事件的编程模型。这是一种更高效的工作方式,也是我们在开发桌面 GUI 应用程序时所期望的。

Click 的理念是采用这种面向页面和组件的设计方法,并使其更容易使用,更容易理解。

Click 提供了一种面向页面的设计,包含了控件组件和基于事件的编程模型。Click 内置了 40 个控件,对应于主要的 HTML 元素。这是一种更简单的编程方法。

Click 表单和控件提供自动验证和渲染功能,使表单开发非常快速且健壮。

无需 JSP 和 MVC

[编辑 | 编辑源代码]

Click 无需 JSP 和 MVC。这是一件好事!

JSP 与 MVC 模式的错误应用多年来一直阻碍着 JEE Web 开发。我知道这是一个大胆的断言,请让我解释一下。

MVC 是一种桌面 GUI 设计模式,它支持 UI 设计中角色的分离。模型是数据,视图负责渲染,控制器负责修改数据。现在 MVC 是一种相当复杂的 UI 模式,它解决了多个视图和控制器共享相同数据的难题。

然而,对于大多数 UI 开发来说,MVC 过于复杂。控制器和视图通常是同一个东西。例如,选择框就是视图和控制器,它还包含模型。在 Swing 中,幸运的是,大多数 MVC 设计隐藏在表面之下。在 VB 和 Delphi 中,根本没有 MVC。

在 JEE Web 开发的早期阶段,设计模式被高度转换,MVC 被抓取,早期的 Servlet/JSP 设计被贴上了 MVC 的标签。在他们的分析中,模型通常是 DAO,视图是 JSP,控制器是 Servlet。

这种做法的结果是锁定了一种设计理念,其中 UI MVC 角色严格分离。这与将层分离的通用架构原则以及 JSP 实际上只适合渲染输出这一事实相符。

不幸的是,这种严格分离的代价是封装。大多数富客户端 UI 组件封装了它们的渲染和控制功能。Click 组件(控件)负责渲染自身(视图)以及理解其含义(控制)。

为了查看此概念的实际应用,让我们以一个包含 ActionLink 控件的简单 Click 页面为例。

public class ExamplePage extends Page 
{
    public ActionLink myLink = new ActionLink(this, "onClick");

    public boolean onClick() 
    {
        System.out.println("onClick invoked");
        return true;
    }
 }

我们在 HTML 页面模板中包含了我们的myLinkActionLink 控件

<a href="$myLink.href">Click Me</a>

在运行时,控件的 href 属性会渲染为

<a href="/mycorp/example-page.htm?actionLink=myLink">Click Me</a>

如果用户点击链接,ActionLink 控件将调用页面的 onClick() 方法。

相反,使用 JSP MVC 架构,JSP 可以告诉你一些东西,但它不能理解它刚刚说了什么。请思考一下。没有单个 UI 组件负责自己的操作。那么谁来承担这个责任呢?

您需要负责将众多部分连接起来以使其正常工作。在 Struts 中,这可能包括

  • 编写一个自定义的操作
  • 编写一个自定义的ActionForm
  • struts-config.xml文件中指定操作元素
  • form-bean元素在操作元素
  • 表单元素在validation.xml元素
  • 中指定表单字段验证元素在validation.xml元素
  • 确保 XML 元素之间的所有绑定都正确struts-config.xml, form-bean, 表单, 字段
  • 在 JSP 文件中指定标签库包含
  • 在 JSP 文件中正确指定 <htm:form> 和 <html> 字段标签 XML 元素和属性

在大型应用程序的开发中,这将成为一项繁琐、乏味且容易出错的任务。

这些设计中的另一个方面是将逻辑从 Java 代码转移到 XML 配置文件。Tapestry 和 Spring MVC 也大量使用 XML。这样做的问题是编译时错误现在只会在运行时出现。此外,编写和维护大量 XML 比 Java 代码更困难。Java IDE 重构工具比现有的 XML 工具要强大得多。

Click 使您能够应用面向对象的設計原则,例如子类化来扩展其他控件,或聚合来构建更复杂的 UI 组件。例如,Click 控件CreditCardField"" 的子类TextField,并且"包含"Select控件用于指定卡类型。

对于渲染 HTML,Click 使用 Velocity 模板引擎。Velocity 具有简单的指令集,非常容易学习和使用。例如,请查看下面的模板。

#if (!$session.order.lineItems.empty)
<table>
  <tr>
    <th>Name</th> <th>Quantity</th> <th>Total Price</th>
  </tr>
  #foreach ($lineItem in $session.order.lineItems)
  <tr>
    <td>$lineItem.name</td>
    <td>$lineItem.quantity</td>
    <td>$lineItem.totalPrice</td>
  </tr>
  #end
</table>
#else
  No items have been ordered.
#end

您应该对这段代码的功能有一个很好的了解,而无需查阅任何标签库文档。Velocity 的易用性使其成为 Click 的理想选择。

Velocity 中唯一棘手的部分,配置,由 Click 自动处理。

请注意,您也可以在 Click 中使用 JSP 进行渲染。应该说,JSP 2.0 和 JSP 表达式语言在近年来提高了 JSP 的可用性。

进一步阅读

[编辑 | 编辑源代码]

更多教程:http://www.strutsmypassion.com

华夏公益教科书