Posted on 2009-11-16 19:26
codingliyi 閱讀(544)
評論(0) 編輯 收藏 所屬分類:
Java EE
搭配Controller的相關(guān)類
一、實現(xiàn)Validator
使用SimpleFormController時,可以搭配一個Validator接口的實現(xiàn)對象,validator接口有兩個必須實現(xiàn)的方法:
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()方法的參數(shù)obj表示傳入的表單對象,可對其進行驗證,如有錯,可使用Errors的reject()或rejectValue()方法加入錯誤信息。在后續(xù)的處理中,若errors中包含錯誤信息,會回到getViewPage()所設(shè)定的對象。
一個簡單的表單驗證示例:
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,上面提供了一些靜態(tài)方法,如rejectIfEmpty()、rejectIfEmptyOrWhitespace()等等。
二、文件上傳
如要實現(xiàn)文件上傳,可以使用實現(xiàn)了MultipartResolver接口的類。Spring提供了CommonMultipartResolver與CosMultipartResolver,分別支持Commands FileUpload與COS FileUpload。
示例如下,加入設(shè)計了一個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數(shù)組,使用者上傳的文件可以由ByteArrayMultipartFileEditor轉(zhuǎn)換為byte數(shù)組并設(shè)定給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
}
依以上的設(shè)定,文件上傳后會儲存在指定的目錄。要使用文件上傳的功能,必須在定義文件中加入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>