zoukankan      html  css  js  c++  java
  • springMVC数据校验与单文件上传

    spring表单标签:
        <fr:from/> 渲染表单元素
        <fr:input/>输入框组件
        <fr:password/>密码框组件标签
        <fr:hidden/>隐藏框组件标签0
        <fr:textarea/>多行输入框组件标签
        <fr:radiobutton/>单选框组件标签
        <fr:checkbox/>复选框组件标签
        <fr:select/>下拉列表组件标签
        <fr:error/>显示表单数据校验所对应的错误信息
        数据校验:
        JSR 303是Java为Bean数据合法性检验所提供的标准框架。JSR 303通过在Bean属性上标注类似于@NotNull,@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证。
        JSR 303约束
         @Null 被注解的元素必须为空
         @NotNull 被注解的元素必须不为空
         @AssertTrue 被注解的元素必须为true
         @AssertFalse  被注解的元素必须为false
         @Min(value) 被注解的元素必须有一个数字,其值必须大于等于指定的最小值
         @Max(value)  被注解的元素必须有一个数字,其值必须小于等于指定的最大值
         @DecimalMin(value) 被注解的元素必须有一个数字,其值必须大于等于指定的最小值
         @DecimalMax(value) 被注解的元素必须有一个数字,其值必须小于等于指定的最大值
         @Size(max,min) 被注解的元素的大小必须在指定的范围内
         @Digits(integer,fraction) 被注解的元素必须是一个数字,其值必须在可接受的范围内
         @Past 被注解的元素必须是一个过去的日期
         @Future 被注解的元素必须是一个将来的日期
         @Pattern(value) 被注解的元素必须符合指定的正则表达式
         Spring MVC支持JSR 303标准的校验框架,Spring的DataBinder在进行数据绑定时,可用时调用校验框架来完成数据校验工作,非常方便简洁。在Spring MVC中,可以直接通过注解驱动的方式来进行数据校验。
         在User.java中需要做验证的属性上标注校验注解后,下一步就需要在Controller中使用注解所声明的限制规定来进行数据的校验,由于<mvc:annotation-driven/>会默认装配好一个LocalValidatorFactoryBean,通过在Controller的处理方法的入参上标注@Valid注解即可让SpringMVC在完成数据绑定之后,执行数据校验的工作。
         注意:@Valid注解标示的参数后面,必须紧挨着一个BindingResult参数,否则Spring会在校验不通过时直接抛出异常。
       

         数据校验实例:      

    <!--后台数据验证-->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>4.0.1.GA
        </version>
    </dependency>
    
    <!--jboss logging-->
    <dependency>
        <groupId>org.jboss.logging</groupId>
        <artifactId>jboss-logging</artifactId>
        <version>3.3.0.Final</version>
    </dependency>
    
    <!--validation api-->
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.0.0.GA
        </version>
    </dependency>
    
    <!--slf4j api-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.21</version>
    </dependency>


      
         2.配验证器:LocalvalidatorFactoryBean类
                     属性:HibernateValidator


          <!--配置包扫描器-->
         

       <!--配置包扫描器-->
    <context:component-scan base-package="cn.Hibernate"></context:component-scan>
    <bean id="myValidator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
    </bean>
    
    <!--mvc注解驱动-->
    <mvc:annotation-driven validator="myValidator"></mvc:annotation-driven>



         3.实体类打标记:
              

    public class UserInfo {
    
        @Min(value =0,message = "成绩最小值为{value}")
        @Max(value = 100,message = "最大成绩值为{value}")
       private   Integer score;
    
    @NotEmpty(message = "手机号不允许为空")
     @Pattern(regexp = "^1[3456789]\d{9}$",message = "手机号不正确")
        private  String  phone;
    
    @NotEmpty(message = "用户名不能为空")
    @Size(min = 3,message = "名字至少3个字符")
    private  String name;
    


       
        4.Controller
          

    @Controller
    public class CollerHiber {
        @RequestMapping("/first")
        public ModelAndView doFirst(@Valid UserInfo info, BindingResult bindingResult) {
            ModelAndView mv = new ModelAndView();
            mv.setViewName("/index.jsp");
            int errCount = bindingResult.getErrorCount();
            if (errCount > 0) {
                //证明模型试验失败
    FieldError score = bindingResult.getFieldError("score");
                FieldError name = bindingResult.getFieldError("name");
                FieldError phone = bindingResult.getFieldError("phone");
                if (score != null) {
                    mv.addObject("scoremsg", score.getDefaultMessage());
                }
                if (name != null) {
                    mv.addObject("namemsg", name.getDefaultMessage());
                }
                if (phone != null) {
                    mv.addObject("phonemsg", phone.getDefaultMessage());
                }
                mv.setViewName("/Hiber.jsp");
            }
        return mv;
        }
    }
    

    创建一个页面,用来实现代码的展示:

        当校验都输入正确之后就会跳转到下一个页面,如图所示:

                              

      单文件上传   

        单文件上传:
        MultipartResolver 用于处理上传请求,将上传请求包装成可以直接获取文件的数据,从而方便操作,他的两个实现类:StanderdServletMultipartResover和CommonsMultipartResolver.
        *StanderdServletMultipartResover:使用了servlet3.0标准的上传方式。
        *CommonsMultipartResolver:使用了Apache的commons-fileupload来完成具体的上传操作。
        使用CommonsMultipartResolver来完成上传,具体步骤如下:
         1.导入jar文件
            需要使用Apache Commons FileUpload组件,因此要在工程中导入commons-io-2.4jar,commons-fileupload-1.2.2jar.
         2.配置MultipartResolver
            首先使用CommonsMultipartResolver配置一个MultipartResolver解析器,关键实例如:
             //配置MultipartResolver,用于上传文件,使用spring的commonsMultipartResolver
            <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
                <property name="maxUploadSize"  value="50000"/>
                <property name="defaultEncoding" value="UTF-8"/>
            </bean>
          *defaultEncoding:请求的编码格式,默认为ISO-8859-1,此处设置为UTF-8(defaultEncoding必须和JSP的pageEncoding设置一致,以便正常读取表单内容)
          *maxUploadSize:上传文件大小上限,单位为字节。
          实现文件上传的流程:Spring MVC会将上传文件绑定到MultipartFile对象中,MultipartFile提供了上传文件内容,文件名等。最后通过其transferTo()方法将文件存储到服务器上。
          (1)MultipartFile对象作为控制器处理方法的入参(@RequeestParam(value="idPicPath",required=false)MultipartFilevattach),从MultipartFile对象中,可以获取上传文件的相关信息,其提供的方法如:
                            getBytes()            : byte[]
                            getContentType()      :String
                            getInputStream()      :InputStream
                            getName()             :String
                            getOriginalFilename() :String
                            getSize()             :long
                            isEmpty()             :boolean
                            transferTo(File)      :void
          (2)在处理方法中,首先通过MultipartFile对象是否为空来判断是否有上传的文件。若不为空,在进行上传处理,否则直接进行其他数据字段的常规保存。
              if(!attach.isEmpty()){
                   //...上传操作
             }
                //调用userService.add(user)方法保存新增数据
         (3)*定义上传目标路径,关键实例如:
                      String path=request.getSession().getServletcontext().getRealPath("statice"+File.separator+"uploadfiles");
              *获取原文件名,关键代码如下:
                   String  oldFileName=attache.getOriginalFilename();
              *获取原文件后缀并进行判断:
                   String  prefix=FilenameUtils.getExtension(oldFileName);
              *获取原文件大小,并与规定的上传大小进行比较,若超过规定大小。
                   int  filesize=500000; 
                  if(attach.getSize()>filesize){   
                             requset.setAttribute("uploadFileError","*上传文件大小不得超过500KB");
                          return "useradd";
                      }

     单文件上传实例:    

    首先导入架包:      

    <!--文件上传的jar包-->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>
    
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.4</version>
    </dependency>
    


          大配置:
              

    <!--配置包扫描器-->
    <context:component-scan base-package="cn.Fileuplode"></context:component-scan>
             <!--配置文件上传的专用类-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
    <mvc:annotation-driven/>


          Controller:
             

        @Controller
        public class FileController {
        @RequestMapping("/first")
        public  String doFirst(MultipartFile  upload, HttpSession session){
            /*获取到用户上的文件名称*/
    String chile=upload.getOriginalFilename();  //文件短名称
            /*将相对路径转化成绝对路径*/
    String  parpath=session.getServletContext().getRealPath("/uplode");
    
            /*将file写入指定路径*/
    File  filepath=new File(parpath,chile);
            try {
                upload.transferTo(filepath);
                return "/Fileuplode.jsp";
            } catch (IOException e) {
                e.printStackTrace();
                return "/list.jsp";
            }
        }
    }
    创建一个上传文件的页面:
    <h1>文件上传</h1>
    <form action="/first" method="post" enctype="multipart/form-data">
        文件   <input type="file" name="upload"/>
        <input type="submit"/>
    </form>
    运行结果:

  • 相关阅读:
    Ubuntu 下配置ftp服务端
    mysql的sql文件的备份与还原
    Virtualbox后台管理之VBoxManage
    主从库延迟对项目质量的影响
    jenkins / ant / jmeter 持续集成接口自动化
    infer 检验IOS项目
    pmd静态代码分析
    利用线上数据验证系统 Gor
    python flask (一)
    python SQLAlchemy
  • 原文地址:https://www.cnblogs.com/wangbenqing/p/7468870.html
Copyright © 2011-2022 走看看