• springMVC文件上传、拦截器、数据校验


    1.文件上传
    2.拦截器
    3.数据校验
    4.restful风格
     
    一、文件上传
    上传到本地服务器下,数据库中存放的是图片的路径
    1.导入相关jar包
        commons-filterupload    commons-io
    2.网页端的要求
       <form>提交必须是post方式,编码必须是multipart/form-data,文件上传的文本框必须要有name
        <form action="user/upload" enctype="multipart/form-data" method="post">
            文件上传:<input type="file" name="myfile"/><br/>
            <input type="submit" value="提交"/>
          </form>
    3.在springMVC配置文件上传解析器
            <!-- id修改可能会报错 -->
        <bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!-- 设置文件上大小:字节 -->
            <property name="maxUploadSize"  value="999999999"></property>
        </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>
    创建拦截器
        step1.创建一个类实现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");
                    }
                }   
    
            //preHandle:SpringMVC中的Interceptor是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor.每个Interceptor的调用会依据它的声明顺 序依次执行,而且最先执行的都是Interceptor中的preHandle方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去.该方法的返回值是布尔值Boolean类型,当返回为false时,表示请求结束,后续的Interceptor和Controller都不会再执行;当返回值为true时就会继续调用下一个Interceptor的preHandle方法,如果已经是最后一个Interceptor,就会调用当前请求的Controller方法.
            //postHandle:顾名思义就是在当前请求进行处理之后,也就是Controller方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作.postHandle方法被调用的方向跟preHandle是相反的,也就是说先声明的Interceptor的postHandle方法反而会后执行.
            //afterCompletion:该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行,主要用于进行资源清理工作
            
        step2.创建的拦截器配置到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包
        classmate    hibernate-validator    jboss-logging    validation-api 
    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";
        }
  • 相关阅读:
    Swift高级语法学习总结(转)
    Swift基础语法学习总结(转)
    Go语言语法汇总(转)
    IOS8解决获取位置坐标信息出错(Error Domain=kCLErrorDomain Code=0)(转)
    修正iOS从照相机和相册中获取的图片方向(转)
    解决小米、红米及其他 Android 手机无法在 Mac 下进行真机调试的问题(转)
    mac os 禁止apache httpd自动启动(转)
    rethinkdb的dataexplorer查询使用
    中文 iOS/Mac 开发博客列表(转)
    mac上eclipse用gdb调试(转)
  • 原文地址:https://www.cnblogs.com/BoxMonster/p/11462311.html
Copyright © 2020-2023  润新知