数据校验及文件上传

一、文件上传


1.导入相关jar包
2.网页端的要求
3.在springMVC配置文件上传解析器
4.Controller控制层处理


二、拦截器


什么是web容器?
web容器的作用
URL与servlet映射模式


三、数据校验


1.引入jar包
2.实体类中添加注解(同一个属性可添加多个注解)
3.接受的参数前要加注解,所有错误都被封装
一、文件上传
上传到本地服务器下,数据库中存放的是图片的路径

1.导入相关jar包

<!--支持文件上传-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.5</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.16.1</version>
    </dependency>


 
2.网页端的要求

<form action="user/upload" enctype="multipart/form-data" method="post">
        文件上传:<input type="file" name="myfile"/><br/>
        <input type="submit" value="提交"/>
</form>




3.在springMVC配置文件上传解析器

<!-- 配置MultipartResolver,用于上传文件,使用spring的CommonsMultipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="5000000"/>
        <property name="defaultEncoding" value="UTF-8"/>
</bean>


 
4.Controller控制层处理

 @Controller
    @RequestMapping("user")
    public class UserController {
        @RequestMapping("upload")
        public String upload(MultipartFile myfile,HttpServletRequest request) {
            //获取文件上传真实保存的路径
            String path=request.getServletContext().getRealPath("/upload");
            //创建一个文件对象
            File file=new File(path);
            if(!file.exists()) {
                file.mkdirs();    //路径不存在,手动创建
            }
            //获取文件名
            String name=System.currentTimeMillis()+myfile.getOriginalFilename(); //System.currentTimeMillis()防止文件名重复而覆盖
            File targetFile=new File(path+"/"+name);
            System.out.println(targetFile);
            try {
                FileUtils.writeByteArrayToFile(targetFile,myfile.getBytes()); //工具类写入文件,转化为字节
            } catch (IOException e) {
                e.printStackTrace();
            }
            return ("login");
        }
    }

 
二、拦截器


filter:过滤网页、地址==>过滤一部分页面,但是还要另外设置Servlet的过滤,否则仍然可以通过Servlet进入,但是Servlet中也会存在不需要过滤的 部分,如拦截Servlet中的用户操作方法而不拦截用户注册登录方法
拦截器:springMVC每一个方法对应一个请求地址。
拦截器与Filter的区别:
拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
拦截器不依赖于servlet容器,过滤器依赖于servlet容器。
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

什么是web容器?


servlet没有main方法,那我们如何启动一个servlet?如何结束一个servlet?如何寻找一个servlet?这些都受控于另一个java应用,这个应用我们就称之为web容器。
最常见的tomcat就是这样一个容器.如果web服务器应用得到一个指向某个servlet的请求,此时服务器不是把servlet交给servlet本身,而是交给部署该servlet的容器.要由容器向servlet提供http请求和响应,而且要由容器调用servlet的方法,如doPost或者doGet。

web容器的作用


通信支持:利用容器提供的方法,可以简单的实现servlet与web服务器的对话.否则就要自己建立server搜创可贴,监听端口,创建新的流等一系列复杂的操作.而容器的存在就帮我们封装这一系列复杂的操作.使我们能够专注于servlet中的业务逻辑的实现.
生命周期管理:容器负责servlet的整个生命周期.如何加载类,实例化和初始化servlet,调用servlet方法,并使servlet实例能够被垃圾回收.有了容器,我们就不用花精力去考虑这些资源管理垃圾回收之类的事情.
多线程支持:容器会自动为接收的每个servlet请求创建一个新的java线程,servlet运行完之后,容器会自动结束这个线程.
声明式实现安全:利用容器,可以使用xml部署描述文件来配置安全性,而不必将其硬编码到servlet中。
jsp支持:容器将jsp翻译成java!

URL与servlet映射模式
servlet有三个名字:

客户知道的URL名:<url-pattern>/.do</url-pattern>
 
  部署人员知道的秘密的内部名:<servlet-name>springMVC</servlet-name>
  实际文件名:<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 


创建拦截器


创建一个类实现HandlerIntercepter并重写接口中的方法

 public class NotLoginIntercepter implements HandlerInterceptor{
            @Override
            public void afterCompletion(HttpServletRequest arg0,  HttpServletResponse arg1, Object arg2, Exception arg3)
                throws Exception {    //请求处理完成后的方法
                System.out.println("Interceptor_afterCompletion");
                }
            @Override
            public void postHandle(HttpServletRequest arg0,  HttpServletResponse arg1, Object arg2, ModelAndView arg3)
                throws Exception {
                System.out.println("Interceptor_postHandle");
                }
            @Override
            public boolean preHandle(HttpServletRequest request,  HttpServletResponse response, Object arg2) 
                 throws Exception {    //相当于doFilter方法,返回boolean,true表示允许通过
                 System.out.println("Interceptor_preHandle");
                }
            }   

 
创建的拦截器配置到springMVC配置文件中

<mvc:interceptors>
<mvc:interceptor>
    <mvc:mapping path="/user/**"/>    <!--表示user目录及其所有子目录下所有,*表示user目录下所有-->
    <mvc:exclude-mapping path="/user/loginDo"/>
    <mvc:exclude-mapping path="/user/login"/>
     <mvc:exclude-mapping path="/user/register"/>
       <bean class="com.zhiyou100.yj.intercepter.NotLoginIntercepter"></bean>
     </mvc:interceptor>
</mvc:interceptors>


 


三、数据校验


1.引入jar包

 <dependency>
      <groupId>com.fasterxml</groupId>
      <artifactId>classmate</artifactId>
      <version>1.6.0</version>
</dependency>
 <dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>8.0.1.Final</version>
</dependency>
<dependency>
      <groupId>org.jboss.logging</groupId>
      <artifactId>jboss-logging</artifactId>
      <version>3.5.3.Final</version>
</dependency>
<dependency>
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <version>2.0.1.Final</version>
</dependency>


2.实体类中添加注解(同一个属性可添加多个注解)

 //validate在验证第一个失败后,还会继续验证其他
    public class User {
        @NotEmpty(message="用户名不能为空")
        private String name;
        @Length(min=6,max=12,message="密码长度在6~12之间")
        private String password;
        @Pattern(regexp="/^1([38]\\d|5[0-35-9]|7[3678])\\d{8}$/",message="手机格式不正确")    //添加正则验证
        private String phone;
    }


 

3.接受的参数前要加注解,所有错误都被封装

 


@RequestMapping("register")
    //@Valid:校验该对象
    public String register(@Valid User user,BindingResult br,Model model) {    //validate在验证第一个失败后,还会继续验证其他
        //BindingResult br 将验证的错误信息都封装到BindingResult类中
        if(br.hasErrors()) {    //判断有没有错误信息
            List<FieldError> fieldError = br.getFieldErrors();
            Map<String,Object> errorMge = new HashMap<>();
            for (FieldError f : fieldError) {
                //遍历添加错误信息到Map中
                errorMge.put(f.getField(),f.getDefaultMessage());    //f.getField():获取错误字段名;f.getDefaultMessage():预设错误提示信息
            }
            model.addAttribute("errorMge",errorMge);
            return "forward:../register.jsp";    //转发不经过视图解析器
            }
            return "login";
    }

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在el-upload组件中,可以通过before-upload属性来进行文件上传前的校验。您可以在该属性的回调函数中进行相应的逻辑处理。根据您的需求,您可以在before-upload回调函数中实现以下步骤: 1. 获取上传的文件。 2. 对文件内容进行校验,判断是否存在重复的数据。 3. 如果存在重复的数据,弹窗提示是否覆盖。您可以使用element-ui的MessageBox组件来实现弹窗提示,并在确认后继续上传文件。 4. 如果不存在重复的数据,或者用户取消了覆盖操作,可以通过return false来取消文件的上传。 下面是一个示例代码,演示了如何在el-upload中实现文件内容的校验: ```javascript <el-upload class="upload-demo" action="your-upload-url" :before-upload="handleBeforeUpload" > <el-button type="primary">点击上传</el-button> </el-upload> methods: { handleBeforeUpload(file) { // 根据文件类型进行校验,例如只校验xls和xlsx文件 if (file.type !== 'application/vnd.ms-excel' && file.type !== 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') { this.$message.error('只能上传Excel文件'); return false; // 取消文件上传 } // 进行文件内容校验,判断是否存在重复的数据 const isDuplicate = this.checkDuplicateData(file); if (isDuplicate) { // 弹窗提示是否覆盖 this.$confirm('文件中存在重复的数据,是否覆盖?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { // 用户确认覆盖,继续上传文件 this.uploadFile(file); }).catch(() => { // 用户取消覆盖,取消文件上传 return false; }); } else { // 不存在重复的数据,直接上传文件 this.uploadFile(file); } }, checkDuplicateData(file) { // 实现文件内容的校验逻辑,判断是否存在重复的数据 // ... }, uploadFile(file) { // 调用接口上传文件 // ... } } ``` 在上述示例中,handleBeforeUpload方法用于处理文件上传前的逻辑。其中,checkDuplicateData方法用于校验文件内容是否存在重复的数据,uploadFile方法用于调用接口上传文件。根据您的需求,在checkDuplicateData方法中实现文件内容的校验逻辑即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值