SpringMVC中相关细节

1、什么是MVC?
MVC是一种软件架构思想,将软件按照模型、视图、控制器来划分。
①M:模型层;指工程中的javaBean,作用是处理数据。javaBean分为两类:一类称为实体类Bean,专门存储业务数据的,如:Student,User等。另一类称为业务处理Bean,指Service或Dao对象,专门用于处理业务逻辑和数据访问。
②V:View视图层,指工程中的html 或jsp 等页面,作用是与用户进行交互,展示数据。
③C:Controller控制层,指工程中的Servlet,作用是接受请求和响应浏览器。

2、MVC工作流程:用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器。

3、 搭建springMVC项目步骤:()
①创建maven项目,导入相应依赖。springmvc、ServletAPI、spring5和thymeleaf整合包。并设置打包方式为war
②创建web.xml文件,并进行相对应的配置。

<url-pattern>中配置的是 / 代表 springmvc的核心控制器,所能处理的请求路径可以是/login 或 .html 或 .js 或 .css 的请求路径但是 / 不能匹配 .jsp 请求路径的请求。
上述图片为默认配置方式。此配置作用下,SpringMVC的配置文件默认位于WEB-INF下,默认名称为<servlet-name>-servlet.xml,例如,以下配置所对应SpringMVC的配置文件位于WEB-INF下,文件名为springMVC-servlet.xml。
扩展配置方式:(大多数用此配置方式:此配置方式可以将配置文件放在resource文件夹下)
在<servlet>标签中加入如下:

③在resource文件夹下创建springMVC的配置文件,并进行相对应的配置。


④运行时还需要为当前项目创建一个 tomcat 实例。

搭建总结:创建maven工程,配置pom.xml,设置war打包格式,引入依赖。项目结构创建webapp,添加web.xml并配置web.xml,在resource中添加springMVC.xml并配置。设置项目jdk版本,maven版本,添加tomcat并进行设置上下文路径。

4、springMVC的映射请求跟请求方法名字没有关系,跟请求方法的@RequestMapping里面的value有关系。

5、href=“/target” 表示的是访问localhost:8080/target。所以要配置上下文的绝对路径。一般用模板引擎解析。
th:href="@{/target}" 如果检查到里面用到的是绝对路径的话,模板引擎会自动帮我们添加上下文路径。

6、前端的标签如果想用模板引擎解析,那么就要在前面加上一个 th: 。 比如href 要用 thymeleaf解析,就要加上,th:href= 。

7、springMVC渲染视图原理:
浏览器发送请求,若请求地址符合前端控制器的url-pattern,该请求就会被前端控制器DispatcherServlet处理。前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器,将请求地址和控制器中@RequestMapping注解的value属性值进行匹配,若匹配成功,该注解所标识的控制器方法就是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视图所对应页面。(最终的跳转方式是:转发)

8、@RequestMapping注解:
①作用:从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。
②标识位置:(1)标识一个类:设置映射请求的请求路径的初始信息。(2)标识一个方法:设置映射请求的请求路径的具体信息
③value 属性:(通过请求地址匹配)(1)RequestMapping注解的value属性通过请求的请求地址匹配请求映射。(2)@RequestMapping注解的value属性是一个字符串类型的数组,表示该请求映射能够匹配多个请求地址所对应的请求。(3)@RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射。
④method 属性:(通过请求方式匹配)(1)@RequestMapping注解的method属性通过请求的请求方式(get或post)匹配请求映射。(2)@RequestMapping注解的method属性是一个RequestMethod类型的数组,表示该请求映射能够匹配多种请求方式的请求。(3)若当前请求的请求地址满足请求映射的value属性,但是请求方式不满足method属性,则浏览器报错405:Request method 'POST’not supported。
⑤params 属性:(通过参数方式匹配)①必须与所有params 匹配 ②属性params={ } 里面写法有param 和param=value

9、对于处理指定请求方式的控制器方法,springMVC中提供了@RequestMapping 的派生注解
①处理get请求的映射@GetMapping ②处理post请求的映射@PostMapping ③处理put请求的映射@PutMapping ④处理delete请求的映射@DeleteMapping
(但是现在浏览器只支持get和post,所以put和delete默认用get方式处理,若要发送put和delete请求,则需要通过spring提供的过滤器HiddenHttpMethodFilter ,在restful部分会有讲解)

10、springMVC支持ant风格的路径:(请求路径的模糊匹配的功能)
① ?:表示任意的单个字符 ② * :表示任意的0个或者多个字符 ③ **:表示任意的一层或者多层目录

11、springMVC中支持路径中的占位符(重点!!!)
原始方式:/deleteUser?id=1
rest方式:/deleteUser/1
在RequestMapping中,value属性 获取 :如/testPath/{id} 。 中括号内将参数设置名字,然后需要在方法的入参中使用注解,@PathVariable(“id”) Integer id 。这样在方法中才能够使用传过来的这个参数。
原理:
SpringMVC路径中的占位符常用于restful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx]表示传输的数据,在通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参。

12、springMVC获取请求参数:
①通过servletAPI获取:将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象。
②通过控制器方法的形参获取请求参数:形参的参数名,必须与请求参数的参数名保持一致。
(多请求参数中出现多个同名的请求参数,可以再控制器方法的形参位置设置字符串类型或字符串数组接收此请求参数。)
③@RequestParam 注解:如果请求参数的参数名与形参的参数名不一致。则需要通过该注解来配置参数名映射。就比如:@RequestParam(“user_name”)String username。这个注解还有两个属性,required 和 defaultValue 来限制入参。
④通过pojo获取请求参数:可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值。

13、处理乱码问题:(在web.xml 配置文件中添加乱码处理filter)

14、域对象session 与服务器是否关闭没有关系,与浏览器是否关闭有关系。(只要JSESSIONID这个cookie存在,那么我们在当前会话中所创建的session 它永远都是同一个。)

15、域对象共享数据:(我们在选择域对象时应该挑:能实现功能的,范围最小的域对象。)

16、向request 中共享的域对象:(下面五种方式最终都是包装成ModelAndView 方式传数据的。)
①通过ServletAPI 的方式:

②通过ModelAndView 方式:(重要)

③通过Model 方式:

④通过map 方式:

⑤通过ModelMap 方式:

17、向session 中共享的域对象:

18、向application 中共享的域对象:

19、springMVC的视图:
①springMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户。
②SpringMVC视图的种类很多,默认有转发视图InternalResourceView 和重定向视图RedirectView 。
若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView。

20、如果不加 转发或者重定向前缀,视图解析器会自动按照 thymeleaf 规则来解析视图映射。
①转发: (创建的为InternalResourceView解析器)

②重定向:(创建的为RedirectView解析器,WEB-INF下面的内容不可以被重定向)

21、视图控制器 view-controller:当控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称时,可以将处理器方法使用view-controller标签进行表示。

用于在当前控制器方法中,没有其他任何的请求处理的话,只需要设置一个视图名称,就可以通过view-controller 进行设置。
还需要再在springMVC.xml 中添加,<mvc:annotation-driven/>

22、RESTFul风格实现;
①REST: Representational State Transfer,表现层资源状态转移。
②具体说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE 用来删除资源。
③REST风格提倡URL地址使用统一的风格设计,从前到后各个单词使用斜杠分开,不使用问号键值对方式携带请求参数,而是将要发送给服务器的数据作为URL地址的一部分,以保证整体风格的一致性。

23、用过滤器实现发送PUT 和 DELETE 请求。在web.xml中配置HiddenHttpMethodFilter
①要想发送PUT 和 DELETE 请求,必须满足两个条件:
(1)请求方式为POST (2)必须传送一个隐藏的请求参数,叫做 _method,值为PUT 或 DELETE。

②配置HiddenHttpMethodFilter

注意:这个过滤器已经要配置在 编码乱码过滤器的下面。因为设置编码之前不能获取任何的请求参数,只要获取,那设置编码将没有任何效果。

24、web.xml配置内容:两个过滤器一个servlet。
①两个过滤器为:编码过滤器,请求路径过滤器。②一个servlet为:前端控制器。

25、RESTFUL
①展示所有:/employee --------GET

②根据id删除特定员工:/employee/id --------DELETE

③添加员工:/employee --------POST

④更新员工信息:/employee ---------PUT


26、HttpMessageConverter
①HttpMessageConverter,报文信息转换器,将请求报文转换为Java对象,或将Java对象转换为响应报文。
②HttpMessageConverter提供了两个注解和两个类型:@RequestBody(将当前请求报文中的请求体转换成java对象),@ResponseBody(将java对象给转换成响应体),RequestEntity,ResponseEntity。

27、请求报文
①请求报文组成:(1)请求头(2)请求空行(3)请求体(请求体只有在post请求才会有,get请求是没有请求体的。因为请求体里面放的就是请求参数,而get会把请求参数拼接在请求地址后,但post不会,故放在请求体中。)
②@RequestBody 能返回请求的参数。(只返回请求体)
③RequestEntity 能返回请求参数。(可以返回整个请求报文,也能返回请求体)

28、响应报文
①作用:不跳转页面,而向页面响应数据。
②@ResponseBody:如果方法名不加这个注解,则按照正常的视图解析跳转到相应页面。如果加上@ResponseBody 则为响应到浏览器的响应体。
③但是比如像bean 对象,就不能通过@ResponseBody 作为响应体,这时候就需要把bean 对象格式 转换成Json 数据格式 ,这样才能作为响应体响应给浏览器。(加入jackson-databind 依赖)
④json数据格式:(1)最外面是大括号就是 json 对象。 (2)最外面是方括号就是 json 数组。
⑤java 对象转换为Json 对象的具体流程:
(1)导入jackson的依赖
(2)在SpringMVC的核心配置文件中开启mvc的注解驱动<mvc:annotation-driven>,此时在HandlerAdaptor中会自动装配一个消息转换器;Mappinglackson2HttpMessageConverter,可以将响应到浏览器的ava对象转换为json格式的字符串
(3)在处理器方法上使用@ResponseBody注解进行标识
(4)将Java对象直接作为控制器方法的返回值返回,就会自动转换为json格式的字符串
⑥json 是一种数据交互格式。xml也是。但是json 比 xml 简易了许多。而且解析json 更加快捷。

29、@RestController 注解:
它是springMVC,提供的一个复合注解,标识在控制器的类上,就相当于为类添加了@Controller 注解,并且也为其中的每一个方法都添加了@ResponseBody 注解。

30、ResponseEntity 用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文。(作用:实现文件下载功能。)

31、SpringMVC拦截器
①SpringMVC中的拦截器用于拦截控制器方法的执行
②SpringMVC中的拦截器需要实现HandlerInterceptor或者继承HandlerInterceptorAdapter类
③SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置:

32、①过滤器是作用在:浏览器 和 DispatcherServlet 之间的。
②DispatcherServlet 在接收到请求后,对请求进行处理,根据请求信息 去跟 RequestMapping 请求映射进行匹配。(故DispatcherServlet 是去调用 Controller)
③拦截器是作用在:控制器controller 执行的前后(preHandle、postHandle、afterCompletion)所执行的。其中,afterCompletion 是在渲染视图后执行的。

33、拦截器:
①实现 HandlerInterceptor ,重写三个方法。preHandle 只有return true 的时候才会放行。
②写完后需要在 springMVC配置文件中,进行注册。


34、多个拦截器的执行顺序:
①若每个拦截器的 preHandle() 都返回 true:此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:
preHandle() 会按照配置的顺序执行,而 postHandle() 和 afterComplation() 会按照配置的反序执行。
②若某个拦截器的 preHandle() 返回了false:preHandle() 返回 false 和它之前的拦截器的 preHandle() 都会执行,postHandle() 都不执行,返回 false 的拦截器之前的拦截器的 afterComplation() 会执行。

35、异常处理器
①通过配置方式:

②通过注解方式:

36、通过配置类的形式实现springmvc
①这样就不需要web.xml文件。 可以通过创建webInit 类 extends AbstractAnnotationConfigDispatcherServletInitializer类来实现。 里面一共写4个方法:
(1)getRootConfigClasses() 用来指定spring的配置类
(2)getServletConfigClasses() 用来指定springmvc的配置类
(3)getServletMappings() 用来指定DispatcherServlet 的映射规则,即url-pattern
(4)getServletFilters() 用来创建两个过滤器:第一个是字符过滤器,第二个是视图过滤器
②springmvc配置类 需要@Configuration 注解来标注,一共实现8个功能:扫描组件、视图解析器、view-controller、默认的default-servlet-handler、mvc注解驱动、文件上传解析器、异常处理、拦截器。

37、springMVC的常用组件:
DispatcherServlet 前端控制器。不需要工程师开发,由框架提供。
作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求
HandlerMapping 处理器映射器。不需要工程师开发,由框架提供。
作用:根据请求的url、method等信息查找Handler,即控制器方法
Handler 处理器。需要工程师开发。
作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理
HandlerAdapter 处理器适配器。不需要工程师开发,由框架提供。
作用:通过HandlerAdapter对处理器(控制器方法)进行执行
ViewResolver 视图解析器。不需要工程师开发,由框架提供。
作用:进行视图解析,得到相应的视图,例如: ThymeleafView、InternalResourceView、RedirectView
View 视图。不需要工程师开发,由框架或视图技术提供。
作用:将模型数据通过页面展示给用户

38、DispatcherServlet 初始化过程:
DispatcherServlet本质上是一个Servlet,所以天然的遵循Servlet的生命周期。所以宏观上是Servlet生命周期来进行调度。

39、springMVC的执行流程:
①用户向服务器发送请求,请求被SpringMVC前端控制器DispatcherServlet捕获。
②DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI),判断请求URI对应的映射:
(1)不存在,再判断是否配置了mvc:default-servlet-handler。如果没配置,则控制台报映射查找不到,客户端展示404错误。如果有配置,则访问目标资源(一般为静态资源,如:JS,.CSS,HTML),找不到客户端也会展示404错误。
(2)存在,则执行↓
③根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回。
④DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。
⑤如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler(…)方法【正向】
⑥提取Request中的模型数据,填充Handler入参,开始执行Handler (Controller)方法,处理请求。在填充Handler的入参过程中,根据你的配置,Spring将帮你做—些额外的工作:
(1)HttpMessageConveter将请求消息(如son、xml等数据)转换成一个对象,将对象转换为指定的响应信息。
(2)数据转换:对请求消息进行数据转换。如String转换成Integer、Double等.
(3)数据格式化:对请求消息进行数据格式化。如将字[符串转换成格式化数字或格式化日期等。
(4)数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
⑦Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象。
⑧此时将开始执行拦截器的postHandle(…)方法【逆向】。
⑨根据返回的ModelAndView(此时会判断是否存在异常:如果存在异常,则执行HandlerExceptionResover进行异常处理)选择一个适合的ViewResolver进行视图解析,根据Model和View,来渲染视图。
⑩渲染视图完毕执行拦截器的afterCompletion(…)方法【逆向】。
将渲染结果返回给客户端。

SpringMVC学习笔记:springMVC中相关细节相关推荐

  1. springmvc学习笔记--ueditor和springmvc的集成

    springmvc学习笔记--ueditor和springmvc的集成 前言: 在web开发中, 富文本的编辑器真心很重要. 有电商店铺的打理, 新闻稿/博客文章/论坛帖子的编辑等等, 这种所见即所的 ...

  2. SpringMVC学习笔记整理

    SpringMVC学习笔记 以下是我整理的SpringMVC学习笔记: 导入jar包 一:springmvc工作流程. ①.     servlet容器初始化一个request请求 ②.     Di ...

  3. SpringMVC:学习笔记(11)——依赖注入与@Autowired

    SpringMVC:学习笔记(11)--依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...

  4. SpringMVC:学习笔记(5)——数据绑定及表单标签

    SpringMVC--数据绑定及表单标签 理解数据绑定 为什么要使用数据绑定 基于HTTP特性,所有的用户输入的请求参数类型都是String,比如下面表单: 按照我们以往所学,如果要获取请求的所有参数 ...

  5. SpringMVC学习笔记

    文章目录 SpringMVC学习笔记 Spring MVC 什么是 MVC 设计模式? Spring MVC 的核心组件 Spring MVC 的工作流程 如何使用? Spring MVC 注解 Sp ...

  6. JavaEE 企业级分布式高级架构师(四)SpringMVC学习笔记(4)

    SpringMVC学习笔记 高级应用篇 ControllerAdvice @ControllerAdvice @ModelAttribute 作用于方法 作用于方法参数 @InitBinder @Ex ...

  7. SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传

    SpringMVC:学习笔记(10)--整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...

  8. springmvc学习笔记(10)-springmvc注解开发之商品改动功能

    springmvc学习笔记(10)-springmvc注解开发之商品改动功能 springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmv ...

  9. springmvc学习笔记(19)-RESTful支持

    springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...

最新文章

  1. 利用List比较数组有优势吗?
  2. CString初始化时提示字符串太大
  3. 经验:在mysql中避免重复插入数据的4种方式
  4. 使用springfox 集成swagger 与spring mvc
  5. linux之如何在任意目录执行我常用的脚本文件
  6. tfs 2013 access deny
  7. python人像和图片比对_python 使用OpenCV进行简单的人像分割与合成
  8. [Android]Webview中JS接口调用Java-版本问题
  9. 简单的idea非maven项目引入jar包
  10. ghostscript处理PDF/拆分/压缩/合并/转换
  11. JAVA JSP学生助学金管理系统 jsp学生资助管理系统jsp学生管理系统jsp贷款管理系统jsp大学生贷款管理系统
  12. Syzkaller最后一步运行./bin/syz-manager 无法启动虚拟机 failed to create instance: failed to read from qemu: EOF
  13. 堡塔APP 免费使用教程【图文教程】
  14. 零基础入门金融风控-贷款违约预测-Task4 建模与调参
  15. JAVA练习165-复数乘法
  16. python集合如何去除重复数据_Python 迭代删除重复项,集合删除重复项
  17. conda离线安装包
  18. python中self的个人理解
  19. 网页vnc工具NoVnc
  20. 中科软测试面试题2019_中科软笔试题和面试题

热门文章

  1. java默认字体_设置 Java 系统的默认字体
  2. 如何编写功能测试报告
  3. 商品条码三大编码原则,您知道吗?
  4. Python培训班一般学费是多少?
  5. 腾讯云Java工程师一面 + 被捞一面 + 二面面经(附答案)
  6. 188. 武士风度的牛 C++ bfs(宽度优先搜索)
  7. 来自作业本的写给90后
  8. C#扩展(2):Random的扩展
  9. 阿里云服务器ECS新手搭建
  10. python中quad_python scipy integrate.quad用法及代码示例