:: 首页 ::  :: 联系 :: 聚合  :: 管理

Spring技术手册笔记(六):Spring MVC 下

Posted on 2009-11-16 19:26 codingliyi 阅读(531) 评论(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表示传入的表单对象,可对其进行验证,如有错,可使用Errorsreject()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提供了CommonMultipartResolverCosMultipartResolver,分别支持Commands FileUploadCOS 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[].classnew 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>


只有注册用户登录后才能发表评论。


网站导航: