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