Contents

Wicket框架简介

1. 概述

Wicket 是一个 Java 服务器端面向 Web 组件的框架,旨在通过引入桌面 UI 开发中已知的模式来简化构建 Web 界面。

使用 Wicket,可以仅使用 Java 代码和 XHTML 兼容的 HTML 页面构建 Web 应用程序。不需要 Javascript,也不需要 XML 配置文件。

它在请求-响应周期上提供了一个层,防止在低级别工作并允许开发人员专注于业务逻辑。

在本文中,我们将通过构建HelloWorld Wicket 应用程序来介绍基础知识,然后是使用两个相互通信的内置组件的完整示例。

2. 设置

要运行 Wicket 项目,让我们添加以下依赖项:

<dependency>
    <groupId>org.apache.wicket</groupId>
    <artifactId>wicket-core</artifactId>
    <version>7.4.0</version>
</dependency>

您可能想在Maven 中央存储库 中查看最新版本的 Wicket,在您阅读时可能与此处使用的版本不一致。

现在我们准备构建我们的第一个 Wicket 应用程序。

3. HelloWorld入口

让我们从继承 Wicket 的WebApplication类开始,它至少需要覆盖*Class<? extends Page> getHomePage()*方法。

Wicket 将使用此类作为应用程序的主要入口点。在方法内部,只需返回一个名为HelloWorld的类的class对象:

public class HelloWorldApplication extends WebApplication {
    @Override
    public Class<? extends Page> getHomePage() {
        return HelloWorld.class;
    }
}

Wicket 更倾向于约定而不是配置。向应用程序添加新网页需要在同一目录下创建两个文件:一个 Java 文件和一个具有相同名称(但扩展名不同)的 HTML 文件。仅当您想更改默认行为时才需要额外的配置。

在源代码的包目录中,首先添加HelloWorld.java

public class HelloWorld extends WebPage {
    public HelloWorld() {
        add(new Label("hello", "Hello World!"));
    }
}

然后HelloWorld.html

<html>
    <body>
        <span wicket:id="hello"></span>
    </body>
</html>

最后一步,在web.xml 中添加过滤器定义:

<filter>
    <filter-name>wicket.examples</filter-name>
    <filter-class>
      org.apache.wicket.protocol.http.WicketFilter
    </filter-class>
    <init-param>
        <param-name>applicationClassName</param-name>
        <param-value>
          com.blogdemo.wicket.examples.HelloWorldApplication
        </param-value>
    </init-param>
</filter>

而已。我们刚刚编写了我们的第一个 Wicket Web 应用程序。

通过构建一个war文件(命令行中的mvn package)来运行该项目,并将其部署在一个 servlet 容器上,例如 Jetty 或 Tomcat。

让我们在浏览器中访问http://localhost:8080/HelloWorld/ 。带有消息*Hello World!*的空白页面 将出现。

4. 检票口组件

Wicket 中的组件是由 Java 类、HTML 标记和模型组成的三元组。模型是组件用来访问数据的外观。

这种结构提供了很好的关注点分离,并通过将组件与以数据为中心的操作分离,增加了代码重用。

下面的示例演示了如何将 Ajax 行为添加到组件中。它由一个包含两个元素的页面组成:一个下拉菜单和一个标签。当下拉选择更改时,标签(并且只有标签)将被更新。

HTML 文件CafeSelector.html的主体将是最小的,只有两个元素,一个下拉菜单和一个标签:

<select wicket:id="cafes"></select>
<p>
    Address: <span wicket:id="address">address</span>
</p>

在 Java 端,让我们创建标签:

Label addressLabel = new Label("address", 
  new PropertyModel<String>(this.address, "address"));
addressLabel.setOutputMarkupId(true);

Label构造函数中的第一个参数与 HTML 文件中分配的wicket:id 匹配。第二个参数是组件的模型,它是组件中显示的底层数据的包装器。

setOutputMarkupId方法使组件有资格通过 Ajax 进行修改。现在让我们创建下拉列表并向其中添加 Ajax 行为:

DropDownChoice<String> cafeDropdown 
  = new DropDownChoice<>(
    "cafes", 
    new PropertyModel<String>(this, "selectedCafe"), 
    cafeNames);
cafeDropdown.add(new AjaxFormComponentUpdatingBehavior("onchange") {
    @Override
    protected void onUpdate(AjaxRequestTarget target) {
        String name = (String) cafeDropdown.getDefaultModel().getObject();
        address.setAddress(cafeNamesAndAddresses.get(name).getAddress());
        target.add(addressLabel);
    }
});

创建类似于标签,构造函数接受检票口 ID、模型和咖啡馆名称列表。

然后AjaxFormComponentUpdatingBehavior添加了onUpdate回调方法,一旦发出 ajax 请求就会更新标签的模型。最后,将标签组件设置为刷新的目标。

最后,将标签组件设置为刷新的目标。

如您所见,一切都是 Java,不需要任何一行 Javascript。为了改变标签显示的内容,我们简单地修改了一个 POJO。修改 Java 对象转换为网页更改的机制发生在幕后,与开发人员无关。

Wicket 提供了大量开箱即用的支持 AJAX 的组件。带有实时示例的组件目录可在此处 获得。