如何使用来自数据库的值验证Tapestry的表单字段?

时间:2014-02-27 09:01:21

标签: java javascript validation field tapestry

我有一个关于字段验证的问题,数据库中存在值。

我一直在关注http://jumpstart.doublenegative.com.au/jumpstart/examples/input/contributingvalidators作为指导,对于大部分内容来说都非常简单。但是,我已经碰上了某种墙。

我正在尝试制作自己的验证器:

public class UniqueValueProperty extends AbstractValidator<String, String> {
    // my validation stuff here
}

这就是我试图贡献它的方式:

public void contributeFieldValidatorSource(MappedConfiguration<String, Validator> configuration) {
    configuration.add(UniqueValueProperty.VALIDATION_NAME, new UniqueValueProperty());
}

所以,总结一下:

  • 我知道我需要提供一个用于客户端验证的JavaScript代码,但我不确定如何实际访问DAO并进行检查?

编辑:

Validator有一个你覆盖的方法,它执行以下操作:

  

组件使用的钩子允许验证器贡献   其他属性或(更常见的)客户端JavaScript

@Override
public void render(Field field, String constraintValue,
    MessageFormatter formatter, MarkupWriter writer, FormSupport formSupport) {

    formSupport.addValidation(field, VALIDATION_NAME, buildMessage(formatter, field, constraintValue), null);

如果我理解正确,我可以为客户端验证添加一些javascript代码,对吧?那么,我想在那个部分做什么(dunno,如果可能)是使用DAO实际检查我的数据库中的一些东西,或者甚至将更多(动态)参数传递给验证器,例如值列表它不应该触发验证失败。

谢谢:D

编辑: 兰斯,你建议我能做到这一点:

Tapestry.Validator.uniqueValueProperty = function(field, message, constraint) {

    field.addValidator(function(value) {
        if ((value != null) && (value.trim().length > 0)) {
            if (dao.valueExistsInColumn(value, constraint)) {
                throw message;
            }
        }
    });

};

其中dao变量是在我的验证程序对象中注入的,是通过addInstance方法提供的吗?

1 个答案:

答案 0 :(得分:1)

使用configuration.addInstance(name, class)代替configuration.add(name, instance)。然后tapestry将实例化您的验证器并注入任何依赖项(例如DAO)。

修改

例如:

public class MyValidator extends AbstractValidator {
    @Inject private Dao dao;

    public void render(Field field, String constraintValue, MessageFormatter formatter, MarkupWriter writer, FormSupport formSupport) {
        // this is the serverside representation of the field which will be rendered to HTML
        Element fieldElement = writer.getElement();
        List<String> values= dao.getSomeList(constraintValue);
        String valuesAsString = values.toString();

        // add an attribute to the DOM, this can be referenced in javascript later
        fieldElement.attribute("data-values", valuesAsString);
        formSupport.addValidation(...);
    }
}

该字段现在将在HTML / DOM中有一个“数据列表”,您的javascript验证器现在可以访问该列表。如果使用jquery,则has built in support表示“data-”属性。例如:

var valuesAsString = $(#someField").data("values");

或者

var valuesAsString = $(#someField").attr("data-values");