这里是修真院后端小课堂,每篇分享文从
八个方面深度解析后端知识/技能,本篇分享的是:
【springmvc工作原理】
【修真院JAVA小课堂】springmvc工作原理
大家好,我是IT修真院西安分院第四期的学员赵立鼐,一枚正直纯洁善良的JAVA程序员,今天给大家分享一下,修真院官网JAVA任务二,深度思考中的知识点——springmvc工作原理
(1)背景介绍:
什么是springmvc
Spring下的子项目:Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,
将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。
一个实现MVC模式的应用包含模型、视图和控制器3个模块。
视图负责应用的展示。模型封装了应用的数据和业务逻辑。
控制器负责接收用户输入,改变模型,以及调整视图的显示。
(2)知识剖析:
SpringMvc的执行流程
1、发起请求到前端控制器(DispatcherServlet )
2、前端控制器请求HandlerMapping查找Handler(可以根据xml、注解进行查找)
3、处理器映射器HandlerMapping向前端控制器DispatcherServlet 返回Handler
4、前端控制器DispatcherServlet 调用处理器适配器HandlerAdapter 执行Handler
5、处理器适配器HandlerAdapter 执行Handler
6、Handler执行完给处理器适配器返回ModelAndView
7、处理器适配器向前端控制器返回ModelAndView (ModelAndView 是SpringMvc的底层对象 包括model和view)
8、前端控制器请求视图解析器去解析视图 根据逻辑视图名解析成真正的视图(jsp)
9、视图解析器向前端控制器返回view
10、前端控制器进行视图渲染 视图渲染将模型数据(模型数据在ModelAndView对象中)填充到request域
11、前端控制器向用户响应结果
DispatcherServlet是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项:
-
截获符合特定格式的URL请求。
-
初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。
-
初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。
(3)常见问题:
springmvc的相关接口
(4)解决方案:
SpringMVC接口解释
DispatcherServlet接口:
spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。
HandlerMapping接口:
能够完成客户请求到Controller映射。
Controller接口:
需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。
Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,
则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。
从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,
而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
ViewResolver接口:
Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。
(5)编码实战:
尽可能的去寻找在真实项目中在用的。如果你能找到某个网站在用你说的知识点,这是最好的。学以致用,否则当成练习题就没有意义了。多准备一些demo,讲解过程中将知识点和demo结合,便于大家理解所讲解的知识点。
(6)拓展思考:
使用Springmvc的优点:
1、让我们能非常简单的设计出干净的Web层和薄薄的Web层;
2、进行更简洁的Web层的开发;
3、天生与Spring框架集成(如IoC容器、AOP等);
4、提供强大的约定大于配置的契约式编程支持;
5、能简单的进行Web层的单元测试;
6、支持灵活的URL到页面控制器的映射;
7、非常容易与其他视图技术集成,如Velocity、FreeMarker等等,因为模型数据不放在特定的API里,
而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用);
8、非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API;
9、提供一套强大的JSP标签库,简化JSP开发;
10、支持灵活的本地化、主题等解析;
11、更加简单的异常处理;
12、对静态资源的支持;
13、支持Restful风格。
(7)参考文献:
https://www.cnblogs.com/aspwebchh/p/6652855.html
(8)更多讨论:
Q1:鲁伯良: 如何解决POST请求中文乱码问题,GET的又如何处理呢??
A1:分享人:
(1)解决post请求乱码问题:
在web.xml中加入:
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
(2)get请求中文参数出现乱码解决方法有两个:
①修改tomcat配置文件添加编码与工程编码一致,如下:
②另外一种方法对参数进行重新编码:
String userName = new String(request.getParamter(“userName”).getBytes(“ISO8859-1”),“utf-8”)
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。
Q2:乔名震: Spring MVC的异常处理 ?
A2: 赵立鼐 : 可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。
Q3:乔名震: SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代?
A3: 赵立鼐: 一般用@Conntroller注解,表示是表现层,不能用用别的注解代替。
(9)鸣谢:
感谢刘优、乔名震师兄,此教程是在他们之前技术分享的基础上完善而成。
(10)结束语:
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~