• 【SpringMVC】入门


    一、概述

    1.1 SpringMVC是什么

    • SpringMVC是Spring的一个模块,提供web层解决方案(基于mvc设计架构)

    1.2 MVC在b/s系统的应用

    MVC是一个设计模式,在b/s系统的应用:

    • 1、用户发起request请求至控制器(Controller) 控制接收用户请求的数据,委托给模型进行处理
    • 2、控制器通过模型(Model)处理数据并得到处理结果 模型通常是指业务逻辑
    • 3、模型处理结果返回给控制器
    • 4、控制器将模型数据在视图(View)中展示,web中模型无法将数据直接在视图上显示,需要通过控制器完成。如果在C/S应用中模型是可以将数据在视图中展示的。
    • 5、控制器将视图response响应给用户,通过视图展示给用户要的数据或处理结果。

    1.3 SpringMVC 原理

    • 第一步:用户发起request请求,请求至DispatcherServlet前端控制器
    • 第二步:DispatcherServlet前端控制器请求HandlerMapping处理器映射器查找Handler
      • DispatcherServlet:前端控制器,相当于中央调度器,各各组件都和前端控制器进行交互,降低了各各组件之间耦合度。
    • 第三步:HandlerMapping处理器映射器,根据url及一些配置规则(xml配置、注解配置)查找Handler,将Handler返回给DispatcherServlet前端控制器
    • 第四步:DispatcherServlet前端控制器调用适配器执行Handler,有了适配器通过适配器去扩展对不同Handler执行方式(比如:原始servlet开发,注解开发)
    • 第五步:适配器执行Handler,Handler是后端控制器,当成模型。
    • 第六步:Handler执行完成返回ModelAndView
      • ModelAndView:SpringMVC的一个对象,对Model和view进行封装。
    • 第七步:适配器将ModelAndView返回给DispatcherServlet
    • 第八步:DispatcherServlet调用视图解析器进行视图解析,解析后生成view视图解析器根据逻辑视图名解析出真正的视图。
      • View:SpringMVC视图封装对象,提供了很多view,jsp、freemarker、pdf、excel。。。
    • 第九步:ViewResolver视图解析器给前端控制器返回view
    • 第十步:DispatcherServlet调用view的渲染视图的方法,将模型数据填充到request域 。
    • 第十一步:DispatcherServlet向用户响应结果(jsp页面、json数据。。。。)

    • DispatcherServlet:前端控制器,由SpringMVC提供

    • HandlerMappting:处理器映射器,由SpringMVC提供

    • HandlerAdapter:处理器适配器,由SpringMVC提供

    • !!!Handler:处理器,需要程序员开发

    • ViewResolver:视图解析器,由SpringMVC提供

    • !!!View:真正视图页面需要由程序编写

    二、入门程序

    2.1 需求

    • 实现商品列表查询

    2.2 引入依赖

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.5.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>3.0-alpha-1</version>
        <scope>provided</scope>
    </dependency>
    

    2.3 前端控制器

    • 在web.xml中配置
    <!-- 前端控制器 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 加载springmvc配置 -->
        <init-param>
               <param-name>contextConfigLocation</param-name>
        <!-- 配置文件的地址
            如果不配置contextConfigLocation,
            默认查找的配置文件名称classpath下的:servlet名称+"-serlvet.xml"即:springmvc-serlvet.xml
         -->
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- 
        可以配置/ ,此工程 所有请求全部由springmvc解析,此种方式可以实现 RESTful方式,需要特殊处理对静态文件的解析不能由springmvc解析
        可以配置*.do或*.action,所有请求的url扩展名为.do或.action由springmvc解析,此种方法常用 
        不可以/*,如果配置/*,返回jsp也由springmvc解析,这是不对的。  
         -->
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    
    

    2.4 springmvc.xml

    • 在springmvc.xml中配置SpringMVC架构三大组件(处理器映射器、适配器、视图解析器)

    2.5 配置处理器映射器

    • 在springmvc.xml中配置
    • BeanNameUrlHandlerMapping: 根据请求url(XXXX.action)匹配spring容器bean的 name
    • 找到对应的bean(程序编写的Handler)
    <!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
    • 所有处理器映射器都实现HandlerMapping接口。

    2.6 处理器适配器

    • 在springmvc.xml中配置
     <bean      class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 
        
    
    • 所有的适配器都是实现了HandlerAdapter接口。
    • 程序编写Handler根据适配器的要求编写。

    • SimpleControllerHandlerAdapter适配器要求

    • 通过源码中supports方法知道Handler必须要实现哪个接口,此SimpleControllerHanlderAdapter中需要实现Controller接口

    public boolean supports(Object handler)
    /*    */   {
    /* 42 */     return handler instanceof Controller;
    /*    */   }
    

    2.7 Handler编写

    • 由上一步可知,需要实现Controller接口:
    public class ItemController1 implements Controller {
        
        @Override
        public ModelAndView handleRequest(HttpServletRequest request,
                HttpServletResponse response) throws Exception {
        
            // 使用静态数据将商品信息列表显示在jsp页面
            // 商品列表
            List<Items> itemsList = new ArrayList<Items>();
        
            Items items_1 = new Items();
            items_1.setName("联想笔记本");
            items_1.setPrice(6000f);
            items_1.setCreatetime(new Date());
            items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
        
            Items items_2 = new Items();
            items_2.setName("苹果手机");
            items_2.setPrice(5000f);
            items_2.setDetail("iphone6苹果手机!");
        
            itemsList.add(items_1);
            itemsList.add(items_2);
            
            ModelAndView modelAndView = new ModelAndView();
            //将数据填充到request
    //      request.setAttribute("itemsList", itemsList);
            modelAndView.addObject("itemsList", itemsList);
            //指定转发的jsp页面
            modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp");
            return modelAndView;
        }
    
    }
    
    

    2.8 配置Handler

    • 在springmvc.xml配置Handler由spring管理Handler。
     <!-- 配置Handler 由于使用了BeanNameUrlHandlerMapping处理映射器,name配置为url -->
            <bean id="itemController1" name="/itemList.action"
                class="com.hao.controller.ItemController1" />
    

    2.9 配置视图解析器

    • 配置视图解析,能够解析jsp视图:
    <!-- 配置视图解析器 要求将jstl的包加到classpath -->
    <!-- ViewResolver -->
    <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    
    </bean>
    
    

    三、其它非注解处理器映射器和适配器

    3.1 映射器

    1. BeanNameUrlHandlerMapping(映射器)(上面例子已讲解)

    • 根据请求url(XXXX.action)匹配spring容器bean的 name
    • 找到对应的bean(程序编写的Handler)

    2. SimpleUrlHandlerMapping(映射器)

    • 注意:在springmvc.xml配置了多个处理器映射器,多个处理器映射器可以共存。
    <bean id="itemController1" name="/itemList.action"
          class="com.hao.controller.ItemController1" />
      
    <!--简单url映射 集中配置bean的id对应 的url -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/itemsTest1.action">itemController1</prop>
                <prop key="/itemsTest2.action">itemController2</prop>
            </props>
        </property>
    </bean>
    
    

    3.2 适配器

    1. SimpleControllerHandlerAdapter(适配器)(上面例子已讲解)

    • 要求程序编写的Handler(Controller)需要实现 Controller接口。

    2. HttpRequestHandlerAdapter(适配器)

    • 在springmvc.xml配置:HttpRequestHandlerAdapter
    • 要求Handler 实现 HttpRequestHandler接口

    • 开发Handler

    public class ItemController2 implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        // 使用静态数据将商品信息列表显示在jsp页面
        // 商品列表
        List<Items> itemsList = new ArrayList<Items>();
    
        Items items_1 = new Items();
        items_1.setName("联想笔记本");
        items_1.setPrice(6000f);
        items_1.setCreatetime(new Date());
        items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
    
        Items items_2 = new Items();
        items_2.setName("苹果手机");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6苹果手机!");
    
        itemsList.add(items_1);
        itemsList.add(items_2);
        
        request.setAttribute("itemsList", itemsList);
        //转发到jsp页面
        request.getRequestDispatcher("/WEB-INF/jsp/itemsList.jsp").forward(request, response);
        
       }
    }
    
    

    四、注解映射器和适配器

    4.1 注解映射器

    • spring3.1之前默认加载映射器是 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
    • 3.1之后要使用: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
    • springmvc.xml中配置RequestMappingHandlerMapping:使用RequestMappingHandlerMapping需要在Handler 中使用@controller标识此类是一个控制器,使用@requestMapping指定Handler方法所对应的url

    4.2 注解适配器

    • spring3.1之前默认加载映射器是 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
    • 3.1之后要使用: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
    • RequestMappingHandlerAdapter,不要求Handler实现任何接口,它需要和 RequestMappingHandlerMapping注解映射器配对使用,主要解析Handler方法中的形参。

    4.3 注解开发Hanlder

    @Controller
    public class ItemController3 {
        //商品列表,@RequestMapping中url建议和方法名一致,方便开发维护
        @RequestMapping("/queryItems")
        public ModelAndView queryItems(){
            
        // 使用静态数据将商品信息列表显示在jsp页面
        // 商品列表
        List<Items> itemsList = new ArrayList<Items>();
        
        Items items_1 = new Items();
        items_1.setName("联想笔记本");
        items_1.setPrice(6000f);
        items_1.setCreatetime(new Date());
        items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
        
        Items items_2 = new Items();
        items_2.setName("苹果手机");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6苹果手机!");
        
        itemsList.add(items_1);
        itemsList.add(items_2);
            
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("itemsList", itemsList);
        //指定逻辑视图名
        modelAndView.setViewName("itemsList");
        
        return modelAndView;
        }
        //商品添加
            
        //商品删除 
        
    }
    
    

    4.4 配置Handler

    • 建议使用组件扫描,组件扫描可以扫描@Controller@Service@component@Repsitory
    <!-- 注解的handler,单个配置 -->
        <!-- <bean class="com.hao.controller.ItemController3"/> -->
        <!-- 使用spring组件扫描 -->
        <context:component-scan base-package="com.hao.controller" />
    

    五、注解开发详解

    5.1 @RequestMapping

    • 设置方法对应的url(完成url映射)
    • 窄化请求映射
      • 在class上定义根路径
      • 好处:更新规范系统 的url,避免 url冲突。
    • 限制http请求的方法
      • 通过requestMapping限制url请求的http方法,
      • 如果限制请求必须是post,如果get请求就抛出异常

    5.2 关于Controller方法返回值

    • 返回ModelAndView
    • 返回字符串
      • 如果Controller方法返回jsp页面,可以简单将方法返回值类型定义 为字符串,最终返回逻辑视图名。
    • 返回void

    5.3 redirect重定向

    • 如果方法重定向到另一个url,方法返回值为“redirect:url路径”
    • 使用redirect进行重定向,request数据无法共享,url地址栏会发生变化的。

    5.4 forward转发

    • 使用forward进行请求转发,request数据可以共享,url地址栏不会。
    • 方法返回值为“forward:url路径”

    5.5 @ModelAttribute

    • 需求:商品类别信息在商品信息页面显示。
    //单独将商品类型的方法提出来,将方法返回值填充到request,在页面显示
        @ModelAttribute("itemsType")
        public Map<String, String> getItemsType()throws Exception{
            
            HashMap<String, String> itemsType = new HashMap<String,String>();
            itemsType.put("001", "数码");
            itemsType.put("002", "服装");
            return itemsType;
            
        }
    
    商品类别:
    <select>
        <c:forEach items="${itemsType }" var="item">
                <option value="${item.key }">${item.value }</option>    
        </c:forEach>
    
    </select>
    
    
    • 使用@ModelAttribute将公用的取数据的方法返回值传到页面,不用在每一个controller方法通过Model将数据传到页面。

    5.6 @RequestBody和@ResponseBody

    • @RequestBody:将请求的json数据转成java对象
    • @ResponseBody:将java对象转成json数据输出。

    七、springmvc和struts的区别

    • springmvc是通过方法的形参接收参数,在使用时可以以单例方式使用,建议使用单例。
    • struts是通过成员变量接收参数,在使用时必须以多例方式使用。
    • springmvc是基于方法开发,struts基于类开发。
    • springmvc将一个请求的Method和Handler进行关联绑定,一个method对应一个Handler。
    • springmvc开发以方法为单位进行开发,方法更帖进service(业务方法)。
    • 经过实际测试,发现struts标签解析速度比较慢,建议在实际开发时使用jstl。

    六、小结

    • a. DispatcherServlet:前端控制器,相当于中央调度器,可以降低组件之间的耦合度。
    • b. HandlerMapping:处理器映射器,负责根据url查找Handler
    • c. HandlerAdapter:处理器适配器,负责根据适配器要求的规则去执行处理器。可以通过扩展适配器支持不同类型的Handler。
    • d. viewResolver:视图解析器,根据逻辑视图名解析成真正的视图,
    <!-- 配置视图解析器 要求将jstl的包加到classpath -->
    <!-- ViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/jsp/" />
      <property name="suffix" value=".jsp" />
    </bean>
    

    真正视图地址==前缀+逻辑视图名+后缀

    1. DispatcherServlet通过HandlerMapping查找Handler
    2. DispatcherServlet通过适配器去执行Handler,得到ModelAndview
    3. 视图解析,视图解析完成得到一个view
    4. 进行视图渲染 将Model中的数据 填充到request域。
  • 相关阅读:
    Haproxy图解
    Keeplived 配制图解
    日志文件 的管理 logrotate 配置
    Haproxy+MYSQL 负载均衡 原创
    MySQL内存----使用说明全局缓存+线程缓存) 转
    MYSQL内存--------启动mysql缓存机制,实现命中率100% 转
    MYSQL SQL 审核工具 (inception安装步骤)
    MHA手动切换 原创4 (非交互式切换)
    MHA手动切换 原创2 (主参与复制)
    MHA手动在线切换主 原创3(主不参与复制)
  • 原文地址:https://www.cnblogs.com/haoworld/p/springmvc-ru-men.html
Copyright © 2020-2023  润新知