:: 首頁 ::  :: 聯系 :: 聚合  :: 管理

          Spring技術手冊筆記(六):Spring MVC 下

          Posted on 2009-11-16 19:26 codingliyi 閱讀(550) 評論(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>

          主站蜘蛛池模板: 托里县| 盐边县| 潜山县| 怀仁县| 泌阳县| 宿松县| 华宁县| 合阳县| 秀山| 舞阳县| 镇坪县| 疏勒县| 富民县| 绥中县| 蕲春县| 屏东县| 徐闻县| 雷山县| 夹江县| 原阳县| 宣威市| 沙坪坝区| 铜梁县| 罗定市| 城步| 玉屏| 遵义县| 房山区| 长岭县| 绥棱县| 馆陶县| 隆德县| 望城县| 遂宁市| 大姚县| 临颍县| 麻江县| 海兴县| 中山市| 资阳市| 凉城县|