Java 在SpringMVC应用程序中根据数据源(XML)验证表单输入的方法
我是Spring的新手,我很好奇如何根据数据源验证表单输入。顺便说一下,我正在使用Spring3.0.3。假设我有以下表格:Java 在SpringMVC应用程序中根据数据源(XML)验证表单输入的方法,java,spring,validation,Java,Spring,Validation,我是Spring的新手,我很好奇如何根据数据源验证表单输入。顺便说一下,我正在使用Spring3.0.3。假设我有以下表格: public class MyForm { private String format; public String getFormat() { return format; } public void setFormat( value:String ) { format = value;
public class MyForm {
private String format;
public String getFormat() {
return format;
}
public void setFormat( value:String ) {
format = value;
}
}
现在让我们假设format
属性是一种文件格式的字符串表示形式:“jpg”、“png”、“gif”、“bmp”等。我自然想为表单编写一个验证器。它看起来像这样:
public class MyFormvalidator implements Validator
{
@Override
public boolean supports( Class<?> clazz ) {
return MyForm.class.equals( clazz );
}
@Override
public void validate( Object obj, Errors errors ) {
MyForm myForm = (MyForm) obj;
ValidationUtils.rejectIfEmptyOrWhitespace( errors, "format", "error.required" );
if( !myForm.getFormat().equals( "jpg" ) &&
!myForm.getFormat().equals( "png" ) &&
.... etc .... ) {
errors.rejectValue( "format", "error.invalid" );
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<fileformats>
<item>jpg</item>
<item>png</item>
.... etc ....
</fileformats>
公共类MyFormvalidator实现验证器
{
@凌驾
公共布尔支持(类clazz){
返回MyForm.class.equals(clazz);
}
@凌驾
公共无效验证(对象对象,错误){
MyForm MyForm=(MyForm)obj;
ValidationUtils.rejectIfEmptyOrWhitespace(错误,“格式”,“错误.必需”);
如果(!myForm.getFormat().equals(“jpg”)&&
!myForm.getFormat().equals(“png”)&&
……等等……){
errors.rejectValue(“格式”,“error.invalid”);
}
}
}
这一切都很好,但假设我想添加新的受支持格式,而无需调整验证器、重新编译和部署它。让我们用一个可以修改的XML文件来保持简单,而不是进入数据库。它看起来像这样:
public class MyFormvalidator implements Validator
{
@Override
public boolean supports( Class<?> clazz ) {
return MyForm.class.equals( clazz );
}
@Override
public void validate( Object obj, Errors errors ) {
MyForm myForm = (MyForm) obj;
ValidationUtils.rejectIfEmptyOrWhitespace( errors, "format", "error.required" );
if( !myForm.getFormat().equals( "jpg" ) &&
!myForm.getFormat().equals( "png" ) &&
.... etc .... ) {
errors.rejectValue( "format", "error.invalid" );
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<fileformats>
<item>jpg</item>
<item>png</item>
.... etc ....
</fileformats>
jpg
巴布亚新几内亚
.... 等
最后,所有这些的真正意义…我应该采取什么方法在表单输入验证期间使这些数据可用?最简单的方法是使验证器成为Spring bean,并将格式列表放入Spring配置中:
public class MyFormvalidator implements Validator
{
private List<String> fileFormats;
public MyFormValidator(List<String> fileFormats) {
this.fileFormats = fileFormats;
}
... //the rest of your validator, including checks for fileFormats.contains(myForm.getFormat())
公共类MyFormvalidator实现验证器
{
私有列表文件格式;
公共MyFormValidator(列表文件格式){
this.fileforms=文件格式;
}
…//验证程序的其余部分,包括检查fileFormats.contains(myForm.getFormat())
现在,在Spring配置中,您有
<bean name="myFormValidator" class="something.something.MyFormValidator">
<constructor-arg>
<list>
<value>jpg</value>
<value>png</value>
... etc ...
</list>
</constructor-arg>
</bean>
jpg
巴布亚新几内亚
等
> p>您是否考虑对应用程序上下文源更改的更改?可以在bean定义中创建列表并将其注入到验证器中。
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<bean id="myValidator"
class="MyValidator>
<property name="acceptedExtensions"/>
<util:set>
<value>jpg</value>
<value>png</value>
</util:set>
</property>
</bean>
</beans>
public class MyFormvalidator
implements Validator {
private Set<String> acceptedExtensions;
public void setAcceptExtensions(Set<String> extensions) {//etc}
@Override
public void validate( Object obj, Errors errors ) {
MyForm myForm = (MyForm) obj;
ValidationUtils.rejectIfEmptyOrWhitespace(
errors, "format", "error.required" );
if( !acceptedExtensions.contains(myForm.getFormat){
errors.rejectValue( "format", "error.invalid" );
}
}
谢谢雅各伯,我真的喜欢这个方法。我现在还不是一个java开发者,但是这对我来说是最有意义的。当然,如果你考虑应用上下文版本控制器,你可以把bean定义放在一个单独的文件中,并将它导入Web.xml中。