T4.1.2局部刷新、校验代理与表单提交

我在实现这样一个功能的时候,出现了一些问题。

功能:在输入框失去焦点的时候,触发一个事件,进行对输入框值的验证,返回验证结果,显示在一个Insert中,局部刷新Insert组件,并将错误信息添加到校验代理对象中(ValidationDelegate)。

详细代码如下:

Home.html:

xml 代码
  1. <html jwcid="@Shell" title="test">  
  2. <body jwcid="@Body">  
  3.    <span jwcid="hasErrors">  
  4.       <strong><span jwcid="error">span>strong>  
  5.    span>  
  6.    <form jwcid="testForm">  
  7.    <table border="1" align="center">  
  8.       <tr>测试tr>  
  9.       <tr>  
  10.       <tr>  
  11.           <td align="right">电子邮箱:td>  
  12.           <td align="left"><span jwcid="email">span>  
  13.               <span jwcid="emailInfo@Insert" value="ognl:emailMsg" inherit-informal-parameters="yes" id="emailInfo" renderTag="true">span>  
  14.           td>  
  15.       tr>  
  16.       <input type="submit" value="提交"/>    <input type="reset" value="重置"/>  
  17.    table>  
  18.    form>  
  19. body>  
  20. html>  

Home.page

xml 代码
  1. xml version="1.0" encoding="gb2312"?>  
  2.   
  3.   "-//Apache Software Foundation//Tapestry Specification 4.0//EN"    
  4.   "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">  
  5.   
  6. <page-specification>  
  7.        
  8.     <component id="testForm" type="Form">  
  9.         <binding name="listener" value="listener:onSubmit"/>  
  10.         <binding name="delegate" value="beans.delegate"/>  
  11.     component>  
  12.        
  13.     <bean name="delegate" class="org.apache.tapestry.valid.ValidationDelegate"/>  
  14.        
  15.     <component id="hasErrors" type="If">  
  16.         <binding name="condition" value="beans.delegate.hasErrors"/>  
  17.     component>  
  18.        
  19.     <component id="error" type="Delegator">  
  20.         <binding name="delegate" value="beans.delegate.firstError"/>  
  21.     component>  
  22.   
  23.     <component id="email" type="TextField">  
  24.         <binding name="value" value="email"/>  
  25.         <binding name="validators" value="validators:required"/>  
  26.         <binding name="displayName" value="literal:电子邮箱"/>  
  27.     component>  
  28. page-specification>  

Home.java:

java 代码
  1. package com.fruit.tapestry.page;   
  2.   
  3. import org.apache.tapestry.annotations.EventListener;   
  4. import org.apache.tapestry.annotations.InitialValue;   
  5. import org.apache.tapestry.event.PageBeginRenderListener;   
  6. import org.apache.tapestry.event.PageEvent;   
  7. import org.apache.tapestry.form.IFormComponent;   
  8. import org.apache.tapestry.html.BasePage;   
  9. import org.apache.tapestry.services.ResponseBuilder;   
  10. import org.apache.tapestry.valid.ValidationConstraint;   
  11. import org.apache.tapestry.valid.ValidationDelegate;   
  12.   
  13. public abstract class Home extends BasePage implements PageBeginRenderListener {   
  14.        
  15.     /*  
  16.      * 初始化出错信息组件的值为:" ",不初始化的话,无法局部刷新这个组件,不懂为什么...  
  17.      */  
  18.     @InitialValue("literal: ")   
  19.     public abstract String getEmailMsg();   
  20.        
  21.     public abstract void setEmailMsg(String emailMsg);   
  22.        
  23.     public abstract String getEmail();   
  24.        
  25.     public abstract ResponseBuilder getBuilder();   
  26.        
  27.     /**  
  28.      * 字段reflush用来判断是局部刷新或者是提交表单,  
  29.      * 提交表单时触发pageBeginRender方法,重新给reflush赋值  
  30.      */  
  31.     private boolean reflush;   
  32.        
  33.     public boolean getReflush(){   
  34.         return reflush;   
  35.     }   
  36.        
  37.     public void setReflush(boolean reflush){   
  38.         this.reflush=reflush;   
  39.     }   
  40.        
  41.     public void pageBeginRender(PageEvent event)   
  42.     {   
  43.         this.setReflush(false);   
  44.     }   
  45.        
  46.     /**  
  47.      * 判断用户邮箱是否已被占用,输入框失去焦点时触发  
  48.      *  
  49.      */  
  50.     @EventListener(events = "onblur", targets = "email")   
  51.     public void checkEmail(){   
  52.         this.setReflush(true);   
  53.         ValidationDelegate delegate = (ValidationDelegate)this.getBeans().getBean("delegate");   
  54.         System.out.println("delegate.isInError="+(delegate.getFirstError()));   
  55.         String email=getEmail();   
  56.         this.setEmailMsg(" ");   
  57.         System.out.println(email);   
  58.         if(email==null)   
  59.         {   
  60.             System.out.println("邮箱为空!");   
  61.             delegate.setFormComponent((IFormComponent)getComponent("email"));   
  62.             delegate.record("邮箱为空!",ValidationConstraint.CONSISTENCY);   
  63.             this.setEmailMsg("邮箱为空!");   
  64.             getBuilder().updateComponent("emailInfo");   
  65.             return;   
  66.         }   
  67.         if(email.split("@").length!=2)   
  68.         {   
  69.             System.out.println("邮箱格式不正确!");   
  70.             delegate.setFormComponent((IFormComponent)getComponent("email"));   
  71.             delegate.record("邮箱格式不正确!",ValidationConstraint.EMAIL_FORMAT);   
  72.             this.setEmailMsg("邮箱格式不正确!");   
  73.             getBuilder().updateComponent("emailInfo");   
  74.             return;   
  75.         }   
  76.            
  77.         getBuilder().updateComponent("emailInfo");   
  78.         return;   
  79.     }   
  80.        
  81.     public void onSubmit(){   
  82. //      if(getReflush())   
  83. //          return;   
  84. //      ValidationDelegate delegate = (ValidationDelegate)this.getBeans().getBean("delegate");   
  85. //      if(delegate.getHasErrors())   
  86. //          return;   
  87.         System.out.println("**********表单提交成功!**********");   
  88.     }   
  89.   
  90. }   

遇到的几个问题:

1、若在page页中的<binding value="validators:required" name="validators"></binding>中加入email验证,即将Home.page中的:

xml 代码
  1. <binding name="validators" value="validators:required"/>  

替换为:

xml 代码

<binding value="validators:required,email" name="validators"></binding>

  1. <binding name="validators" value="validators:required,email"/>  

,则无法触发checkEmail()事件。难道这两者之间存在对立的关系?

2、在输入格式正确,触发checkEmail()事件后,也会触发表单提交事件,即onSubmit()监听方法也会被触发,而且并没有调用校验对象验证任何信息!这样的话,若存在多个需要验证的字段,那么其他字段的验证都会被忽略(实践过)!本来以为是我校验代理配置有问题,于是在workbench的Field页面类中加了一段代码:

java 代码
  1. @EventListener(events = "onblur", targets = "inputEmail")   
  2.     public void check(){   
  3.      System.out.println("sdgasdgs");   
  4.     }  

结果运行后发现它也是没通过任何验证直接提交表单!

3、在输入格式验证没通过,触发checkEmail()事件显示错误信息后,点击提交按钮,仍然会成功提交表单!相当于delegate.setFormComponent((IFormComponent)getComponent("email"));
   delegate.record("邮箱格式不正确!",ValidationConstraint.EMAIL_FORMAT);并没有其到作用!只是在checkEmail()事件触发的时候有取到值,之后就没有取到(估计是保存验证错误信息到delegate的写法有误,望大哥们相助)。

4、checkEmail()代码中倒数第二句:getBuilder().updateComponent("emailInfo");也没起到作用!例如:用户第一次输入有误,在看过错误提示信息后,重新输入正确了!那么,就要清除错误信息了!可是,运行结果却并没有刷新出来,不知道是为什么...

 

碰到的问题如上,由于理解得不是很到位,一些状况可能并没有描述得很清楚,望各位见谅了!谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值