SpringMVC工作原理

大家好,我是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页面中完成。也就是说,所有的东西都耦合在一起,对后期的维护和扩展极为不利。

clipboard.png

2)JSP Model1第二代

JSP Model1第二代,把业务逻辑的内容放到了JavaBean中,而JSP页面负责显示以及请求调度的工作。而视图工作和请求调度(控制器)放在一起会产生一定的耦合,所以依然不太完善。

clipboard.png

3)JSP Model2

JSP Model2模式:可以清晰的看到MVC完整的结构了。

-JSP:视图层,用来与用户打交道。负责接收用来的数据,以及显示数据给用户;

-Servlet:控制层,负责找到合适的模型对象来处理业务逻辑,转发到合适的视图;

-JavaBean:模型层,完成具体的业务工作,例如:数据的查询,更新等。

clipboard.png

1.1 在讲SpringMVC之前我们先来看一下什么是MVC模式

MVC:MVC是一种设计模式

M-Model 模型(完成业务逻辑:有javaBean构成,service+dao+entity)

V-View 视图(做界面的展示 jsp,html……)

C-Controller 控制器(接收请求—>调用模型—>根据结果派发页面)

1.2 MVC的原理图:

clipboard.png

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步骤详解

clipboard.png

看到这个图大家可能会有很多的疑惑,现在我们来看一下这个图的步骤:(可以对比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 等

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android应用开发—如何解决handler的警告:Handler Class Should be Static or Leaks Occur

转自android handler的警告Handler Class Should be Static or Leaks Occur 在使用Handler更新UI的时候&#xff0c;我是这样写的&#xff1a; public class SampleActivity extends Activity {private final Handler mLeakyHandler new Handler() {Overridepublic void hand…

从远程(包括ftp,http等协议)地址获取文件流信息

URL url new URL("ftp://172.18.251.155:8010/recordsImg/2019-01-28/000008_1548649813267.jpg"); MultipartFile multipartFile new MockMultipartFile(fileName,fileName,"", url.openStream());转载于:https://www.cnblogs.com/baihaojie/p/10331134…

shell 数组

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1&#xff09;定义数组&#xff1a; my_array(1 2 3 4) 也可这样赋值&#xff1a;my_array[4]爱 读取&#xff1a; echo ${my_array[2]…

nodejs 实现文件拷贝

通过4中不通的方式实现对一个文件的拷贝 方式一&#xff1a;readFile 异步一次性读取文件再写入 //异步形式读取文件 function copyFile(url){const extName path.extname(url)const fileName path.basename(url)const dirName path.dirname(url)fs.readFile(url, (err, dat…

国家部委对4G调研:未定给中电信联通发放牌照

一场有关4G牌照发放的论战正在发酵&#xff0c;矛盾的核心在于&#xff0c;除了中移动外&#xff0c;政府是否也会向中电信和联通发放TD-LTE(中国主导的4G标准)牌照 记者 王云辉 雍忠玮 一场围绕4G的新博弈已经白热化。 “多个国家部委正在对4G展开全面调研&#xff0c;但最终如…

Luogu4735 最大异或和

题目蓝链 Description 给你一个序列&#xff0c;你需要支持以下两个操作&#xff1a; A x: 在序列尾部添加一个整数\(x\)&#xff0c;序列的长度增加\(1\)Q l r x: 询问操作&#xff0c;你需要找到一个位置\(p \in [l, r]\)&#xff0c;使得&#xff1a;\(x \bigoplus a_p \big…

Spring-jdbc:JdbcTemplate使用简介

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架. 作为 SpringJDBC 框架的核心, JDBC 模板…

Java多线程编程:变量共享分析(Thread)

Java多线程编程&#xff1a;变量共享分析&#xff08;Thread&#xff09; Java 创建线程的两种方法 此处只简单讲下自己对java多线程变量共享的理解&#xff1a; 按照进程和多线程的原理&#xff0c;同一进程内的多个线程之间的地址空间是共享的&#xff08;除去ThreadLocal&a…

嘉益仕(Litns)带您读懂MES系统:选型篇

自从智能制造概念提出以来&#xff0c;制造执行系统MES在国内掀起了新一波的热潮。众多企业在技术发展、政策导向和自身需要的推动下&#xff0c;纷纷上马MES请添加链接描述项目。 由此也带动了MES软件开发企业的快速发展。一夜之间MES软件开发企业遍地开花&#xff0c;MES产品…

[WPF]xml序列化以及反序列化数据

代码 XML序列化工具类 public static class XMLHelper{/// <summary>/// 将对象序列化为指定的文件名/// </summary>/// <typeparam name"T"></typeparam>/// <param name"obj"></param>/// <param name"fil…

多线程的那点儿事

1. 多线程的那点儿事&#xff08;基础篇&#xff09; 多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程&#xff0c;这就要牵涉到多进程&#xff1f;当然&#xff0c;要了解到多进程&#xff0c;就要涉及到操作系统。不过大家也不要紧张&#xff0c;听我慢慢道来。…

Android应用开发—AsyncTask

摘录自 Android 多线程—–AsyncTask详解 AsyncTask AsyncTask&#xff1a;异步任务&#xff0c;从字面上来说&#xff0c;就是在我们的UI主线程运行的时候&#xff0c;异步的完成一些操作。AsyncTask允许我们的执行一个异步的任务在后台。我们可以将耗时的操作放在异步任务当…

std::shared_ptr之deleter的巧妙应用

本文由作者邹启文授权网易云社区发布。std::shared_ptr一次创建&#xff0c;多处共享&#xff0c;通过引用计数控制生命周期。 实例 在邮箱大师PC版中&#xff0c;我们在实现搜索时&#xff0c;大致思路是这样的&#xff1a; 每一个账号都有一个SearchFlow&#xff0c;搜索开始…

js - 执行上下文和作用域以及闭包

首先&#xff0c;咱们通常被"执行上下文"&#xff0c;"执行上下文环境"&#xff0c;"上下文环境"&#xff0c;"执行上下文栈"这些名词搞混。那我们一一来揭秘这些名字的含义。 这一块一直比较晦涩难懂&#xff0c;还是需要仔细去斟酌斟…

Spring之JDBCTemplate

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、Spring对不同的持久化支持&#xff1a; Spring为各种支持的持久化技术&#xff0c;都提供了简单操作的模板和回调 ORM持久化技术模…

从蚂蚁金服实践入手,带你深入了解 Service Mesh

本文整理自蚂蚁金服高级技术专家敖小剑在 QCon 上海 2018 上的演讲。我是来自蚂蚁金服中间件团队的敖小剑&#xff0c;目前是蚂蚁金服 Service Mesh 项目的 PD。我同时也是 Servicemesher 中国技术社区的创始人&#xff0c;是 Service Mesh 技术在国内最早的布道师。我今天给大…

Android应用开发—FragmentManager如何管理fragments

本文主要摘录自Android中使用FragmentManager管理fragments 和 浅谈FragmentManager与fragment之一二事 先讲下自己对fragment的理解&#xff1a; 对于fragment&#xff0c;有太多官方文档和博文来介绍&#xff0c;此处不做转述&#xff1a;我感觉android提供fragment这种组件…

数组指针 和 指针数组

最近发现公司有些人说怎样区分 数组指针 和 指针数组 &#xff1f; 其实 很简单&#xff1b; 数组指针&#xff0c; 先是&#xff08;定语 &#xff09; &#xff08;主体&#xff09;&#xff0c; &#xff08;定语 数组&#xff09; &#xff08;主体 指针&#xff09…

在云服务器上注意GeoServer和ShadowDataMap的跨域设置

在云服务器上注意GeoServer和ShadowDataMap的跨域设置 1、对于支持cors的网络资源 可以在ShadowDataMap的devserverconfig.json里设置相应的跨域资源 提示&#xff1a;geoserver发布的地图服务虽然同在一个服务器上&#xff0c;但是端口不一样&#xff0c;同样需要设置跨域 如&…