Posted on 2009-11-16 19:26
codingliyi 阅读(539)
评论(0) 编辑 收藏 所属分类:
Java EE
搭配Controller的相关类
一、实现Validator
使用SimpleFormController时,可以搭配一个Validator接口的实现对象,validator接口有两个必须实现的方法:
1Public interface Validator {
2
3boolean supports(Class clazz);
4
5void validate(Object obj, Errors errors);
6
7}
8
supports()方法回传一个boolean值,表示是否支持对所传入的对象进行验证,只有在传回true的情况下,才会使用validate()方法验证。
validate()方法的参数obj表示传入的表单对象,可对其进行验证,如有错,可使用Errors的reject()或rejectValue()方法加入错误信息。在后续的处理中,若errors中包含错误信息,会回到getViewPage()所设定的对象。
一个简单的表单验证示例:
LoginValidator.java
1public 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类:
1public 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中定义。如下:
1public 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>