拿典型的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
}
}
参考资料: