Tapestry的数据校验功能

news/2024/7/4 15:20:22

Tapestry的数据校验功能 

数据校验是Web应用的一个很重要的功能。
tapestry支持配置式的数据校验,通过使用Delegate、FieldLabel和TextField对数据的显示进行修饰。在page文件中对各输入数据的校验规则进行配置。
可以使用系统提供的Validator。出错信息也提供了多种语言的版本,很方便。
但是问题是:如果表单有多个Submit按钮,不同的按钮需要的校验规则不同,此时该如何做?
众多的web开源框架都存在这样的问题,包括Struts、spring等。
我觉得表单的校验规则应当基于每个提交动作进行配置,而不是基于表单的所有提交动作。
这个现象普遍存在我觉得很奇怪,难道老外做的页面都只有一个提交按钮?
Matt Raible在使用struts中也遇到这个问题,他的解决办法是用javascript给按钮增加onclick代码。这种做法不是太好。

一个想法是取消在page文件中对数据校验的设置,改为在监听方法中调用系统提供的校验器进行校验。然后将错误信息记录于delegate。
如以下代码:
         StringValidator stringValidator = new StringValidator();
         stringValidator.setMinimumLength(6);
         stringValidator.setRequired(true);
         try {
         stringValidator.toObject((IFormComponent) this
         .getComponent("username"), getUsername());
         } catch (ValidatorException ex) {         delegate.record((IFormComponent)this.getComponent("username"),
ex.getLocalizedMessage());
         }

但这么作丧失了配置的便利性。

现在正深入研究如何在tapestry更好地解决这个问题......

目前我的做法如下:
1,page中删除对各个输入域的校验配置,配置form的focus为true以便校验失败时自动聚焦到出错的输入域,注意页面必须使用Body组件;
   
<component id="loginForm" type="Form">
        <binding name="delegate" value="bean:delegate"/>
        <binding name="focus" value="true"/>       
    </component>

2,在各个监听方法中对需要校验的输入域调用系统的validator进行校验;
   
public static boolean required(ValidationDelegate delegate,
            IFormComponent component, String value) {
        boolean success = true;
        StringValidator validator = new StringValidator();
        validator.setRequired(true);
        try {
            validator.toObject(component, value);
        } catch (ValidatorException ex) {
            success = false;
            delegate.record(component, ex.getLocalizedMessage());
            delegate.registerForFocus(component, 0);
        }
        return success;
    }
    以上是对“必须”校验的简单封装,其中加粗一行是为了form聚焦用。
    其它校验都可以分别进行类似的封装。
    监听方法中可以这么调用各校验方法后,然后检查delegate是否有校验错误而进行不同的处理。通常的处理是如果有错误,则返回当前页面,否则进行相应的业务逻辑。
3,校验错误信息的显示
提供了一个ShowError组件:
protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) {
        if (cycle.isRewinding()) {
            return;
        }
        IValidationDelegate delegate = getDelegate();
        if (delegate == null || !delegate.getHasErrors()) {
            return;
        } else {
            List fieldTrackings = delegate.getFieldTracking();
            for (int i = 0; fieldTrackings != null && i < fieldTrackings.size(); i++) {
                IFieldTracking fieldTracking = (IFieldTracking) fieldTrackings
                        .get(i);
                if (fieldTracking.isInError()) {
                    writer.begin("label");
                    writer.attribute("for", fieldTracking.getFieldName());
                    writer.begin("span");
                    writer
                            .attribute("style",
                                    "font-weight: normal; text-align: left; color: rgb(255, 0, 0); cursor: pointer;");
                    writer.print(fieldTracking.getErrorRenderer().toString());
                    writer.end();
                    writer.end();
                    writer.printRaw("<br>");
                }
            }
            return;
        }
    }

实现的功能就是鼠标移动到每条错误信息上显示手形,点击鼠标自动聚焦到相关输入域上。

4,校验失败的输入域的样式修改
参考betterpetshop
    public void writeAttributes(IMarkupWriter writer, IRequestCycle cycle,
            IFormComponent component, IValidator validator) {
        if (isInError(component)) {
            writer.attribute("style",
                    "color: White; background-color: #EC6233;");
        }
    }

    public void writeSuffix(IMarkupWriter writer, IRequestCycle cycle,
            IFormComponent component, IValidator validator) {
        if (isInError(component)) {
            writer.print(" ");
            writer.beginEmpty("img");
            writer.attribute("src", "./imgs/bzzt_wrong.gif");
            writer.attribute("height", 16);
            writer.attribute("width", 16);
        }
    }

    public void writeLabelPrefix(IFormComponent component,
            IMarkupWriter writer, IRequestCycle cycle) {
        if (isInError(component)) {
            writer.begin("span");
            writer.attribute("style", "color: #EC6233;");
        }
    }

    public void writeLabelSuffix(IFormComponent component,
            IMarkupWriter writer, IRequestCycle cycle) {
        if (isInError(component))
            writer.end();
    }

这么一来,关于校验处理和错误信息显示基本上搞定了。


http://www.niftyadmin.cn/n/1995596.html

相关文章

HashMap源码解析(jdk1.7)

HashMap源码解析初始化信息添加元素删除元素查找元素containsKey&#xff1a;指定的key是否在HashMap中containsValue&#xff1a;查找HashMap中是否有指定的valueisEmptyindexFor&#xff1a;返回h在table数组中的位置写在后面初始化信息 //HashMap的初始容量&#xff0c;必须…

ZwQueryInformationFile 函数

ZwQueryInformationFile 函数The ZwQueryInformationFile routine returns various kinds of information about a given file object. NTSTATUS ZwQueryInformationFile( IN HANDLE FileHandle, OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PVOID FileInformatio…

Tapestry在静态页面和动态内容分工方面的研究

Tapestry在静态页面和动态内容分工方面的研究 Tapestry的一个最耀眼的功能是其绝好的模板设计思想&#xff0c;它能够将动态内容以极少的侵入性而展现到HTML页面上&#xff0c;我对其这一功能非常赞赏&#xff0c;如果 Tapestry能够像Spring那样把这一部分HTML模板解析功能独立…

java树形菜单制作

java树形菜单制作用到的技术代码实现用到的技术 SpringMVCSpringmybatiseasyui 代码实现 dto&#xff08;适用于easyui的实体类&#xff09; package com.grand.orgn.dto;import java.util.HashMap; import java.util.Map;/*** * author * 适用于easyUI树形结构的实体类* d…

文件-进程关联演示程序(出自CVC)

文件-进程关联演示程序(出自CVC)1、首先使用ZwQuerySystemInformation查询所有进程句柄&#xff0c;2、获取句柄所代表对象信息&#xff0c;查出目标文件。核心态程序相对简单&#xff0c;对于用户态程序&#xff0c;使用ZwQueryInformationFile同时与GetFileInformationByHand…

Tapestry中配置文件page的简化处理

Tapestry中配置文件page的简化处理 Tapestry每个页面基本上都需要一个.page的配置文件&#xff0c;因为需要对模板HTML的动态内容部分进行配置&#xff0c;这是为静态页面和动态内容更好的分工&#xff0c;确实需要这么做。但是&#xff0c;每个page文件的典型配置如下&#x…

关于由HANDLE获取文件名的问题

问题&#xff1a;关于由HANDLE获取文件名的问题 PFILE_NAME_INFORMATION pfni; pfni(PFILE_NAME_INFORMATION)ExAllocatePool(PagedPool, sizeof(FILE_NAME_INFORMATION) 255 * sizeof(WCHAR) ); memset(pfni,0,sizeof(FILE_NAME_INFORMATION) …

AngularJS controller调用factory

1、定义 factory.js 文件 var appFactorys angular.module(starter.factorys, []) appFactorys.factory(HouseFactory, function () {var houseList [{ id: 0, title: 急售北二环 小区配套齐全 精装修, price: 88.0, describe: 2室1厅 120平米, img: img/ben.png },{ id: 1, …