Java 中简单的客户端和服务器端验证框架





0/5 (0投票)
Java中用于客户端和服务器端验证框架的非常简单的基于XML的框架。

介绍
大多数需要用户输入详细信息来下订单的网站,不仅需要字段验证,而且这些验证还基于其他字段的值。例如,如果用户选择了A类产品,那么他还应该输入产品数量(必须是整数等)。也可能存在复杂的条件。您可能需要根据这些条件启用/禁用或显示/隐藏一些控件。
所有这些都必须在四个地方实现
- 页面加载后(控件应以特定状态呈现)。
- 当用户更改页面时。
- 在UI层的服务器端。
- 在BL层。
相同的逻辑必须在所有层上实现,并且JavaScript必须与Java代码一致。此外,用于验证控件的JavaScript有些相似,但必须重复编写。每当需求发生变化时,都需要在所有地方进行更改。
大多数验证框架仅提供基本验证,而不依赖于其他实体/控件的值/状态。
必备组件
- HTML控件的名称必须与服务器对象中的相应成员“name”相同。
- 每个HTML控件都应具有有效的“id”。
- 与控件关联的标签应具有“for”属性。
- 页面应具有jQuery的以下库
- jquery-1.7.1.min.js
- jquery-ui-1.7.2.min.js(如果使用日期)
- jquery-ui-timepicker-addon.js(如果使用日期)
- 页面应在HTML中定义以下CSS类
- 成员数据类型对应于控件类型
- 复选框 - boolean
- 多选 - List(支持所有String、Long、Float和Integer泛型类型)
- 单选 - String
- 文本框 - String、Integer、int、Long、long、Float、float和Date(框架会自动添加日历控件)
.enabled { ...
.disabled { ...
.mandatory { ...
.nonmandatory { ...
验证XML格式
Action相关节点
- RequiredField - 验证字段是否为空,可选地仅在满足给定条件时才按特定格式验证。如果没有给出条件,则该字段必须有一个值。对于多选列表,至少应选择一个值。
- name(必需)- 控件的名称。
- regex(可选)- 要在服务器端和客户端都验证的正则表达式。仅当服务器端数据类型为string时才有效。如果服务器端数据类型是上面提到的任何一种类型(除了string),则此项是预定义的。
- expression(可选)- 除正则表达式外,还要验证的JavaScript表达式,例如parseInt(val, 10) > 25。
- message(可选)- 如果控件无效,将向用户显示此消息。
- showHide(可选)- 如果条件不满足,则隐藏控件(及其标签)。
- enableDisable(可选)- 如果条件不满足,则禁用控件(及其标签)。
- ShowHide(仅影响UI)- 如果条件不满足,则隐藏HTML元素。
- id(必需)- 元素的ID。
- EnableDisable(仅影响UI)- 如果条件不满足,则禁用HTML元素。
- id(必需)- 元素的ID。
属性
属性
属性
条件相关节点
- And - And逻辑运算符。
- Or - Or逻辑运算符。
- Not - Not逻辑运算符。
- Condition - 要满足的条件。
- name(必需)- 要检查其值的控件的名称。
- value(可选)- 要满足的值。对于多选框,使用~##~作为分隔符。
- expression(可选)- 要在客户端和服务器端都验证的JavaScript表达式。可以指定value属性或expression属性。但至少需要指定一个。
属性
XML示例
<RequiredField name="itemName" regex="^\w+$"
	message="Item name can only be alpha numeric." />
<RequiredField name="count" />
<RequiredField name="cost" expression="parseInt(val, 10) > 0"
	message="Cost cannot be zero." />
<RequiredField name="type" enableDisable="true">
	<And>
		<Condition name="buy" expression="val==true" />
	</And>
</RequiredField>
<RequiredField name="woodValue">
	<And>
		<Condition name="buy" value="true" />
		<Condition name="type" value="Wood" />
	</And>
</RequiredField>
<ShowHide id="transferDiv">
	<And>
		<Condition name="transfer" value="true" />
		<Not>
			<Condition name="userType" value="" />
		</Not>
		<Condition name="transfer" value="Transfer Date" custom="myCustomFunction"/>
	</And>
</ShowHide>
条件可以根据需要复杂。每个RequiredField、ShowHide和EnableDisable都可以几乎有一个And子元素,并且只有And作为直接子元素。
如何使用
- 要获取JavaScript(用于客户端),请使用
- 对于服务器端验证
String generatedScript = OperationUtil.getClientScript(obj, validationXML);
InvalidField invalidField = OperationUtil.getInvalidField(obj,validationXML); //null in case all are valid.
List<InvalidField> invalidFields = OperationUtil.getInvalidFields(obj,validationXML); //0 size in case all are valid.
validationXML只是XML的名称(或相对路径),它包含在类路径中。假设HTML中存在所有必需字段和条件节点中给出的name的元素。obj为所有必需字段和条件节点中给出的name提供相应的getter。
如果您想在不进行验证的情况下提交表单,可以通过调用以下方法来完成
submitForm(true)
创建自己的Action
- 扩展ui.operation.Operation类并实现getClientScript。
- 如果还需要服务器端验证,请实现IValidate接口。如果Validate方法返回false,getInvalidFields函数还将返回您的实现的实例。
- 在uioperation.properties中输入tagName=扩展类的完全限定名。
更新
- 通过使用Javassist字节码操作库而不是反射,提高了性能。
- 支持Enum和Double数据类型。在客户端,处理输入文件类型。
- 错误修复和增强功能。


