天道不一定酬所有勤
但是,天道只酬勤

Webx表单验证

拿典型的petstore举例子,首先看一下WEB-INF的目录结构:

WEB-INFO
    ├── common
    │   ├── pipeline-exception.xml
    │   ├── pipeline.xml
    │   ├── resources.xml
    │   ├── template-data.xml
    │   ├── uris.xml
    │   ├── webx-component-and-root.xml
    │   └── webx-component.xml
    ├── home
    │   └── form.xml
    ├── store
    │   └── form.xml
    ├── user
    │   └── form.xml
    ├── webx-home.xml
    ├── web.xml
    ├── webx-store.xml
    ├── webx-user.xml
    └── webx.xml

一、注册服务

1. webx.xml

webx.xml中,关于服务的配置如下:

<!-- 将beans暴露给模板。这里定义的tools可被所有components之间共享。 -->
    <services:pull>
        <pull-factories:utils />
        <pull-factories:page-tool />
        <pull-factories:control-tool />
        <pull-factories:uris-tool />
    </services:pull>

可以看出,这里并没有关于表单的配置,但是webx.xml中有:

<!-- 共享配置。 -->
    <beans:import resource="common/webx-component.xml" />

这个表示引入common/webx-component.xml中的配置,那我们接着看。

2.webx-component.xml

 <services:pull>
        <!-- Webx3 tools。 -->
        <pull-factories:utils />
        <pull-factories:rundata-tool />
        <pull-factories:csrfToken />
        <pull-factories:form-tool />
        <pull-factories:control-tool />
        <pull-factories:uris-tool />
</service:pull>

这里的<pull-factories:form-tool />是重点。

总结,要注册form-tool服务。该服务要配置在webx.xml文件中,或者其他文件中,但是要使用import引进来。

二、应用和定义form.xml

1.webx-user.xml

  <!-- 表单验证。 -->
    <beans:import resource="user/form.xml" />

webx-user.xml文件中引入form.xml文件。 这里的form.xml文件位与user目录下面。具体的目录结构可以看文章开头。

2. form.xml

<services:form postOnlyByDefault="true">
        <!--
          - ===============================================
          - 用来检查csrf token。
          - ===============================================
         -->
        <group name="csrfTokenCheckGroup">
            <field name="csrfToken">
                <fm-validators:csrf-validator>
                    <message>提交的数据已过期</message>
                </fm-validators:csrf-validator>
            </field>
        </group>
 <!--
          - ===============================================
          - 注册表单
          - ===============================================
         -->
        <group name="register" extends="csrfTokenCheckGroup">
            <field name="userId" displayName="登录名">
            <fm-validators:required-validator>
                <message>必须填写 ${displayName}</message>
            </fm-validators:required-validator>
            <fm-validators:regexp-validator pattern="^[A-Za-z_][A-Za-z_0-9]*$">
                <message>${displayName} 必须由字母、数字、下划线构成</message>
            </fm-validators:regexp-validator>
            <fm-validators:string-length-validator minLength="4" maxLength="10">
                <message>${displayName} 最少必须由${minLength}个字组成,最多不能超过${maxLength}个字</message>
            </fm-validators:string-length-validator>
        </field>

        </group>
</services:form>

这里定义一个group,名字为register。其中规定了registerError的验证逻辑。

总结,需要有一个form.xml文件,并且在文件中写好针对某一个group里面的个各个属性的验证逻辑。

三、VM页面 看一下,user文件夹的目录情况

user
├── css
│   └── petstore-user.css
└── templates
    ├── control
    │   └── login.vm
    ├── layout
    │   └── default.vm
    └── screen
        └── register.vm

这里的user对应于webx-user.xml的这个user,因为webx-user.xml定义了装载该模块

<!-- 装载模块。 -->
    <services:module-loader>
        <ml-factories:class-modules>
            <search-packages type="$1" packages="com.alibaba.sample.petstore.web.user.module.*" />
        </ml-factories:class-modules>
    </services:module-loader>

1. register.vm

#macro (registerMessage $field)
    #if (!$field.valid) $field.message #end
#end

<form action="$petstoreRegisterLink" method="post">
  $csrfToken.hiddenField
  <input type="hidden" name="action" value="RegisterAction"/>

  #set ($group = $form.register.defaultInstance)

  <table border="0" cellpadding="0" cellspacing="10" width="100%" class="box">
    <tr align="center">
      <td><strong>用户注册</strong><br />
        <hr/>
        <div class="errorMessage">
          #registerMessage ($group.registerError)
        </div>
      </td>
    </tr>
  </table>
</form>

2.RegisterAction类

@Autowired
private FormService formService;
public void execute(TurbineRunData rundata, Context context){
  Form form = formService.getForm(); 
        if (form.isValid()) {
            //doSth
        }
}

参考资料:

Webx Framework

(全文完)
欢迎关注HollisChuang微信公众账号
打赏

如未加特殊说明,此网站文章均为原创,转载必须注明出处。HollisChuang's Blog » Webx表单验证

分享到:更多 ()

HollisChuang's Blog

联系我关于我