65.9K
CodeProject 正在变化。 阅读更多。
Home

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

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2012 年 4 月 13 日

CPOL

4分钟阅读

viewsIcon

38921

downloadIcon

836

Java中用于客户端和服务器端验证框架的非常简单的基于XML的框架。

介绍 

大多数需要用户输入详细信息来下订单的网站,不仅需要字段验证,而且这些验证还基于其他字段的值。例如,如果用户选择了A类产品,那么他还应该输入产品数量(必须是整数等)。也可能存在复杂的条件。您可能需要根据这些条件启用/禁用或显示/隐藏一些控件。

所有这些都必须在四个地方实现

  1. 页面加载后(控件应以特定状态呈现)。 
  2. 当用户更改页面时。
  3. 在UI层的服务器端。
  4. 在BL层。

相同的逻辑必须在所有层上实现,并且JavaScript必须与Java代码一致。此外,用于验证控件的JavaScript有些相似,但必须重复编写。每当需求发生变化时,都需要在所有地方进行更改。

大多数验证框架仅提供基本验证,而不依赖于其他实体/控件的值/状态。

必备组件

  1. HTML控件的名称必须与服务器对象中的相应成员“name”相同。 
  2. 每个HTML控件都应具有有效的“id”。 
  3. 与控件关联的标签应具有“for”属性。 
  4. 页面应具有jQuery的以下库
    • jquery-1.7.1.min.js
    • jquery-ui-1.7.2.min.js(如果使用日期)
    • jquery-ui-timepicker-addon.js(如果使用日期)
  5. 页面应在HTML中定义以下CSS类
  6. .enabled { ...
    .disabled { ...
    .mandatory { ...
    .nonmandatory { ...
  7. 成员数据类型对应于控件类型
    • 复选框 - boolean
    • 多选 - List(支持所有String、Long、Float和Integer泛型类型)
    • 单选 - String
    • 文本框 - String、Integer、int、Long、long、Float、float和Date(框架会自动添加日历控件) 

验证XML格式

Action相关节点

  1. RequiredField - 验证字段是否为空,可选地仅在满足给定条件时才按特定格式验证。如果没有给出条件,则该字段必须有一个值。对于多选列表,至少应选择一个值。
  2. 属性

    • name(必需)- 控件的名称。
    • regex(可选)- 要在服务器端和客户端都验证的正则表达式。仅当服务器端数据类型为string时才有效。如果服务器端数据类型是上面提到的任何一种类型(除了string),则此项是预定义的。
    • expression(可选)- 除正则表达式外,还要验证的JavaScript表达式,例如parseInt(val, 10) > 25
    • message(可选)- 如果控件无效,将向用户显示此消息。
    • showHide(可选)- 如果条件不满足,则隐藏控件(及其标签)。
    • enableDisable(可选)- 如果条件不满足,则禁用控件(及其标签)。
  3. ShowHide(仅影响UI)- 如果条件不满足,则隐藏HTML元素。
  4. 属性

    • id(必需)- 元素的ID。
  5. EnableDisable(仅影响UI)- 如果条件不满足,则禁用HTML元素。
  6. 属性

    • id(必需)- 元素的ID。

条件相关节点

  1. And - And逻辑运算符。
  2. Or - Or逻辑运算符。
  3. Not - Not逻辑运算符。
  4. Condition - 要满足的条件。
  5. 属性

    • 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>

条件可以根据需要复杂。每个RequiredFieldShowHideEnableDisable都可以几乎有一个And子元素,并且只有And作为直接子元素。

如何使用

  1. 要获取JavaScript(用于客户端),请使用
  2. String generatedScript = OperationUtil.getClientScript(obj, validationXML);
  3. 对于服务器端验证
  4. 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

  1. 扩展ui.operation.Operation类并实现getClientScript
  2. 如果还需要服务器端验证,请实现IValidate接口。如果Validate方法返回false,getInvalidFields函数还将返回您的实现的实例。
  3. uioperation.properties中输入tagName=扩展类的完全限定名。

更新

  • 通过使用Javassist字节码操作库而不是反射,提高了性能。
  • 支持Enum和Double数据类型。在客户端,处理输入文件类型。 
  • 错误修复和增强功能。 

© . All rights reserved.