avatar

目录
SpringMVC笔记(一)

参考:【itheima】

[toc]

概述

1. 表现层的框架,是 Spring 框架的一部分,可以从 Spring的整体结构中看得出来
2. MVC
    - C 控制器 controller 
        - 作用:接收请求,响应处理结果,没有业务逻辑
    - M 模型
        pojo service dao
    - V 视图 View 将模型数据展示给用户

web MVC:
SpringMVC_01

Spring web mvc 架构

Spring mvc 架构图

SpringMVC_02

架构流程

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

组件说明

-- DispatcherServlet:前端控制器 
    - 用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制 的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的 耦合性。

-- HandlerMapping:处理器映射器 
    - HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实 现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

-- Handler:处理器
    -Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下 Handler对具体的用户请求进行处理。

-- HandlAdapter:处理器适配器 
    - 通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更 多类型的处理器进行执行。

-- View Resolver:视图解析器
    - View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物 理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页 面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、 freemarkerView、pdfView等。

SpringMVC快速开始

开始案例

-- jar包:
    spring所有jar包和依赖包


-- 配置前端控制器
    <servlet> 
        <servlet-name>springmvc</servlet-name> 
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name> 
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name> 
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    <!--
        load-on-startup:表示servlet随服务启动; 
        url-pattern:*.action的请交给DispatcherServlet处理。
        contextConfigLocation:指定springmvc配置的加载位置,
            如果不指定则默认加 载WEB-INF/[DispatcherServlet 的Servlet 名字]-servlet.xml。
    -->


-- Servlet 拦截方式
    1、拦截固定后缀的url,比如设置为 *.do、*.action, 
        -- 此方法最简单,不会导致静态资源(jpg,js,css)被拦截。
    2、拦截所有,设置为/
        -- REST风格的url
        -- 但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示。需要特殊处理


-- springmvc 配置文件
    <!--
        Springmvc默认加载WEB-INF/[前端控制器的名字]-servlet.xml,也可以在前端控制器定义处指定加载的配置文件
    -->
    <init-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value>classpath:springmvc.xml</param-value> 
    </init-param>


-- 配置HandlerAdapter
    springmvc.xml 文件配置如下:
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>   
    <!--
        SimpleControllerHandlerAdapter:即简单控制器处理适配器,
        所有实现了 org.springframework.web.servlet.mvc.Controller 接口的Bean
        作为 Springmvc的后端控制器。
    -->


-- Handler开发

    public class ItemList1 implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
            //商品列表
            List<Items> itemsList = new ArrayList<Items>();

            Items items_1 = new Items(); 
            items_1.setName("联想笔记本"); 
            items_1.setPrice(6000f); 
            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 modelAndView = new ModelAndView();
            //填充数据
            modelAndView.addObject("itemsList", itemsList); 
            //视图 ModelAndView:包含了模型数据及逻辑视图名
            modelAndView.setViewName("order/itemsList");
            return modelAndView; 
        }
    }


-- 配置文件

    springmvc.xml 文件配置如下:

    <beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/contex t"
        xmlns:aop="http://www.springframework.org/schema/aop" 
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
              http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
              http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
              http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
              http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

            <!-- 处理器映射器-->
            <!-- 根据bean的name进行查找Handler 将action的url配置在bean的 name中 -->
            <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

            <!--
                BeanNameUrlHandlerMapping:表示将定义的Bean名字作为请求的url,
                需要将编写的 controller在spring容器中进行配置,且指定bean的name为请求的url,且必须以.action 结尾

            -->

            <!-- controller配置 -->
            <bean name="/items1.action" id="itemList1" class="cn.itcast.springmvc.controller.first.ItemList1"/>

            <!--
                前边配置的处理器映射器为BeanNameUrlHandlerMapping, 
                如果请求的URL 为“上下文/items1.action”将会成功映射到ItemList1控制器。
            -->

            <!-- 配置视图解析器 -->
            <!-- ViewResolver -->
            <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
                <property name="prefix" value="/WEB-INF/jsp/"/>
                <property name="suffix" value=".jsp"/>
            </bean>

            <!--
                InternalResourceViewResolver: 支持JSP视图解析
                viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl 的相关jar 包;
                prefix 和suffix:查找视图页面的前缀和后缀,最终视图的址为: 前缀+逻辑视图名+后缀
                    逻辑视图名需要在controller中返回ModelAndView指定
                    比如逻辑 视图名为hello,则最终返回的jsp视图地址 “WEB-INF/jsp/hello.jsp”
            -->
    </beans>


-- 视图开发
    jsp...
    部署在tomcat测试

小结

-- DispatcherServlet:
    DispatcherServlet 创建时会默认从DispatcherServlet.properties文件加载springmvc所用的各各组件

-- HandlerMapping 处理器映射器

    -- BeanNameUrlHandlerMapping
        - 根据请求的url与spring容器中定义的bean的name进行 匹配,从而从 spring 容器中找到 bean 实例

        <!—beanName Url映射器 -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMappin g"/>



    -- SimpleUrlHandlerMapping 
        -- simpleUrlHandlerMapping 是 BeanNameUrlHandlerMapping 的增强版本,它可以将 url 和 处理器 bean 的 id 进行统一映射配置

        <!—简单url映射 --> 
        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <props>
                    <prop key="/items1.action">controller的bean id</prop> 
                    <prop key="/items2.action">controller的bean id</prop>
                    </props>
               </property>
        </bean>       


-- HandlerAdapter 处理器适配器

    -- HandlerAdapter 会根据适配器接口对后端控制器进行包装(适配)

    1. SimpleControllerHandlerAdapter
            SimpleControllerHandlerAdapter简单控制器处理器适配器,
            所有实现了 org.springframework.web.servlet.mvc.Controller 接口的Bean通过此适配器进行适配、 执行。

            配置如下:
             <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

    2. HttpRequestHandlerAdapter

        -- HttpRequestHandlerAdapter,http请求处理器适配器,
            所有实现了 org.springframework.web.HttpRequestHandler 接口的Bean通过此适配器进行适配、执行

        -- 适配器配置如下:
        <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

        -- Controller实现如下:

        public class ItemList2 implements HttpRequestHandler {
            @Override
            public void handleRequest(HttpServletRequest request, HttpServletResponse response) 
                throws ServletException,IOException {

                //...

                // 填充数据
                request.setAttribute("itemsList", itemsList);
                // 视图 
                request.getRequestDispatcher("/WEB-INF/jsp/order/itemsList.jsp").forward(request, response);
            } 

            /*
                从上边可以看出此适配器器的handleRequest方法没有返回ModelAndView,
                可通过 response修改定义响应内容,比如返回json数据:
                response.setCharacterEncoding("utf-8"); 
                response.setContentType("application/json;charset=utf-8"); 
                response.getWriter().write("json串");
            */            
        }             

注解Mapper和Adapter

-- Controller 的代码:

    @Controller
    public class ItemList3 {    //普通java类,没有继承
        @RequestMapping("/queryItem.action")
        public ModelAndView queryItem() {

            //... 

            // 创建modelAndView准备填充数据、设置视图 
            ModelAndView modelAndView = new ModelAndView();
            // 填充数据
            modelAndView.addObject("itemsList", itemsList); 
            // 视图 
            modelAndView.setViewName("order/itemsList");
            return modelAndView;
        }


-- 组件扫描器
    -- 扫描标记@controller 的控制器类,不用配置bean了

     <!-- 扫描controller注解,多个包中间使用半角逗号分隔 --> 
     <context:component-scan base-package="cn.itcast.springmvc.controller.first"/>   


-- RequestMappingHandlerMapping

        -- 注解式处理器映射器,对类中标记@ResquestMapping的方法进行映射
            根据 ResquestMapping 定义的 url 匹配 ResquestMapping 标记的方法,
            匹配成功返回 HandlerMethod 对象给前端控制器,

        -- 推荐使用 RequestMappingHandlerMapping 完成注解式处理器映射

        -- 配置如下:

        <!--注解映射器 -->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
        <!--
            @RequestMapping:定义请求 url 到处理器功能方法的映射
        -->


-- RequestMappingHandlerAdapter

        -- 注解式处理器适配器,对标记@ResquestMapping 的方法进行适配。
        -- 推荐使用RequestMappingHandlerAdapter 完成注解式处理器适配。
        -- 配置如下:

        <!--注解适配器 -->
         <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>


--  <mvc:annotation-driven>

        -- springmvc 使用 <mvc:annotation-driven> 自动加载
            RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter , 
        -- 可用在 springmvc.xml 配置文件中使用 
            <mvc:annotation-driven> 替代注解处理器和适配器的配置。

springmvc 处理流程源码分析

1. 用户发送请求到 DispatherServlet 前端控制器
2. DispatherServlet 调用 HandlerMapping(处理器映射器)根据 url 查找 Handler
3. DispatherServlet 调用 HandlerAdapter(处理器适配器)对 HandlerMapping 找到 Handler 进行包装、执行。HandlerAdapter 执行 Handler 完成后,返回了一个 ModleAndView(springmvc 封装对象)
4. DispatherServlet 拿着 ModelAndView 调用 ViewResolver(视图解析器)进行视图解 析,解析完成后返回一个 View(很多不同视图类型的 View)
5. DispatcherServlet 进行视图渲染,将 Model 中数据放到 request 域,在页面展示
文章作者: Machine
文章链接: https://machine4869.gitee.io/2018/04/20/15326654830963/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 哑舍
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论