day19-20-Spring MVC原理(千峰逆战)

<meta charset="utf-8">

1、Spring MVC与Structs2的区别

  • 框架机制:Structs2采用Filter实现,Spring MVC则采用Servlet实现
  • Structs2是类级别的拦截,每次请求都会创建一个Action,一个Action对应一个request与response上下文。Spring MVC是方法级别的拦截,一个方法对应一个request上下文
  • Structs2的属性参数是让多个方法共享的。Spring MVC一个方法对应一个request上下文,所以方法之间是独立的,独享request与response数据,方法之间不共享变量。
  • Struct2只能多例开发,Spring MVC可以单例开发
  • Spring MVC集成了Ajax,使用非常方便,只需要一个注解@ResponseBody就可以实现,然后直接返回响应文本即可。Structs2也继承了Ajax,但是Action中处理时一般必须安装插件或者自己写代码集成,使用起来相对不便。
  • Sttucts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,Spring MVC实现了零配置,基于方法的拦截,加载一次单例模式注入,所以开发效率和性能高于Structs2
  • Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。
  • Spring MVC和Spring是无缝的,项目的管理和安全上也比Structs2高,Structs2配置起来比Spring MVC麻烦。

2、Spring MVC原理

1.用户发送请求至前端控制器DispatcherServlet(也叫中央处理器).
2.DispatcherServlet收到请求调用HandlerMapping处理器映射器
3.处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet.
4.DispatcherServlet调用HandlerAdapter处理器适配器。
5.HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6.Controller执行完成返回ModelAndView.
7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet.
8.DisPatcherServlet将ModelAndView传给ViewResolver视图解析器。
9.ViewReslover解析后返回具体View.
10.DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11.DispatcherServlet响应用户。

image

3、结合用户的登录请求解释Spring MVC原理

用户在前端页面填写好账号与密码后发送请求(/login)到前端控制器DispatcherServlet,DispatcherServlet收到请求后根据url调用HandlerMapping处理器映射器,处理器映射器根据xml配置或者注解查找到具体的处理器,比如login方法,然后生成这个类的对象一并返回给前端控制器,前端控制器拿到这个处理器对象后调用HandlerAdapter处理器适配器,由它去调用具体的处理器(Controller),在Controller中的login方法中拿到当前用户的账号密码,调用service方法,service层中又调用dao层,dao层根据账号密码在数据库中进行查询,并返回是否查找到的结果,一层一层返回给Controller,控制器根据查询结果返回不同的ModelAndView,存放的是虚拟的View,查询成功返回主页虚拟视图,查询失败返回当前页面的虚拟视图和错误信息,处理器适配器再将ModelAndView返回给前端控制器,前端控制器将ModelAndView传给ViewResolver视图解析器,两种不同的ModelAndView经过视图解析器解析后返回具体的View。前端控制器再根据具体的View进行视图渲染最后将渲染后的视图返回给用户。

4、文件上传

  • 添加依赖

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.4</version>
    </dependency>
    
    
  • 配置xml文件

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="maxUploadSize" value="81920"/>
        <property name="uploadTempDir" value="temp"/>
    </bean>
    
    

第一个属性指定的默认编码是UTF-8,第二个属性指定了最大上传文件的大小,单位是byte,第三个指定了上传文件的缓存路径。

PostMapping("/uploadFile")
public String uploadFile(@RequestParam("userName") String userName, @RequestParam("password") String password, @RequestParam("file")MultipartFile file) throws IOException {
    System.out.println("userName = "+userName);
    System.out.println("password = "+password);

    if(!file.isEmpty()){
        System.out.println("original fileName"+file.getOriginalFilename());
        File dest = new File("d:\\ceshi\\"+file.getOriginalFilename());
        file.transferTo(dest);
        BufferedReader br = new BufferedReader(new FileReader(dest));
        String str;
        while((str=br.readLine())!=null){
            System.out.println(str);
        }
        br.close();
    }
    return "redirect:/main/employees";
}

Spring MVC上传文件特别简单,最重要的一步是file.transferTo(dest)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • SpringMVC的工作原理图: SpringMVC的工作原理图: SpringMVC流程 1、 用户发送请求至前...
    我不饿我不想吃东西阅读 862评论 0 1
  • 1.Spring背景 1.1.Spring四大原则: 使用POJO进行轻量级和最侵入式开发; 通过依赖注入和基于借...
    嗷大彬彬阅读 833评论 0 2
  • 对于java中的思考的方向,1必须要看前端的页面,对于前端的页面基本的逻辑,如果能理解最好,不理解也要知道几点。 ...
    神尤鲁道夫阅读 851评论 0 0
  • Spring MVC一、什么是 Spring MVCSpring MVC 属于 SpringFrameWork 的...
    任任任任师艳阅读 3,454评论 0 32
  • 1、Spring MVC请求流程 (1)初始化:(对DispatcherServlet和ContextLoderL...
    拾壹北阅读 1,987评论 0 12