zoukankan      html  css  js  c++  java
  • Spring MVC

    Model-View-Controller 开发web的通用框架

    MVC的核心思想是业务数据抽取同业务数据呈现相分离

    View:视图层
    为用户提供UI重点关注数据的呈现

    Model:模型层
    业务数据的信息表示,关注支撑业务的信息构成,通常是多个业务实体的组合。

    Controller:控制层
    调用业务逻辑产生合适的数据(model),传递数据给视图层用于呈现。

    View--- DispacherServlet-(model)-Controller

    基本概念

    DispacherServlet
    HandlerAdapter(适配器)
    HandlerInterceptor(拦截器):给在前端控制器调用Controller方法之前、之后提供操作方法:preHandle()、postHandle()、afterCompletion()
    HandlerMapping(前段控制器与Controller之间的映射关系、wrap controller with HandlerInterceptor
    HandlerExecutionChain
    preHandle -->Controller method-->postHandle-->afterCompletion(使用了java的反射机制)
    ModelAndView(ModelMap):Model的具体表现
    ViewResolver(视图解析器):告诉DispacherServlet要用哪一个视图来进行视图的呈现
    View:jstl、jsp、tiles等,视图

     Spring MVC的工作原理是怎样的?
    答:Spring MVC的工作原理如下图所示:
    这里写图片描述
    ① 客户端的所有请求都交给前端控制器DispatcherServlet来处理,它会负责调用系统的其他模块来真正处理用户的请求。
    ② DispatcherServlet收到请求后,将根据请求的信息(包括URL、HTTP协议方法、请求头、请求参数、Cookie等)以及HandlerMapping的配置找到处理该请求的Handler(任何一个对象都可以作为请求的Handler)。
    ③在这个地方Spring会通过HandlerAdapter对该处理器进行封装。
    ④ HandlerAdapter是一个适配器,它用统一的接口对各种Handler中的方法进行调用。
    ⑤ Handler完成对用户请求的处理后,会返回一个ModelAndView对象给DispatcherServlet,ModelAndView顾名思义,包含了数据模型以及相应的视图的信息。
    ⑥ ModelAndView的视图是逻辑视图,DispatcherServlet还要借助ViewResolver完成从逻辑视图到真实视图对象的解析工作。
    ⑦ 当得到真正的视图对象后,DispatcherServlet会利用视图对象对模型数据进行渲染。
    ⑧ 客户端得到响应,可能是一个普通的HTML页面,也可以是XML或JSON字符串,还可以是一张图片或者一个PDF文件。


    Maven

    POM(Project Object Model)pom.xml文件
    Dependency
    Coordinates(坐标):groupId、artifactId、version、packaging四个属性确定唯一坐标

    DispacherServlet 上下文

    启用Spring基于annotation的DI,使用户可以在spring MVC中使用Spring的强大功能。
    激活@Required @Autowired,等标注
    <context:annotation-config/>

    <context:component-scan>

    扩充了注解驱动,可以请求参数绑定到控制器参数
    <mvc:annotation-driven/>

    静态资源处理
    <mvc:resource mapping="" location=""/>

    有关文件上传的配置,添加如下bean:
    org.springframework.web.multipart.commons.CommonsMultipartResolver

    ContentNegotiationViewResolver:设置不同的视图呈现

    jetty
    mvn jetty:run

    @RequestMapping 设置url

    Controller中的三种方式获得参数

    (1)@RequestParam

    @RequestMapping(value="abc",method=RequestMethod.GET)
    public String method(@RequestParam("param")String param,Model model){
    logger.info("param:{}",param);
    model.addAttribute("param","param");
    return "show";
    }
    //该Controller的访问路径:/root/abc?param=123

    (2)@PathVariable

    @RequestMapping(value="/abc/{param}",method=RequestMethod.GET)
    public String method(@PathVariable String param,Map<String,Object> model){
    logger.info("param:{}"+param);
    model.put("param","param");
    return "show";
    }
    //该Controller的访问路径:/root/abc/param

    (3)HttpSeverletRequest

    @RequestMapping(value="abc",method=RequestMethod.GET)
    public String method(HttpSeverletRequest request){
    String param = request.getParameter("param");
    logger.info("param:{}"+param);
    request.setAttribute("param","param");
    return "redirect:show";//重定向or请求转发
    }
    //该Controller的访问路径:/root/abc?param=123

    redirect请求重定向

    ReflectionToStringBuilder.toString(Object)//可打印出一个类

    文件上传的jsp部分
    <form method="post" action="/root/doUpload" enctype="multipart/form-data">
    <input type="file" name"file"/>
    <inpute type="submit"/>
    </form>
    Controller部分
    @RequestMapping(value="doUpload",method=RequestMethod.post)
    public String doUpload(@RequestParam("file")MultipartFile file){
    if(!file.isEmpty()){
    FileUtils.copyInputStreamToFile(file.getInputStream(), new File("/Users/macbookair/Desktop"+System.currentTimeMillis()+file.getOriginalFilename()));
    }
    return "success";
    }


    jspViewjsonView

    让页面以Json格式呈现的方法
    (1)给方法的返回类型前加注解@ResponseBody
    (2)让方法的返回类型设置为ResponseEntity<Object> //Object为返回的类(实际模型数据)

    @RequestMapping(value="/abc/{courseId}",method=RequestMethod.GET)
    public ResponseEntity<Course> getCourseInJson(@PathVariable Integer courseId){
    Course course = courseService.getCoursebyId(courseId);
    return new ResponseEntity<Course>(course,HttpStatus.OK);
    }

  • 相关阅读:
    如何在数据库某一列数据的前面或者后面增加字符
    jmeter分布式测试教程和远程的代理机无法连接网络的问题解决方法
    jmeter和jdk的安装教程
    第十周总结
    第九周总结
    第八周总结
    企业应用架构模式-阅读笔记01
    需求征集系统进度08
    需求征集系统进度07
    第七周总结
  • 原文地址:https://www.cnblogs.com/Rage-Leila/p/8728167.html
Copyright © 2011-2022 走看看