1、Spring MVC 架构以及流程介绍

        1.1流程图

1.2 架构流程

  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响应用户

1.3主要组件说明:

以下组件通常使用框架提供实现:

DispatcherServlet:前端控制器

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

HandlerMapping:处理器映射器

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

HandlAdapter:处理器适配器

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

Handler:处理器(即Controller)

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

由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler(即Controller)。

View Resolver:视图解析器

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

一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

2、前端控制器的配置以及介绍

2.1 web.xml 中配置前端控制器DispatcherServlet

<servlet>  <servlet-name>spring</servlet-name>  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  <init-param>  <param-name>contextConfigLocation</param-name>  <param-value>classpath:conf/spring-mvc.xml</param-value>  </init-param>  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>spring</servlet-name><url-pattern>/</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, 例如:/user/add.action

此方法最简单,不会导致静态资源(jpg,js,css)被拦截。

2、拦截所有,设置为/,例如:/user/add  /user/add.action

此方法可以实现REST风格的url,很多互联网类型的应用使用这种方式。

但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示。需要特殊处理。

3、拦截所有,设置为/*,此设置方法错误,因为请求到Action,当action转到jsp时再次被拦截,提示不能根据jsp路径mapping成功。

3 基于XML的处理器映射器HandlerMapping

HandlerMapping 负责根据request请求找到对应的Handler处理器及Interceptor拦截器,将它们封装在HandlerExecutionChain 对象中给前端控制器返回。

两个常用的映射器实现类:

3.1BeanNameUrlHandlerMapping

BeanNameUrl处理器映射器,根据请求的url与spring容器中定义的bean的name进行匹配,从而从spring容器中找到bean实例。

参考:https://blog.csdn.net/liuhenghui5201/article/details/79510882

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置Handle handle:分发请求 --><bean name="/hello" class="com.xiaohui.controller.HelloController"/><!-- 处理映射器将bean的name作为url进行查找,需要在配置Handle是指定name(即url) --><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /><!-- SimpleControllerHandlerAdapter 是一个处理器适配器,所有的适配都要实现HandlerAdapter --><bean class="org.springframework.web.portlet.mvc.SimpleControllerHandlerAdapter" /><!-- 配置视图渲染器 --><bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"/></beans>

3.2 SimpleUrlHandlerMapping

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

参考:https://blog.csdn.net/liuhenghui5201/article/details/79562152

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  xmlns:p="http://www.springframework.org/schema/p"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:context="http://www.springframework.org/schema/context"  xmlns:mvc="http://www.springframework.org/schema/mvc"  xsi:schemaLocation="  http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-4.2.xsd  http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-4.2.xsd  http://www.springframework.org/schema/mvc  http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd"><!-- 配置Handle handle:分发请求 --><bean id="hellobeanid" class="com.xiaohui.controller.HelloController"/><bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" ><property name="mappings"><props><prop key="/hello1">hellobeanid</prop></props></property></bean><!-- SimpleControllerHandlerAdapter 是一个处理器适配器,所有的适配都要实现HandlerAdapter --><bean class="org.springframework.web.portlet.mvc.SimpleControllerHandlerAdapter" /><!-- 配置视图渲染器 --><bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"/></beans>

4 基于XML的处理器适配器HandlerAdapter

HandlerAdapter会根据适配器接口对后端控制器进行包装(适配),包装后即可对处理器进行执行,通过扩展处理器适配器可以执行多种类型的处理器,这里使用了适配器设计模式。

常用的两个处理器适配器:

4.1 SimpleControllerHandlerAdapter

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

springmvc.xml 中配置参考:3.1 、3.2。

Controller:

package com.xiaohui.controller;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;public class HelloController  implements Controller{@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView modelAndView = new ModelAndView();//添加数据模型modelAndView.addObject("msg", "hello springmvc");//设置逻辑试图名,视图解析器会根据改名字解析到具体的视图页面modelAndView.setViewName("/WEB-INF/jsp/hello.jsp");return modelAndView;}
}

4.2 HttpRequestHandlerAdapter

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

xml配置如下:

<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

Controller 如下:

public class ItemList2 implements HttpRequestHandler {@Overridepublic void handleRequest(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// 商品列表List<Items> itemsList = new ArrayList<Items>();Items items_1 = new Items();items_1.setName("华为XS Pro");items_1.setPrice(5400);items_1.setDetail("华为最新款手机");Items items_2 = new Items();items_2.setName("iPhone P30");items_2.setPrice(0.20);items_2.setDetail("iphone  苹果手机!");itemsList.add(items_1);itemsList.add(items_2);// 填充数据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串");

5、基于注解的映射器和适配器

5.1 Controller:

package com.xiaohui.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class HelloController {@RequestMapping("/hello")public ModelAndView hello(){ModelAndView modelAndView = new ModelAndView();//添加数据模型modelAndView.addObject("msg", "hello springmvc");//设置逻辑试图名,视图解析器会根据改名字解析到具体的视图页面modelAndView.setViewName("/WEB-INF/jsp/hello.jsp");return modelAndView;}
}

组件扫描器:

使用组件扫描器省去在spring容器配置每个controller类的繁琐。使用<context:component-scan自动扫描标记@controller的控制器类,配置如下(组件扫描器是spring中的内容非SpringMvc引入的):

<!-- 扫描controller(controller层注入) 省略了Controller的bean逐个配置  -->
<context:component-scan base-package="com.xiaohui.controller"/>

5.2基于注解的映射器:RequestMappingHandlerMapping

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

从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。

<!--注解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

注解描述:

@RequestMapping:定义请求url到处理器功能方法的映射

5.3基于注解的适配器:RequestMappingHandlerAdapter

注解式处理器适配器,对标记@ResquestMapping的方法进行适配。

从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。

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

5.4 使用注解驱动省略 注解映射器和适配器<mvc:annotation-driven>

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

参考 :

注解形式下的映射器、适配器 https://blog.csdn.net/liuhenghui5201/article/details/79524311

注解驱动下的统一配置 https://blog.csdn.net/liuhenghui5201/article/details/79575462

6、视图解析器

<!-- 对模型视图添加前后缀 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/>  <property name="suffix" value=".jsp"/>  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
</bean><!-- 对静态资源文件的访问-->
<mvc:resources mapping="/common/**" location="/WEB-INF/common/" cache-period="31556926"/>
<mvc:resources mapping="/images/**" location="/WEB-INF/images/" cache-period="31556926"/>
<mvc:resources mapping="/js/**" location="/WEB-INF/js/" cache-period="31556926"/>
<mvc:resources mapping="/css/**" location="/WEB-INF/css/" cache-period="31556926"/>  

InternalResourceViewResolver:支持JSP视图解析

viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl的相关jar 包;

prefix 和suffix:查找视图页面的前缀和后缀,最终视图的址为:

前缀+逻辑视图名+后缀,逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为hello,则最终返回的jsp视图地址 “WEB-INF/jsp/hello.jsp”

Spring MVC 基础及相关概念(基础一)相关推荐

  1. Spring MVC 原理探秘 - 容器的创建过程

    1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的.Spring MVC 可对外提供服务时,说明其已经处于了就绪状态.再次之前,Spring MVC 需要进行 ...

  2. Spring Controller – Spring MVC控制器

    Spring Controller annotation is a specialization of @Component annotation. Spring Controller annotat ...

  3. Java Web系列:Spring MVC基础

    1.Web MVC基础 MVC的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来.就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是一样的方法.框架只能在技术层 ...

  4. 【Java 系列笔记】语法基础 + Spring + Spring MVC + SpringBoot + 数据结构

    Java 强化笔记目录 Java 语言基础 Java 架构师体系课程 一些课程 前端笔记:前端学习笔记 Java 语言基础 回头补基础(此基础非小白)系列,学校教的其实真的就是一些皮毛而已,怕是连门都 ...

  5. SpringMVC基础--spring MVC配置详解

    牧涛 --<-<-<@态度决定一切→_→... 博客园 首页 新闻 新随笔 联系 管理 订阅 随笔- 171  文章- 3  评论- 79  spring MVC配置详解 现在主流的 ...

  6. 视频教程-基础篇:Spring MVC快速开发-Java

    基础篇:Spring MVC快速开发 毕业于清华大学软件学院软件工程专业,曾在Accenture.IBM等知名外企任管理及架构职位,近15年的JavaEE经验,近8年的Spring经验,一直致力于架构 ...

  7. Spring MVC基础知识整理➣国际化和异常处理

    概述 Spring框架为WEB项目提供了国际化以及异常处理机制.所谓的国际化也就是不同国籍,显示不同国籍的语言与符号.异常处理,也就是能够捕获WEB项目下的所有异常信息,并能处理记录这些异常信息机制. ...

  8. Spring MVC 基础注解之@RequestMapping、@Controller、(二)

    我现在学的是spring4.2 今天主要学习了Spring MVC注解 引入注解可以减少我们的代码量,优化我们的代码. @Controller:用于标识是处理器类: @RequestMapping:请 ...

  9. Spring MVC 基础

    Spring MVC 项目案件见附件 导包 配置web.xml启动Spring MVC <?xml version="1.0" encoding="UTF-8&qu ...

最新文章

  1. 简要叙述计算机软件系统的组成,【计组第一章+答案】概论
  2. 利用SQL对数据进行清洗处理
  3. 设置Java EE 6开发环境
  4. makefile编译问题记录
  5. 纯js监听滚动条到底部(vue版)
  6. linux下查看mysql数据库的字段类型_系统运维|[小白技巧]如何在Linux上检查MySQL数据表的存储引擎类型...
  7. redission分布式锁
  8. android run缓存报错,AndroidStudio常见错误收集(windows版)
  9. 『TensorFlow』读书笔记_TFRecord学习
  10. IP转换器 V2.6
  11. 在线生成透明ICO图标
  12. dota英雄技能快捷键大全
  13. 家庭局域网_组建家庭无线局域网需要哪些硬件设备?
  14. 电影票房预测-kaggle项目Python项目
  15. 量子计算与区块链抗量子算法
  16. 2021天梯赛L1-079 天梯赛的善良 题解
  17. Python123第六章答案
  18. 可变3D卷积|| Deformable 3D Convolution for Video Super-Resolution
  19. 软件开发流程与项目管理
  20. 数据库云管平台 zCloud v3.5发布,智能化和国产数据库支持能力再增强

热门文章

  1. Spring.NET学习笔记15——AOP的配置(基础篇) Level 200
  2. 望图知意-Yahoo VS 3721
  3. Hibernate的发展和特点以及Hibernate的工作原理简介
  4. SpringBoot集成MyBatis-Plus框架详细方法
  5. 分布式session的6种解决方案
  6. 华为私有云的搭建方案_华为云搭建word press
  7. html中a标签根据一个参数跳转不同的页面
  8. mysql 存储微信昵称乱码_MYSQL 保存微信昵称特殊字符报错解决方法-设置编码集为utf8mb4的方法...
  9. python没有上方工具栏_PyQt5快速上手基础篇8-菜单栏、工具栏和状态栏
  10. 《从缺陷中学习C/C++》——6.3 数组传参时的sizeof