页面校验

前台校验:
采用Tapestry提供的核心验证,页面调用的方法:
方法一,采用读取locale配置文件的方式

<input jwcid="userName@TextField" value="ognl:userName" validators="validators:required" displayName="用户名" size="30"/>
方法二,采用自定义的消息的方式:
<input jwcid="userName@TextField" value="ognl:userName" validators="validators:required[[{0}]不能为空!]" displayName="用户名" size="30"/>,其中,{0}取该组件的displayName的直。
方法三,采用自定义验证的方式:
配置:

在应用程序配置文件中配置国际化配置:
<meta key="org.apache.tapestry.accepted-locales" value="en,zh_CN"/>
上面这个配置会首选英文,所以,如果要系统首选中文,那么需要这样配置:
<meta key="org.apache.tapestry.accepted-locales" value="zh_CN"/>,这样     的话所有的客户端校验信息就会是中文的了。
更改默认的校验信息:

如果对默认的校验信息不满意,那么可以更改Tapestry jar包中的org/apache/tapestry/valid/ValidationStrings_zh_CN.properties文件中的内容即可。

后台校验:
tapestry是用Delegator组件进行后台校验的,使用的校验类是org.apache.tapestry.valid.ValidationDelegate类,实现后台校验需要做的就是在.page规范文件中声明一个Delegator组件,然后和ValidationDelegate对象进行绑定,如果发生校验错误,将发生错误的组件,输入的值和错误的信息以及类型存放到ValidationDelegate对象中,然后返回到发生校验错误的页面即可。

.page规范文件:
<page-specification class="com.bjais.Home">
  <bean name="delegate" class="org.apache.tapestry.valid.ValidationDelegate"/>
   <component id="form" type="Form">
    <binding name="listener" value="listener:onSubmit"/>
  </component>
  <component id="weight" type="TextField">
    <binding name="value" value="weight"/>
    <binding name="translator" value="translator:number,pattern=#.#"/>
  </component>
  <component id="errors" type="Delegator">
    <binding name="delegate" value="beans.delegate.firstError"/>
  </component>
</page-specification>

.java文件:
public abstract class Home extends BasePage
{
   public abstract int getWeight();
   public IPage onSubmit()
   {
      ValidationDelegate delegate=(ValidationDelegate)getBeans().getBean("delegate");
      int weight=getWeight();
      if(weight<0)
      {
          delegate.setFormComponent(getComponent("weight"));
          delegate.recordFieldInputValue(Integer.toString(weight));
          delegate.record("Weight 必须大于0",ValidationConstraint.TOO_SMALL);
      }
      if(delegate.getHasError())
      {
          return null;
      }

   }
}

.html文件:
<html>
  <span jwcid="errors"/>
  <form jwcid="form">
      <table>
         <tr>
               <td>Weight:</td>
               <td><input type="text" jwcid="weight"/></td>
         </tr>
         <tr>
               <td colspan="2"><input type="submit" value="OK"/></td>
         </tr>
      </table>
  </form>
</html>

但是上面的做法比较繁琐,可以采用validator使验证变的简单些,做法如下:
.page规范文件
<page-specification class="com.bjais.Home">
  <bean name="delegate" class="org.apache.tapestry.valid.ValidationDelegate"/>
  <component id="form" type="Form">
    <binding name="listener" value="listener:onSubmit"/>
    <binding name="delegate" value="beans.delegate"/>
  </component>
  <component id="weight" type="TextField">
    <binding name="value" value="weight"/>
    <binding name="translator" value="translator:number,pattern=#.#"/>

    <binding name="validators" value="validators:min=0"/>
    <binding name="displayName" value="literal:Weight"/>
  </component>
  <component id="errors" type="Delegator">
    <binding name="delegate" value="beans.delegate.firstError"/>
  </component>
</page-specification>

而在.java文件中不用再错数据校验判断了。

在上面的例子中,weight为int,所以需要进行转换,如果用户输入的不是一个数字,那么就会转换失败,这时转换器就会像验证器一样工作,将错误信息记录在验证代理中。

空校验的方法:
  <component id="weight" type="TextField">
    <binding name="value" value="weight"/>
    <binding name="translator" value="translator:number,pattern=#.#"/>

    <binding name="validators" value="validators:required,min=0"/>
    <binding name="displayName" value="literal:Weight"/>
  </component>

也可以加上自定义的校验失败的信息:
<component id="weight" type="TextField">
    <binding name="value" value="weight"/>
    <binding name="translator" value="translator:number,pattern=#.#"/>

    <binding name="validators" value="validators:required[you must enter {0}!],min=0"/>
    <binding name="displayName" value="literal:Weight"/>
  </component>

还可以和FieldLabel组件一起工作:
<component id="weight" type="TextField">
    <binding name="value" value="weight"/>
    <binding name="translator" value="translator:number,pattern=#.#"/>

    <binding name="validators" value="validators:required[you must enter {0}!],min=0"/>
    <binding name="displayName" value="literal:Weight"/>
  </component>
<component id="weightLabel" type="FieldLabel">
    <binding name="field" value="component:weight"/>
</component>
这样,但验证失败的时候和验证失败的组件关联的fieldLabel也一起发生样式更改,例如颜色变为红色。

validators里面的内容前缀首先是validators:,Validator之间用逗号分隔,每个Validator的格式可以是下面形式

   1. name
   2. name=value
   3. name[message]
   4. name[%message-key]
   5. name=value[message]
   6. name=value[%message-key]
   7. $name

其中name为Validator名,如:email, required, max, maxDate, min等等。

value为传入的参数值,如:min=3, max=5等。

message为当该Validator校验失败后显示的Message。

message -key为本地化文件中Message的Key值, 如Tapestry Page Name为Login的话,那么相应的有Login.html,Login.page,Login.properties,Login_zh_CN.properties等,这里面的两个properties文件就是本地化文件。

下面是具体的例子

ValidationExamples.html中

<input type="text" jwcid="minAndMaxWithMessage@TextField"
       value="ognl:minAndMaxWithMessage"
       translator="translator:number,pattern=#####"
       displayName="literal:Min,Max"
       validators="validators:min=3[%must-larger-than-3],max=5[Must less than 5]"/></td>

那么在ValidationExamples.properties中为

must-larger-than-3=Field {0} must larger than 3.

需要注意的是,其中的{0}参数会被自动用Field名替换。

$name中的name是对一个bean的引用,该bean可以在Page Specification中定义。

如在ValidationExamples.page中定义为

    <bean name="zipValidator" class="org.apache.tapestry.form.validator.Pattern">
        <set name="pattern" value="message:zip-code-pattern"/>
        <set name="message" value="message:zip-code-message"/>
    </bean>

那么在ValidationExamples.html中就可以像下面这样引用。

<input type="text" jwcid="pattern@TextField"
       value="ognl:pattern"
       displayName="literal:Pattern"
       validators="validators:$zipValidator"/>

前台校验的样式

Tapestry4.1使用的是dojo的校验,所以需要加上样式,否则会很难看,需要实现的样式类如下: .alertButton {
width: auto;
border: none;
background-color: #699ED9;
color: #fff;
padding: 0.1em;
border-bottom: 1px solid #5885b6 !important;
border-right: 1px solid #5885b6 !important;
border-top: 1px solid #92b8e2 !important;
border-left: 1px solid #92b8e2 !important;
cursor: hand;
cursor: pointer;
}

.alertDialog {
width: 30em;
border: 2px solid #ff660a;
padding: 1em;
background: #ffffff;
-moz-border-radius: 10px;
}

.alertContent .alertButton {
float: right;
position: relative;
bottom: 1em;
}

.missingList, .invalidList {
padding-bottom: 0.6em;
padding-top: 0.2em;
padding-left: 0.1em;
padding-right: 0.2em;
margin: 0;
}

.missingList {
border-top: 4px solid #bedef4;
}

.invalidList {
border-top: 4px solid #ffaf7e;
}

.missingList li, .invalidList li {
list-style: none;
font-style: italic;
}

.fieldMissing {
background: #bedef4;
}

.fieldInvalid {
background: #ffaf7e;
font-weight: bold;
}

你可能感兴趣的:(apache,html,bean,tapestry,dojo)