SpringMVC工作原理 1
大家好,我是IT修真院深圳分院第十一期学员,一枚正直纯洁善良的JAVA程序员。
今天给大家分享一下,修真院官网JAVA任务二的一个知识点:SpringMVC工作原理
1、背景介绍
一:背景介绍
JavaWeb经历的几个变化:
1:Jsp Model1第一代
2:JSP Model1第二代
3:JSP Model2
1)Jsp Model1第一代
JSP Model1是JavaWeb早期的模型,它适合小型Web项目,开发成本低!Model1第一代时期,服务器端只有JSP页面,所有的操作都在JSP页面中,连访问数据库的API也在JSP页面中完成。也就是说,所有的东西都耦合在一起,对后期的维护和扩展极为不利。
2)JSP Model1第二代
JSP Model1第二代,把业务逻辑的内容放到了JavaBean中,而JSP页面负责显示以及请求调度的工作。而视图工作和请求调度(控制器)放在一起会产生一定的耦合,所以依然不太完善。
3)JSP Model2
JSP Model2模式:可以清晰的看到MVC完整的结构了。
-JSP:视图层,用来与用户打交道。负责接收用来的数据,以及显示数据给用户;
-Servlet:控制层,负责找到合适的模型对象来处理业务逻辑,转发到合适的视图;
-JavaBean:模型层,完成具体的业务工作,例如:数据的查询,更新等。
1.1 在讲SpringMVC之前我们先来看一下什么是MVC模式
MVC:MVC是一种设计模式
M-Model 模型(完成业务逻辑:有javaBean构成,service+dao+entity)
V-View 视图(做界面的展示 jsp,html……)
C-Controller 控制器(接收请求—>调用模型—>根据结果派发页面)
1.2 MVC的原理图:
1.3 SpringMVC是什么:
SpringMVC是一个MVC的开源框架,SpringMVC=struts2+Spring,SpringMVC就相当于是Struts2加上Spring的整合,但是这里有一个疑惑就是,SpringMVC和Spring是什么样的关系呢?这个在百度百科上有一个很好的解释:意思是说,SpringMVC是Spring的一个后续产品,其实就是Spring在原有基础上,又提供了Web应用的MVC模块,可以简单的把SpringMVC理解为是Spring的一个模块(类似AOP,IOC这样的模块),网络上经常会说SpringMVC和Spring无缝集成,其实SpringMVC就是Spring的一个子模块,所以根本不需要同Spring进行整合。
2、知识剖析
2.1 SpringMVC的原理图:
https://images2015.cnblogs.co... 2.2 SpringMVC步骤详解
看到这个图大家可能会有很多的疑惑,现在我们来看一下这个图的步骤:(可以对比MVC的原理图进行理解)
第一步:用户发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找
第三步:找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)
第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)
第五步:处理器适配器去执行Handler
第六步:Handler执行完给处理器适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析
第九步:视图解析器像前端控制器返回View
第十步:前端控制器对视图进行渲染
第十一步:前端控制器向用户响应结果
2.3 SpringMVC中的组件
看到这些步骤我相信大家很感觉非常的乱,这是正常的,接下来给大家介绍一下SpringMVC中的几个组件:
1、前端控制器DispatcherServlet
作用:接收请求,响应结果,降低其它组件之间的耦合度。
用户请求到达前端控制器,它就相当于MVC模式中的C,DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求。
2、处理器映射器HandlerMapping
作用:根据请求的url查找Handler
HandlerMapping负责根据用户请求找到Handler即处理器,SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
4、处理器Handler
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。
5、视图解析器View resolver
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 SpringMVC框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
6、视图View
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)
【组件说明】
以下组件通常使用框架提供实现:
前端控制器(DispatcherServlet)
处理器映射器(HandlerMapping)
处理器适配器(HandlAdapter)
视图解析器(ViewResolver)
3、常见问题
3.1 Controller返回值设置错误,导致404报错。
例如:页面名为index.jsp,但Controller中相关语句设定的返回值为inde,页面就会报错404.
if(loginUser!=null){request.setAttribute("loginUser", loginUser.getName());return "inde";
3.2 如何解决POST请求中文乱码问题。
3.3 运行mvn jetty run,报错
【java.lang.IllegalStateException: Duplicate fragment name: spring_web for jar:file:/D:/Maven/repo/org/springframework/spring-web/4.2.5.RELEASE/spring-web-4.2.5.RELEASE.jar!/META-INF/web-fragment.xmlandjar:file:/D:/Maven/repo/org/springframework/org.springframework.web/3.2.2.RELEASE/org.springframework.web-3.2.2.RELEASE.jar!/META-INF/web-fragment.xml】
4、解决方案
4.1 编写项目时注意编码规范,注意IDEA中的提示 ,在可能有问题的代码下会加上波浪线来提示。
4.2 在web.xml中加入过滤器:
<!-- 过滤通过用于处理项目中的乱码问题,该过滤器位于org.springframework.web.filter包中,指向类CharacterEncodingFilter --> <filter> <description>字符集过滤器</description> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <description>字符集编码</description> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
4.3 spring-web和org.springframework.web.servlet中都有一个web-fragment.xml文件,导致jetty读取时报错。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>org.springframework.web.servlet</artifactId><version>3.2.2.RELEASE</version>
</dependency>
解决办法:将第一个spring-web删掉就好了……
这个错误很奇怪,在使用Tomcat的时候,这两个都是必须存在的,但是使用jetty的时候就会报错。
5、编码实战
6、扩展思考
6.1 springMVC和struts2的区别有哪些?
(1)springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。
(2)springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
(3)Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
6.2 Springmvc的优点:
(1)它是基于组件技术的。全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件.并且和Spring提供的其他基础结构紧密集成.
(2)不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)
(3)可以任意使用各种视图技术,而不仅仅局限于JSP
(4) 支持各种请求资源的映射策略
(5)它应是易于扩展的
7、 参考文献
百度
8、更多讨论
8.1 Controller并未直接收到用户请求,它怎么能处理用户的请求?
前端Servlet接受到用户请求后,通常会对用户请求进行简单预处理,然后通过反射来创建Controller实例,并调用指定的方法来处理用户请求。
8.2当Servlet拦截到用户请求后,它如何知道创建哪个接口的实例呢?
有两种方法,第一种是使用xml文件,在xml文件中描述请求对应使用的类,告诉MVC应该去哪找
第二种是使用注解,使用@Controller描述一个类,然后用@RequestMapping来描述对应的方法。
8.3SpringMVC常用的注解有哪些?
@Controller @RequestMapping 等
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
SpringMVC工作原理 1相关推荐
- SpringMVC工作原理详解
点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 先来看一下什么是 MVC 模式 MVC 是一种设计模式. MVC 的原理图如下: SpringMV ...
- SpringMVC工作原理之一:DispatcherServlet
一.DispatcherServlet 处理流程 在整个 Spring MVC 框架中,DispatcherServlet 处于核心位置,它负责协调和组织不同组件完成请求处理并返回响应工作.在看 Di ...
- SpringMVC→简介、MVC、SpringMVC工作原理、Maven搭建第一个SpringMVC、请求参数接收、重定向、文件上传、AJAX异步访问、请求参数接收绑定JSON、@注解及传参
MVC SpringMVC工作原理 Maven搭建第一个SpringMVC 目录结构 web.xml *-servlet.xml Controller请求处理类 跳转页面 Maven运行服务器项目 浏 ...
- SpringMVC工作原理及源码解析
SpringMVC工作原理及源码解析 一:SpringMVC原理图 二:SpringMVC的主要组件 1.前端控制器DispatcherServlet: 2.处理器映射器HandlerMapping: ...
- SpringMVC工作原理 侵立删
转自:http://www.cnblogs.com/xiaoxi/ SpringMVC的工作原理图: SpringMVC原理 1.用户发送请求至前端控制器DispatcherServlet. 2. D ...
- SpringMVC工作原理
一:SpringMVC的工作原理图 二:SpringMVC流程 用户发送请求至前端控制器DispatcherServlet. DispatcherServlet收到请求调用HandlerMapping ...
- [Java] SpringMVC工作原理之四:MultipartResolver
MultipartResolver 用于处理文件上传,当收到请求时 DispatcherServlet 的 checkMultipart() 方法会调用 MultipartResolver 的 isM ...
- dispatcherservlet发送2次请求_[Java] SpringMVC工作原理之一:DispatcherServlet
一.DispatcherServlet 处理流程 在整个 Spring MVC 框架中,DispatcherServlet 处于核心位置,它负责协调和组织不同组件完成请求处理并返回响应工作.在看 Di ...
- SpringMVC工作原理的介绍
1.原理图: 2.流程文字介绍: 1.用户向服务器发送请求,请求被Spring前端控制Servlet DispatcherServlet捕获: 2.DispatcherServlet对请求UR进行解析 ...
最新文章
- python数组对应元素相乘_python的几种矩阵相乘的公式详解
- JetBrains 宣布:IntelliJ 平台彻底停用 Log4j 组件,建议切换至 java.util.logging
- STC8K28步进电机ULC2003触发器
- 一台机器同时启动两个tomcat
- layui table is not a valid module
- 脚注交叉引用序号不一样_期末干货|蛋黄君的论文不秃头指南
- 双栈共享存储空间(C++代码实现)
- 【实战 Ids4】║ 认证中心之内部加权
- java编写科赫曲线_matlab绘制peano(皮亚诺)曲线和koch(科赫曲线,雪花曲线)分形曲线...
- cs106a编程方法学作业解答(3)
- cmd查看所有数据库 db2_db2 cmd命令操作
- 学python有前途吗-2019年转行学Python有还前途吗?如何学习Python?
- 名字生成器 - 再也不用担心给孩子起名了
- 全球气象数据网站(大气、海洋数据应有尽有)
- 如何用python编写财务记账软件_Python实现简单的记账本功能
- 计算机应用一级考试win10,2016年计算机一级考试试题「Windows」
- 技术报告 | 华为云中国信通院:云原生2.0 白皮书.pdf(附下载链接)
- HUD1873看病要排队
- 草晶华分享冬季养生小知识
- SEO新手不知道每天做什么,看了你就知道
热门文章
- 三个月计算机培训班,三个月复盘:学完两个设计软件,并开始学画画
- C# linq Expression left join如何使用
- 计算机表格收入水平怎么算,怎么用excel计算工资所得税
- 威海二职工业机器人专业_工业机器人专业就业前景-山东省好的中专学校
- 从数据库表中随机获取N条记录的SQL语句
- std::chrono::duration_cast时间计算
- H.264/AVC视频编解码技术详解 第一章 视频信息与压缩编码
- SQL语句使用大全,最常用的sql语句
- 横向技术分析C#、C++和Java优劣
- 让猎头雨天送伞--大话猎头