Posted on 2009-11-16 19:26
codingliyi 阅读(540)
评论(0) 编辑 收藏 所属分类:
Java EE
搭配Controller的相关类
一、实现Validator
使用SimpleFormController时,可以搭配一个Validator接口的实现对象,validator接口有两个必须实现的方法:
1
Public interface Validator
{
2
3
boolean supports(Class clazz);
4
5
void validate(Object obj, Errors errors);
6
7
}
8
supports()方法回传一个boolean值,表示是否支持对所传入的对象进行验证,只有在传回true的情况下,才会使用validate()方法验证。
validate()方法的参数obj表示传入的表单对象,可对其进行验证,如有错,可使用Errors的reject()或rejectValue()方法加入错误信息。在后续的处理中,若errors中包含错误信息,会回到getViewPage()所设定的对象。
一个简单的表单验证示例:
LoginValidator.java
1
public class LoginValidator implements Validator
{
2
3
public boolean supports(Class clazz)
{
4
return clazz.equals(LoginForm.class);
5
}
6
7
public void validate(Object obj, Errors errors)
{
8
LoginForm form = (LoginForm)obj;
9
if(form.getUsername() == null ||form.getUsername().equals(""))
10
errors.rejectValue("username", "empty", null, "用户名不能为空");
11
if(form.getPassword() == null ||form.getPassword().equals(""))
12
errors.rejectValue("password", "empty", null, "密码不能为空");
13
}
14
}
applicationContext.xml
1
<bean id="loginValidator" class="SpringMVC.LoginValidator" />
2
3
<bean id="loginController" class="SpringMVC.LoginController">
4
<property name="successView" value="loginSuccess" />
5
<property name="formView" value="login" />
6
<property name="validator" ref="loginValidator" />
7
</bean>
在进行验证时,可以使用ValidationUtils,上面提供了一些静态方法,如rejectIfEmpty()、rejectIfEmptyOrWhitespace()等等。
二、文件上传
如要实现文件上传,可以使用实现了MultipartResolver接口的类。Spring提供了CommonMultipartResolver与CosMultipartResolver,分别支持Commands FileUpload与COS FileUpload。
示例如下,加入设计了一个FileForm类:
1
public class FileForm
{
2
private String name;
3
private byte[] contents;
4
5
public String getName()
{
6
return name;
7
}
8
public void setName(String name)
{
9
this.name = name;
10
}
11
public byte[] getContents()
{
12
return contents;
13
}
14
public void setContents(byte[] contents)
{
15
this.contents = contents;
16
}
17
}
FileForm中接受文件上传的属性类型是byte数组,使用者上传的文件可以由ByteArrayMultipartFileEditor转换为byte数组并设定给FileForm。这必须在Controller中定义。如下:
1
public class UploadController extends SimpleFormController
{
2
private String path;
3
4
public UploadController()
{
5
this.setCommandClass(FileForm.class);
6
}
7
8
@Override
9
protected ModelAndView onSubmit(HttpServletRequest request,
10
HttpServletResponse response, Object command, BindException errors)
11
throws Exception
{
12
FileForm form = (FileForm)command;
13
String storedPath = path + System.getProperty("file.separator") + form.getName();
14
FileOutputStream fos = new FileOutputStream(storedPath);
15
fos.write(form.getContents());
16
fos.close();
17
return new ModelAndView(this.getSuccessView(), "filename", form.getName());
18
}
19
20
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception
{
21
super.initBinder(request, binder);
22
binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
23
}
24
25
public void setPath(String path)
{
26
this.path = path;
27
}
28
}
依以上的设定,文件上传后会储存在指定的目录。要使用文件上传的功能,必须在定义文件中加入multipartResolver的定义。
1
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
2
<property name="maxUploadSize" value="100000" />
3
</bean>
4
5
<bean id="uploadController" class="SpringMVC.UploadController">
6
<property name="successView" value="uploadSuccess" />
7
<property name="formView" value="upload" />
8
<property name="path" value="E:\upload" />
9
</bean>
下面是上传HTML页面的代码:
1
<form name="loginForm" action="upload.do" method="POST" enctype="multipart/form-data">
2
上传后文件名:<input type="text" name="name"/><br/>
3
选择文件:<input name="contents" type="file"/><br/>
4
<input type="submit" value="上传" />
5
</form>