MVC 和Spring MVC
我们都知道常说的MVC指的是
Model + View + Controller(数据模型 + 视图+ 控制器)
三层架构指的是:(展现层 + 应用层 + 数据访问层)

但是Spring MVC却不是指的上面的三层架构而是将展现层拆分成了新的三层架构

M :指的是数据模型(Model类)
V :指的是视图页面(JSP,Thymeleaf等)
C :指的是控制器(@Controller注解的类)

1.配置项目支持SpringMVC
除了需要在pom.xml中依赖对应的jar包,我们还需要完善web项目的目录结构,在代码层面上当我们使用idea创建一个支持SpringMVC的web项目的时候,会自动生成一个继承SpringbootServletInitializer的类,用来提供配置Servlet3.0配置的接口,替代web.xml的位置
如果项目没有实现这个类,那么久必须要使用web.xml进行相关的web项目配置

DispatcherServlet :分发器 用来将请求对应到指定的view视图

2.常用注解
@Controller: 声明一个控制器
@RequestMapping: 映射web请求(将方法和url对应起来)
@ResponseBody: 将返回值放到response中,而不是映射到对应的页面上
@RequestBody: 允许请求的参数放到request体中,而不是直接链接到URL后面、
@PathValiable: 用来接收参数,例如:news/001 ,可接受001作为参数

3.SpringMVC的自定义配置
SpringMVC的自定义配置在SpringMVC5.0之前需要自定义一个配置类继承WebMvcConfigurerAdapter,在SpringMVC5.0之后被WebMvcConfigurationSupport代替了

WebMvcConfigurationSupport是SpringMVC的全局自定义配置门面类

添加自定义拦截器:
自定义配置类需要添加自定义拦截器可以实现addInterceptors()方法,如下所示:

@Override
protected void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(wapInterceptor()).addPathPatterns("/wap/**");
}

自定义拦截器需要继承HandlerInterceptor
实现postHandler和preHandler方法实现对请求处理之前和之后的拦截操作

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3)throws Exception {
}@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {return true; //通过拦截器成功
}

添加自定义页面转向

@Override
protected void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/index").setViewName("/index");super.addViewControllers(registry);
}

上面代码添加了页面转向,当访问url为index的时候会跳转到index页面,可以用来统一管理特定页面转向

还有很多其他的配置,例如路径参数配置等

4.控制器controller的全局配置?
(1)全局捕获controller异常
可以使用注解@ControllerAdvice给controller设置全局的配置

在controller的全局配置类中我们可以使用注解@ExceptionHandler来处理全局的controller异常
如下所示:

@ExceptionHandler(UndeclaredThrowableException.class)
@ResponseBody
public Object credentials(UndeclaredThrowableException e) {log.info("权限异常!", e);return ResultUtils.error(AuthResultEnum.PERMISSION_ERROR);
}

上面代码使用注解@ExceptionHandler声明了可以处理UndeclaredThrowableException异常

(2)配置绑定前台请求参数
注解@InitBinder可以用来设置WebDataBinder,用来自动绑定前台请求参数到model中

@InitBinder
public void initBinder(WebDataBinder binder) {binder.registerCustomEditor(Object.class, new ObjectNullEditor());
}

(3)给请求添加全局的参数
使用注解@ModelAttributes可以给所有的model添加参数,如下所示:

@ModelAttribute
public void addAttributes(Model model) {model.addAttribute("from","app");
}

5.SpringMVC文件上传
在spring控制器(controller)中通过MultipartFile 来接收文件,通过MultipartFile[] 来接收多个文件

6.自定义消息转换器HttpMessageConverter
HTTPMessageConverter是用来处理request和response里的数据的,spring内置了大量的HTTPMessageConverter实现类,例如StringHTTPMessageConverter,MessageJackson2HttpMessageConverter

每一个HTTPMessageConverter的实现类都需要声明自己处理的是什么消息,例如StringHTTPMessageConverter就是专门用来处理String消息的转换器,如下所示:

public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {public boolean supports(Class<?> clazz) {return String.class == clazz;}protected String readInternal(Class<? extends String> clazz, HttpInputMessage inputMessage){Charset charset = this.getContentTypeCharset(inputMessage.getHeaders().getContentType());return StreamUtils.copyToString(inputMessage.getBody(), charset);}protected Long getContentLength(String str, @Nullable MediaType contentType) {Charset charset = this.getContentTypeCharset(contentType);return (long)str.getBytes(charset).length;}

support方法判断消息是否属于自己的处理范围

在继承WebMvcConfigurationSupport类的SpringMVC配置类中重载configureMessageConverters方法,可以添加自定义的消息转换器,如下所示:

@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.addAll(this.converters);
}

7.SpringMVC测试
为了模拟SpringMVC请求以使得我们可以不用启动tomcat就可以测试代码,我们需要使用一些模拟框架,例如:MockMVC

MVC 和Spring MVC相关推荐

  1. Spring MVC - 配置Spring MVC

    写在前面的话: 现在开始一段新的学习历程:Spring MVC.还是按照原来的三步走学习模式(what.why.how)进行讲解. 1.Spring MVC是什么(what) Spring MVC属于 ...

  2. 【MVC、Spring MVC介绍、区别、执行流程】

    介绍 MVC(Model-View-Controller)是一种软件架构模式,其中应用程序被划分为三个部分:模型(Model).视图(View)和控制器(Controller).MVC框架的主要目标是 ...

  3. ASP.NET MVC vs Spring MVC

    C# 是微软出品对标 Java 的语言,在 web 开发方面,二者都在表现层实现了自己的 MVC 框架.从一个简单的项目开始对比,看看二者有何差异. 项目结构 首先来看由 SpringBoot 生成的 ...

  4. spring mvc velocity 配置备忘

    2019独角兽企业重金招聘Python工程师标准>>> Spring里面最重要的概念是IOC和AOP,还有两项很重要的模块是事务和MVC,对于IOC和AOP,我们要深究其源码实现,对 ...

  5. Spring MVC 相关资料整理

    来源于:http://www.cnblogs.com/ylhssn/p/4062757.html 1.概述 Spring MVC是一种基于Java实现MVC设计模式的请求驱动类型的轻量级Web框架,即 ...

  6. 通过项目逐步深入了解Spring MVC(一)

    相关阅读: 本文档和项目代码地址:https://github.com/zhisheng17/springmvc 转载请注明出处和保留以上文字! 了解 Spring: Spring 官网:http:/ ...

  7. 就是这么简单(续)!使用 RestAssuredMockMvc 测试 Spring MVC Controllers(转)

    接我前面一篇文章关于RestAssured测试Restful web service的, RestAssured还有一个功能, 使用RestAssuredMockMvc 单元测试你的Spring MV ...

  8. Java Web系列:Spring MVC基础

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

  9. 在Spring MVC中处理域对象

    最近,我惊讶于一个代码库在其所有域实体中都具有公共默认构造函数(即零参数构造函数),并且所有字段都具有getter和setter. 当我深入研究时,我发现域实体之所以如此,主要是因为该团队认为Web ...

最新文章

  1. 揭秘三维视觉之结构光原理
  2. PHPCMS 错误日志 Only variables should be passed by ...
  3. boost::intrusive::smart_ptr用法的测试程序
  4. java验证生日的正则表达式
  5. Product search parameter的determine逻辑
  6. 报错,npm ERR! code ENOLOCAL
  7. 车辆撞人有全险但是是全责,车主不愿出钱垫付医药费,该怎么办?
  8. shell脚本中执行命令_如何在Shell脚本中执行命令?
  9. em算法详细例子及推导_EM算法入门教程
  10. 王爽《汇编语言》笔记(详细)
  11. 三相差分编码器转成脉冲信号或集电极开路转换模块
  12. Li‘s 影像组学视频学习笔记(29)-ICC的计算
  13. 七夕礼物 | 全网最火的钉子绕线图制作教程
  14. 圈排序——python
  15. 《神经科学:探索脑》学习笔记(第12章 躯体感觉系统)
  16. 量化分析师的Python日记【Q Quant兵器谱之函数插值】
  17. 渲染吃CPU还是显卡呢?未来是否新睿云的云渲染会大行其道呢?
  18. Docker安装配置Jenkins教程
  19. VirtualBox虚拟化应用
  20. 基于 ESP32 的蜘蛛机器人

热门文章

  1. 电脑都面的没电了,我是如何通过腾讯云恐怖的一面面试的?
  2. 学习产品基础知识学习沟通-每日打卡
  3. PDF格式分析(一)简介
  4. 关于多径效应,平坦衰落,频率选择性衰落以及瑞利衰落的理解
  5. 阿里拍卖面试题:实现一个重拍序
  6. Android 反编译APK详解
  7. linux系统电脑小白可以用吗,linux小白说说用linux的感受
  8. 行人重识别基础(一)
  9. 如何搭建Bugzilla
  10. TLS 协议-对称加密原理