Tapestry中Sumbit/ImageSubmit的属性selected和tag

本文介绍如何在Tapestry框架中定制Submit组件,通过修改AbstractSubmit类以记录用户点击的具体Submit按钮名称,并调整Form组件确保数据校验正确执行。

Tapestry中Sumbit/ImageSubmit的属性selected和tag

个人认为Submit/ImageSubmit标准组件的两个属性selected和tag的设置比较罗嗦,可能是性能和灵活性的一种权衡吧。
其中,selected指定页面类的一个属性,tag设置该页面属性的值。selected和tag组合起来可以使页面类知道用户点击了哪个提交按钮。 Tapestry已经将多个提交按钮绑定于不同的监听方法上,似乎在很多web应用中并不需要知道用户点击了哪个提交按钮。
我现在正在做的项目却需要根据不同的提交按钮而进行不同的数据校验
此时,我的实现方法是
1,SubBasePage中提供一个属性submitName用于保存用户点击的提交按钮的名字。
2,修改AbstractSubmit的handleClick方法:
if (cycle.getPage() instanceof SubBasePage) {
            SubBasePagep = (SubBasePage) cycle.getPage();
            if (cycle.getParameter(this.getId()) != null
                    && !"".equals(cycle.getParameter(this.getId()))
                    || cycle.getParameter(this.getId() + ".x") != null
                    && !"".equals(cycle.getParameter(this.getId() + ".x")))
                p.setSubmitName(this.getId());//设置提交按钮名字
        }
并修改Submit和ImageSubmit的父类为修改后的AbstractSubmit。
这样一来,在页面类中就可以根据用户点击的提交按钮的不同而进行不同的业务处理了。

3,但是,在展现页面时,Tapestry根据各组件在页面上的显示顺序进行生成,如果提交按钮是在页面的后部,则前部的输入组件的校验如果是基于该提交组件的话,SubBasePage的submitName没有及时更新,则数据校验会出现问题。所以,需要修改Form组件。覆盖父类的 renderBody方法。
public void renderBody(IMarkupWriter writer, IRequestCycle cycle) {       
        for (int i = 0; i < this.getBodyCount(); i++) {
            if (this.getBody()[i] instanceof AbstractSubmit) {
                ((AbstractSubmit) this.getBody()[i]).updateSubmitName(cycle);//抽象提交类更新submitName
            }
        }
        super.renderBody(writer, cycle);
    }

AbstractSubmit:
public void updateSubmitName(IRequestCycle cycle) {
        if (cycle.getPage() instanceof XtradeBasePage) {
            XtradeBasePage p = (XtradeBasePage) cycle.getPage();
            if (cycle.getParameter(this.getId()) != null
                    && !"".equals(cycle.getParameter(this.getId()))
                    || cycle.getParameter(this.getId() + ".x") != null
                    && !"".equals(cycle.getParameter(this.getId() + ".x")))
                p.setSubmitName(this.getId());
        }
    }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值