这里是修真院后端小课堂,每篇分享文从
【SpringMVC工作原理】
大家好,我是IT修真院深圳分院第13期的学员,一枚正直纯洁善良的java程序员
今天给大家分享一下,修真院官网Java任务2,深度思考中的知识点————SpringMVC工作原理
1.背景介绍
Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单。
这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。
2.知识剖析
(1) Spring MVC主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。
(2)它的两个核心是:
处理器映射:选择使用哪个控制器来处理请求
视图解析器:选择结果应该如何渲染
(3)通过以上两点,Spring MVC保证了如何选择控制处理请求和如何选择视图展现输出之间的松耦合。
2.1知识剖解
(1)用户发送请求到前端控制器(DispatcherServlet)。
(2)前端控制器请求处理器映射器(HandlerMapping)去查找处理器(Handler)。
(3)找到以后处理器映射器(HandlerMappering)向前端控制器返回执行链(HandlerExecutionChain)。
(4)前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)。
(5)处理器适配器去执行Handler。
(6)处理器执行完给处理器适配器返回ModelAndView。
(7)处理器适配器向前端控制器返回ModelAndView。
(8)前端控制器请求视图解析器(ViewResolver)去进行视图解析。
(9)视图解析器向前端控制器返回View。
(10)前端控制器对视图进行渲染。
(11)前端控制器向用户响应结果。
3.常见问题
Springmvc的常用配置
(1)1.在web.xml中配置字符集 过滤器
<!-- 在Spring框架中是如何解决从页面传来的字符串的编码问题的呢?
下面我们来看看Spring框架给我们提供过滤器CharacterEncodingFilter
这个过滤器就是针对于每次浏览器请求进行过滤的,然后再其之上添加了父类没有的功能即处理字符编码。
其中encoding用来设置编码格式,forceEncoding用来设置是否理会 request.getCharacterEncoding()方法,
设置为true则强制覆盖之前的编码格式。-->
<filter>
<filter-name>encodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(2)在web.xml中配置DispatcherServlet
<!--DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,
把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。-->
<servlet>
<servlet-name>spring</servlet-name> <!--在DispatcherServlet的初始化过程中,
框架会在web应用的 WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml 的配置文件,生成文件中定义的bean。-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--指明了配置文件的文件名,不使用默认配置文件名,而使用dispatcher-servlet.xml配置文件。-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--其中<param-value>**.xml</param-value> 这里可以使用多种写法-->
<!--1、不写,使用默认值:/WEB-INF/<servlet-name>-servlet.xml-->
<!--2、<param-value>/WEB-INF/classes/dispatcher-servlet.xml</param-value>-->
<!--3、<param-value>classpath*:dispatcher-servlet.xml</param-value>-->
<!--4、多个值用逗号分隔-->
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!--是启动顺序,让这个Servlet随Servlet容器一起启动。-->
</servlet>
<servlet-mapping>
<!--spring,可以有多个DispatcherServlet,是通过名字来区分的。
每一个DispatcherServlet有自己的WebApplicationContext上下文对象。同时保存在ServletContext中和Request对象中.-->
<!--ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,
ApplicationContext则是“应用的容器”了:P,Spring把Bean放在这个容器中,在需要的时候,用getBean方法取出-->
<servlet-name>spring</servlet-name>
<!--Servlet拦截匹配规则可以自已定义,当映射为@RequestMapping("/user/add")时,为例,拦截哪种URL合适?-->
<!--1、拦截*.do、*.htm, 例如:/user/add.do,这是最传统的方式,最简单也最实用。不会导致静态文件(jpg,js,css)被拦截。-->
<!--2、拦截/,例如:/user/add,可以实现现在很流行的REST风格。很多互联网类型的应用很喜欢这种风格的URL。
弊端:会导致静态文件(jpg,js,css)被拦截后不能正常显示。 -->
<url-pattern>/</url-pattern><!--会拦截URL中带“/”的请求。-->
</servlet-mapping>
4.解决方案
5.编码实战
demo是参考李学凯大神的,他介绍得很好,所以这里就不重复放demo了
感兴趣的同学可以去看一下
https://blog.csdn.net/qq_27093465/article/details/68961393
6.扩展思考
7.参考文献
CSDN、百度百科
8.更多讨论
(1) Springmvc常用的注解都有什么?
@Controller是必须的,常用的还有@RequestMapping,@Resource,@ResponseBody,绑定接收参数的有@RequestParam,@PathVariable等等
(2)Springmvc怎么配置HandlerMappeing?
Springmvc中使用@RequestMapping,告诉前端控制器(DispatcherServlet),请求路径与处理器的方法的对应关系。所以spring配置文件不用配置HandlerMappeing了。
(3) Springmvc中需要我们编写的有什么,哪些是被Springmvc封装好了的?
一般来说,controller和view层是需要我们自己编写的,其它大部分是被Springmvc封装好了的,所以我们可以更专注于我们的业务逻辑编写。
9.鸣谢:
感谢修真院的师兄和CSDN博客上相关的作者,此教程是在他们之前技术分享的基础上完善而成。
10.结束语:
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
温馨提示:本人初学java者,如有不对敬请指出,谢谢!