我在实现这样一个功能的时候,出现了一些问题。
功能:在输入框失去焦点的时候,触发一个事件,进行对输入框值的验证,返回验证结果,显示在一个Insert中,局部刷新Insert组件,并将错误信息添加到校验代理对象中(ValidationDelegate)。
详细代码如下:
Home.html:
- <html jwcid="@Shell" title="test">
- <body jwcid="@Body">
- <span jwcid="hasErrors">
- <strong><span jwcid="error">span>strong>
- span>
- <form jwcid="testForm">
- <table border="1" align="center">
- <tr>测试tr>
- <tr>
- <tr>
- <td align="right">电子邮箱:td>
- <td align="left"><span jwcid="email">span>
- <span jwcid="emailInfo@Insert" value="ognl:emailMsg" inherit-informal-parameters="yes" id="emailInfo" renderTag="true">span>
- td>
- tr>
- <input type="submit" value="提交"/> <input type="reset" value="重置"/>
- table>
- form>
- body>
- html>
Home.page
- xml version="1.0" encoding="gb2312"?>
- "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
- "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
- <page-specification>
- <component id="testForm" type="Form">
- <binding name="listener" value="listener:onSubmit"/>
- <binding name="delegate" value="beans.delegate"/>
- component>
- <bean name="delegate" class="org.apache.tapestry.valid.ValidationDelegate"/>
- <component id="hasErrors" type="If">
- <binding name="condition" value="beans.delegate.hasErrors"/>
- component>
- <component id="error" type="Delegator">
- <binding name="delegate" value="beans.delegate.firstError"/>
- component>
- <component id="email" type="TextField">
- <binding name="value" value="email"/>
- <binding name="validators" value="validators:required"/>
- <binding name="displayName" value="literal:电子邮箱"/>
- component>
- page-specification>
Home.java:
- package com.fruit.tapestry.page;
- import org.apache.tapestry.annotations.EventListener;
- import org.apache.tapestry.annotations.InitialValue;
- import org.apache.tapestry.event.PageBeginRenderListener;
- import org.apache.tapestry.event.PageEvent;
- import org.apache.tapestry.form.IFormComponent;
- import org.apache.tapestry.html.BasePage;
- import org.apache.tapestry.services.ResponseBuilder;
- import org.apache.tapestry.valid.ValidationConstraint;
- import org.apache.tapestry.valid.ValidationDelegate;
- public abstract class Home extends BasePage implements PageBeginRenderListener {
- /*
- * 初始化出错信息组件的值为:" ",不初始化的话,无法局部刷新这个组件,不懂为什么...
- */
- @InitialValue("literal: ")
- public abstract String getEmailMsg();
- public abstract void setEmailMsg(String emailMsg);
- public abstract String getEmail();
- public abstract ResponseBuilder getBuilder();
- /**
- * 字段reflush用来判断是局部刷新或者是提交表单,
- * 提交表单时触发pageBeginRender方法,重新给reflush赋值
- */
- private boolean reflush;
- public boolean getReflush(){
- return reflush;
- }
- public void setReflush(boolean reflush){
- this.reflush=reflush;
- }
- public void pageBeginRender(PageEvent event)
- {
- this.setReflush(false);
- }
- /**
- * 判断用户邮箱是否已被占用,输入框失去焦点时触发
- *
- */
- @EventListener(events = "onblur", targets = "email")
- public void checkEmail(){
- this.setReflush(true);
- ValidationDelegate delegate = (ValidationDelegate)this.getBeans().getBean("delegate");
- System.out.println("delegate.isInError="+(delegate.getFirstError()));
- String email=getEmail();
- this.setEmailMsg(" ");
- System.out.println(email);
- if(email==null)
- {
- System.out.println("邮箱为空!");
- delegate.setFormComponent((IFormComponent)getComponent("email"));
- delegate.record("邮箱为空!",ValidationConstraint.CONSISTENCY);
- this.setEmailMsg("邮箱为空!");
- getBuilder().updateComponent("emailInfo");
- return;
- }
- if(email.split("@").length!=2)
- {
- System.out.println("邮箱格式不正确!");
- delegate.setFormComponent((IFormComponent)getComponent("email"));
- delegate.record("邮箱格式不正确!",ValidationConstraint.EMAIL_FORMAT);
- this.setEmailMsg("邮箱格式不正确!");
- getBuilder().updateComponent("emailInfo");
- return;
- }
- getBuilder().updateComponent("emailInfo");
- return;
- }
- public void onSubmit(){
- // if(getReflush())
- // return;
- // ValidationDelegate delegate = (ValidationDelegate)this.getBeans().getBean("delegate");
- // if(delegate.getHasErrors())
- // return;
- System.out.println("**********表单提交成功!**********");
- }
- }
遇到的几个问题:
1、若在page页中的<binding value="validators:required" name="validators"></binding>中加入email验证,即将Home.page中的:
- <binding name="validators" value="validators:required"/>
替换为:
<binding value="validators:required,email" name="validators"></binding>
- <binding name="validators" value="validators:required,email"/>
,则无法触发checkEmail()事件。难道这两者之间存在对立的关系?
2、在输入格式正确,触发checkEmail()事件后,也会触发表单提交事件,即onSubmit()监听方法也会被触发,而且并没有调用校验对象验证任何信息!这样的话,若存在多个需要验证的字段,那么其他字段的验证都会被忽略(实践过)!本来以为是我校验代理配置有问题,于是在workbench的Field页面类中加了一段代码:
- @EventListener(events = "onblur", targets = "inputEmail")
- public void check(){
- System.out.println("sdgasdgs");
- }
结果运行后发现它也是没通过任何验证直接提交表单!
3、在输入格式验证没通过,触发checkEmail()事件显示错误信息后,点击提交按钮,仍然会成功提交表单!相当于delegate.setFormComponent((IFormComponent)getComponent("email"));
delegate.record("邮箱格式不正确!",ValidationConstraint.EMAIL_FORMAT);并没有其到作用!只是在checkEmail()事件触发的时候有取到值,之后就没有取到(估计是保存验证错误信息到delegate的写法有误,望大哥们相助)。
4、checkEmail()代码中倒数第二句:getBuilder().updateComponent("emailInfo");也没起到作用!例如:用户第一次输入有误,在看过错误提示信息后,重新输入正确了!那么,就要清除错误信息了!可是,运行结果却并没有刷新出来,不知道是为什么...
碰到的问题如上,由于理解得不是很到位,一些状况可能并没有描述得很清楚,望各位见谅了!谢谢!