首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Wicket 开发笔记(2)针对个别按钮对页面部分表单的 validation

Wicket 开发笔记(2)针对个别按钮对页面部分表单的 validation

针对个别按钮对页面部分表单的 validation默认情况下,页面中的 Button 如果设置 validation,会对页面所有表单进行。如果页面中用两个 Button,而一个按钮需要全表单进行                validation,而另一个 Button只需要对表单中的部分 input进行 validation。Button的                setDefaultFormProcessing这个方法虽然可以取消表单的                validation,但是它是会阻止表单数据的提交,所以不是一个好办法。Wicket 一个比较奇妙的地方就是 Form中嵌套 Form,这个似乎在                HTML中是不允许的,但只在 Wicket让这个成为可能,当然最终的 HTML 的实现,Wicket只是把内层的 Form用                DIV来实现,也是个很不错的想法。如清单 5 所示。
清单 5. Html 中嵌套 Form 的定义代码及 Java 实现代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<form  wicket:id="outerform">
<input type="text"wicket:id="location">
<input type="text"wicket:id="license">
<form  wicket:id="innerForm">
<input class="btn"type="submit"wicket:id="AddHost" value="AddHost">
<select wicket:id="type">
</form>
<input class="btn"type="submit" wicket:id="ok" value=" O K "/>
</form>

InputForm form = newInputForm("outerform");

private class InputForm extendsForm<?>
{
add(newTextField<String>("license").setRequired(true));
add(newTextField<String>("location").setRequired(true));

Form<?> innerForm = newForm<?>("innerForm");
innerForm .add(newDropDownChoice<SymphonyPageModel>("type", hostTypeModelList));
innerForm.add(newButton("AddHost")
            {
public void onSubmit()
                {
// 您会发现现在即使 innnerForm 外面的 input 输入错误
// 也能进来了,在这里您可以做您自己的逻辑了。
                }
            });
}




如何在 Wicket 中使用 AjaxWeb 开发中 Ajax 的使用非常普遍,Wicket 对 Ajax 的支持也做的非常的好,只需要编写                Jave代码就可以实现,html里面不需要任何代码的添加。如下面的这个例子,通过输入的 Host Name 获取对应 Host 的 IP,效果如图                3,代码如清单 6 所示。
清单 6. Ajax 的实现代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
finalTextField<String> hostNameEle = newTextField<String>("name");
finalTextField<String> hostIpEle = newTextField<String>("HostIp");
hostIpEle.setOutputMarkupId(true);// 这句很重要否则会报错。

// 这个就可以对一个控件添加一个 Ajax 事件。
hostNameEle.add(newOnChangeAjaxBehavior() {

@Override
protected void onUpdate(AjaxRequestTarget target)
    {
        String hostIp = getAddressByHostName(hostNameEle.getValue());
        hostIpEle.setModelObject(hostIp);
// 这里设置要对结果进行赋值的控件
        target.add(hostIpEle);
    }
               
});




图3. Ajax根据输入的host name取得对应的IP如何修改 DefaultDataTable 里面的某个列的数据像下面的这个 List 我们往往从数据库里检索出来的某些字段是一些代码,而在页面上显示则要显示成代码对应的 message,例如图 4 的                status 字段,数据库中存放的都是 Status(UP, DOWN,UNKONW) 对应的数字代码,那这个时候我们应该怎么实现呢?
图 4.我们以 DefaultDataTable 为例,只需在添加 Column 时候,重载它的 populateItem 函数,具体例子,如清单 7                所示。
清单 7. DefaultDataTable 的实现代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
List<IColumn<ProductBean>> columns = newArrayList<IColumn<ProductBean>>();
columns.add(newPropertyColumn<ProductBean>(newModel<String>("ClusterName"), "name"));
columns.add(newPropertyColumn<ProductBean>(newModel<String>("Hosts"), "hosts"));
columns.add(newPropertyColumn<ProductBean>(newModel<String>("status"), "status"){

@Override
public void populateItem(Item<ICellPopulator<ProductBean>> item,
             String componentId, IModel<ProductBean> rowModel)
     {
// 我们就可以在这里改变它的值
item.add(newLabel(componentId, statusInfoMap.get(rowModel.getObject().getStatus())));
     }
});
         
columns.add(newPropertyColumn<ProductBean>(
newModel<String>("shareBinary"), "sharebinary"));
columns.add(newPropertyColumn<ProductBean>(newModel<String>("product"), "product"));

form.add(newDefaultDataTable<ProductBean>
("clusterList", columns, newSortableClusterDataProvide(products), 20));

返回列表