非空校验,包括无输入及连续输入多个空格

本文介绍了一种在HTML5中实现表单非空验证的方法,包括使用required属性进行浏览器级验证,以及通过JavaScript自定义验证函数来处理不在form表单内的输入框验证。

在表格提交之前,我们通常要对表格内容做非空验证,非空验证包括空值校验和是否连续空格检验

通常的验证方法就是直接给 input输入框 添加 required 属性 这是个 h5 的新属性,浏览器自行进行非空校验

但对于某些不能很好的支持 h5 新属性或者某些需要异步提交的表单。(PS:要注意的是,required属性是针对form表单的,即如果你的输入框不在form表单内,且没有submit按钮,该属性是不起作用的)

对于某些不在form表单内的输入框的值,那么就需要我们自行进行判断了。

在此我写一个简单的校验函数:

html代码:

<input type="text" id="test1" required="required"/>
<input type="button" name="btn" id="btn" value="check" />

js代码:

var val = document.getElementById('test1'); 
var btn = document.getElementById('btn');
var regu = "^[ ]+$"; //正则匹配一个或多个空格
var re = new RegExp(regu);
btn.addEventListener('click',function(){
	var is_null = re.test(val.value);
	if(is_null||val.value==''){
		console.log('不可为空')
	}else{
		console.log('OkFine');
	}
});

这里我用到正则“^[ ]+$”进行检验  做下简单的解释  ^为起始标记符。$为结束标记符。[ ]为字符匹配条件,当前字符为空,即匹配空格。+为匹配一个或多个[ ]内的字符。



 

<think>我们正在讨论OVal验证框架。用户希望知道在OVal中如何实现:当字段时,才进行长度校验。 根据引用[2]中的示例,我们看到有多个注解同时使用:@NotNull, @NotBlank, 和@Length。但是,用户的需求是:只在的情况下才进行长度校验。这是因为如果字段为null,那么长度校验就没有意义(甚至可能抛出异常)。 在OVal框架中,我们可以使用条件约束(Conditional Constraints)来实现这种需求。具体来说,可以使用@ValidateWithMethod注解,或者使用OVal提供的表达式的功能(如使用JavaScript、Groovy等)来编写条件逻辑。 不过,引用[2]中的例子是同时使用了和长度校验,这实际上意味着:如果字段为(null或字符串),那么校验会失败,而长度校验不会被触发(因为验证会中断?)。但根据OVal的默认行为,当有多个约束时,所有约束都会被检查,然后返回所有违反的约束。因此,如果字段为,我们可能会同时得到和长度校验的错误(因为字符串的长度为0,可能小于最小长度要求)。这显然不是用户想要的:用户只希望在的情况下才检查长度。 因此,我们需要一种方式来实现条件验证:如果字段不为,则进行长度校验。 解决方案: 1. 使用OVal的条件表达式(利用when属性):OVal的某些约束注解支持`when`属性,可以指定一个条件表达式(如Groovy、JavaScript等),当表达式为true时才执行校验。 2. 使用@ValidateWithMethod注解,编写自定义的验证方法。 但是,查看引用[3]和[4]: 引用[3]提到:OVal支持使用表达式,可以自定义条件。 引用[4]提到:@ValidateWithMethod注解的使用。 因此,我们可以采用以下两种方法之一: 方法一:使用表达式条件(例如Groovy) 例如,我们可以这样写: @Length(max=5, message="计息周期月数长度最大不能超过5", when="groovy:_this.iccmc != null") 注意:这里的"_this"表示当前对象。这个条件表示当iccmc字段不为null时,才进行长度校验。 但是,注意引用[2]中的例子还用了@NotBlank,它已经包含了检查(不为null且不为字符串)。如果我们只想在包括不为字符串)的情况下校验长度,我们可以这样: @Length(max=5, message="计息周期月数长度最大不能超过5", when="groovy:_this.iccmc != null && !_this.iccmc.empty") 然而,这样写可能有点冗长,而且我们可能已经在其他注解中处理了情况。另外,OVal的@Length注解在字符串为null时不会触发(因为null没有长度),但如果我们同时有校验,那么当为null时,校验会捕获,而长度校验不会执行(因为条件不满足)。但是,如果我们没有校验,那么当字段为null时,条件不满足,长度校验不会执行,也就不会报长度错误,但可能我们需要校验。 所以,更常见的做法是:先进行校验,然后在的基础上进行其他校验。OVal默认会按顺序检查所有约束,但是我们可以通过条件表达式避免在为时进行长度校验。 方法二:使用@ValidateWithMethod自定义验证方法 我们可以写一个方法,在这个方法中实现:如果字段不为,则检查长度。例如: ```java @ValidateWithMethod(methodName = "validateIccmc", parameterType = String.class) private String iccmc; public boolean validateIccmc(String value) { if (value == null || value.trim().isEmpty()) { // 校验由其他注解处理,这里只处理时的长度 return true; // 如果为,这里返回true表示通过,因为由其他注解负责 } return value.length() <= 5; } ``` 然后,我们还需要单独的校验注解(如@NotNull或@NotBlank)。这样,当字段为时,校验会失败,而自定义方法返回true(表示通过),但是校验已经失败了。当字段时,就会检查长度。 但是,这种方法需要我们在每次使用时都写一个方法,比较麻烦。 综合来看,方法一使用条件表达式更简洁。不过,需要注意的是,OVal的不同版本可能有差异。根据引用[3],OVal支持多种脚本语言,因此我们可以选择一种(如Groovy)来编写条件。 具体实现步骤(使用Groovy表达式): 1. 确保项目中包含了Groovy的依赖(因为OVal默认可能不包含Groovy引擎,需要额外添加)。 2. 在字段上同时使用校验和条件化的长度校验。 示例代码: ```java @NotNull(message = "计息周期月数不能为") @NotBlank(message = "计息周期月数不能为字符") @Length(max=5, message="计息周期月数长度最大不能超过5", when = "groovy:_value != null") private String iccmc; ``` 注意:这里我们使用了`_value`,它代表当前字段的值。在OVal的条件表达式中,`_value`是一个特殊变量,表示被注解字段的值。 但是,因为我们已经有了@NotNull和@NotBlank,所以当字段为null或字符串时,前面的注解已经会捕获错误,而@Length的条件为`_value != null`,在字段为null时条件为假,所以不会执行长度校验。当字段为字符串时,条件为真(因为字符串不是null),所以长度校验会执行,而字符串的长度为0,不会超过5,所以不会报错。但是,如果字段是字符串,那么@NotBlank已经会报错(因为要求字符),所以长度校验的结果无关紧要(因为验证会返回多个错误,但通常我们只关注第一个错误?)。不过,用户的需求是“时进行长度校验”,这个需求已经满足。 但是,如果用户希望避免在字段为字符串时进行长度校验(因为此时校验已经失败,可以跳过长度校验),我们可以修改条件: ```java @Length(max=5, message="计息周期月数长度最大不能超过5", when = "groovy:_value != null && !_value.isEmpty()") ``` 这样,当字段为字符串时,条件为false,长度校验不会执行。但是,由于我们已经有了@NotBlank,字符串会被@NotBlank捕获,所以这个条件主要是为了在字符串的情况下进行长度校验。 然而,这样写条件表达式可能会重复校验的逻辑。实际上,如果我们已经确保校验一定先执行,那么我们可以认为当长度校验执行时,字段已经通过了校验(即不为null且不为字符串)。但是,OVal默认会检查所有约束,而不是遇到一个错误就停止。因此,为了避免在字段为字符串时执行长度校验,使用上述条件表达式是合理的。 总结:推荐使用条件表达式,并结合校验,实现“时才进行长度校验”。 因此,我们可以这样写: ```java @NotNull @NotBlank @Length(max = 5, when = "groovy:_value != null && _value.trim().length() > 0") private String iccmc; ``` 但注意:条件表达式中的条件应该与我们的校验一致。实际上,校验已经确保了字段不为null且不为包括空格?),而@NotBlank要求至少有一个空格字符。所以,如果字段是空格字符串,@NotBlank会失败。在条件表达式中,我们可能希望空格字符串也不进行长度校验,因此我们可以这样写: ```java @Length(max=5, message="计息周期月数长度最大不能超过5", when = "groovy:_value != null && !_value.trim().isEmpty()") ``` 这样,只有字段null且去除空格,才进行长度校验。 但是,用户可能更希望的是:只要字段不为null(不管是不是字符串)就进行长度校验?或者,用户可能希望只有在字段有实际内容(字符串)时才校验长度。这取决于业务需求。 根据用户问题“当oval时进行长度校验”,这里的“”应该是指不为null(因为字符串在Java中不是null)。因此,最简单的条件就是`_value != null`。 所以,最终的实现可以是: ```java @NotNull(message = "不能为null") @Length(max=5, when = "groovy:_value != null") private String iccmc; ``` 这样,当字段为null时,@NotNull会报错,长度校验不会执行(因为条件为假)。当字段不为null时(即使它是字符串),长度校验会执行,字符串长度为0,小于5,所以不会报错。但是,如果用户不允许字符串,那么还需要@NotBlank。 因此,如果用户既不允许null,也不允许字符串,并且要求时(即null,因为null已经排除)进行长度校验,可以这样: ```java @NotNull @NotBlank @Length(max=5, when = "groovy:_value != null") // 这里用_value != null 即可,因为@NotNull已经保证不为null,所以这个条件总是真。那么我们可以省略条件? ``` 但是,由于@NotNull已经保证了不为null,所以实际上`when`条件总是满足。那么我们可以省略条件,直接写: ```java @NotNull @NotBlank @Length(max=5) ``` 这样,当字段为null时,@NotNull会报错,同时长度校验不会执行(因为OVal在遇到null时,对于@Length注解,它会尝试调用字符串的length()方法,这会抛出NullPointerException)。为了避免异常,OVal框架内部可能会对null值跳过长度校验?还是说会报错? 根据OVal的设计,它应该能够处理null值:如果字段为null,那么@Length校验会失败(因为null没有长度),但这样就会同时报@NotNull和@Length两个错误。而用户的期望是:时才校验长度。因此,即使有了@NotNull,我们仍然希望避免在null时执行长度校验(因为没有必要,而且可能会产生额外的错误信息)。 所以,为了严格满足“时才校验长度”,我们可以在有@NotNull的情况下,仍然给@Length加上条件`when="groovy:_value != null"`。这样,当字段为null时,长度校验不会被触发,只有@NotNull错误;当字段null时,长度校验才会执行。 因此,最终推荐写法: ```java @NotNull(message = "不能为null") @NotBlank(message = "不能为字符串") @Length(max=5, message="长度不能超过5", when = "groovy:_value != null") private String iccmc; ``` 这样,当字段为null时,只触发@NotNull的错误;当字段为字符串时,触发@NotBlank的错误(并且因为条件`_value != null`为真(字符串不是null),所以长度校验也会执行,但由于字符串长度为0,所以不会报错,除有最小长度限制);当字段字符串时,长度校验执行,如果长度超过5,则报错。 注意:字符串(长度为0)不会触发长度错误(因为0<=5),所以没有问题。 但是,如果用户希望字符串不进行长度校验(因为字符串才需要长度校验),那么我们可以修改条件为: ```java @Length(max=5, message="长度不能超过5", when = "groovy:_value != null && _value.length() > 0") ``` 这样,字符串就不会进行长度校验了。但是,由于@NotBlank已经要求不能是字符串,所以字符串会被@NotBlank捕获,因此长度校验是否执行并不影响最终的错误信息。所以,这个条件可以不加,但加了也可以。 因此,我们可以根据具体情况选择条件。 结论:在OVal中,实现当字段时进行长度校验,可以通过在@Length注解上添加条件表达式`when = "groovy:_value != null"`来实现,同时结合校验注解(@NotNull和@NotBlank)。 注意:如果项目中没有Groovy,可以选择其他脚本语言,比如JavaScript(但需要JDK1.6+的Scripting支持)或者OGNL等。例如,使用JavaScript的条件: ```java @Length(max=5, when = "javascript:_value !== null") ``` 或者使用OGNL: ```java @Length(max=5, when = "ognl:_value != null") ``` 请根据项目配置选择合适的脚本语言。 另外,如果不想使用脚本语言,也可以使用@ValidateWithMethod自定义校验方法,但代码量较多。 所以,我们推荐使用条件表达式的方式。 </think>在 OVal 框架中实现「当字段时进行长度校验」的需求,可以通过 **条件约束(Conditional Constraints)** 结合注解来实现。以下是具体实现方法: --- ### 方法 1:使用 `when` 条件表达式(推荐) 通过 `when` 属性指定 Groovy/OGNL 表达式,仅在字段时触发长度校验: ```java import net.sf.oval.constraint.Length; import net.sf.oval.constraint.NotNull; public class User { // 校验长度(5-20字符) @NotNull(message = "用户名不能为") @Length(min = 5, max = 20, when = "groovy:_this.username != null", // Groovy 条件表达式 message = "用户名长度需在5-20字符之间") private String username; } ``` #### 说明: - `when = "groovy:_this.username != null"`:当 `username` null 时触发长度校验 - 支持脚本引擎:**Groovy**(默认)、MVEL、JavaScript 等(需引入对应依赖) - 引用自 OVal 条件约束特性 [^3][^4] --- ### 方法 2:自定义校验逻辑(复杂场景) 通过 `@ValidateWithMethod` 实现自定义条件校验: ```java import net.sf.oval.Validator; import net.sf.oval.constraint.NotNull; import net.sf.oval.constraint.ValidateWithMethod; public class Product { @NotNull(message = "产品编码不能为") @ValidateWithMethod(methodName = "validateCodeLength", parameterType = String.class, message = "编码长度必须为10位") private String productCode; // 自定义校验方法:时检查长度 public boolean validateCodeLength(String code) { return code != null && code.length() == 10; } } ``` --- ### 补充说明 1. **依赖配置**(Maven): ```xml <dependency> <groupId>net.sf.oval</groupId> <artifactId>oval</artifactId> <version>3.0</version> </dependency> <!-- 若用 Groovy 表达式 --> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy</artifactId> <version>3.0.7</version> </dependency> ``` 2. **执行校验**: ```java Validator validator = new Validator(); List<ConstraintViolation> violations = validator.validate(user); if (!violations.isEmpty()) { violations.forEach(v -> System.out.println(v.getMessage())); } ``` 引用自 OVal 基础用法 [^5] --- ### 两种方法对比 | **方法** | **适用场景** | **复杂度** | |------------------------|----------------------------------|------------| | `when` 条件表达式 | 简单条件逻辑 | ⭐☆☆☆☆ | | `@ValidateWithMethod` | 需要复杂自定义逻辑(如跨字段校验) | ⭐⭐⭐☆☆ | > **关键点**:优先选择 `when` 表达式实现条件约束,避免在字段为 `null` 时触发不必要的长度校验异常 [^2][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值