项目框架升级之数据校验及文件上传


一、文件上传

上传到本地服务器下,数据库中存放的是图片的路径

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";
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值