Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等等。
http协议,请求和响应
SpringMVC框架主要功能: 实现前后端的交互.
交互:
1. 前端通过http请求可以携带参数访问后端服务器. 请求
2. 后端服务器可以将结果通过响应交还给前端. 响应
三种控制器向视图传递数据的方式
-
request对象方式,控制器diamante与HttpSerletRequest紧耦合,不能进行离线的是,不推荐。
-
ModelAndView方式显然繁琐复杂,不推荐
-
.ModelMap方式最为简洁,推荐使用
session
在开发中经常需要利用session存储共享信息,springmvc对session提供了封装,设计了简单方式访问session对象方式:在 控制器上定义Httpsession类型参数,springmvc会把session对象注入到控制器中,在控制器中可以访问这个对象
转发和重定向
转发:是服务器内部的控制器类和视图协作完成同一项任务处理的过程,
使用转发的目的就是请控制器处理的结果交给视图取显示,转发是一个请求处理过程两个连续接力处理步骤。相当于取食堂一次买饭的两个步骤,打饭然后收钱
重定向:是http协议提供的功能,在客户端请求服务器,服务器在响应中反馈状态码302,并且提供目标的URL地址,浏览器收到302和URL地址以后,立即向新的URL发起请求,这个重定向的本质是浏览器根据第一次请求结果向新的URL发起第二次请求。相当于取食堂买饭,第一个窗口告诉我说卖完了,让我取第二个窗口请求买饭,一共两次请求才结束过程。
转发和重定向的区别
-
从请求次数上区别,转发是一次请求,重定向是两次请求
-
转发是以请求两个环节协作,控制器转发到视图
-
重定向取两个请求,第一次请求结束告诉浏览器可以转到另一个请求
-
使用目的不同
-
转发的目的是协作,控制器向处理业务能力,然后利用转发将处理结构转发到视图显示业务结果
-
重定向的目的是URL跳转,一个URL处理完成以后,跳转到另一个URL
3,作用域有差别
-
转发是一次请求,在一个请求处理期间可以利用同一个request数据共享
-
重定向是两次请求,两次请求或各自创建request,这是不能利用request共享数据
拦截器
是springMVC中的组件,可以使得若干个请求路径在被处理时,都会执行拦截器的代码,并且,拦截器可以选择阻止程序继续向后执行,或选择放行,那么,程序就可以执行
在springmvc中,实现HandlerInteceptor拦截器接口,这个类就是拦截器
需要实现三个方法 handle:处理
-
preHandle:在执制器之前执行
-
posrHandle:在控制器处理之后执行
-
afterCompletion:在视图完成之后执行
springMVC拦截器必须在springMVC的配置类中进行配置才能使用,使用步骤
-
将配置类实现springMVC提供的配置类接口WebMVCConfigurer接口,这个配置接口中包含了注册拦截器的方法,并且必须在配置类上加一个@EnableWebMVC注解
-
重写配置类接口WeBmvcConfigurer接口的addIntercepors方法,在方法中注册拦截器对象,已经拦截位置
拦截器可以实现用户登录的权限管理,实现思路是:判断用户是否登录,以登录 true,未登录false并且重定向为登录页面
拦截器的配置
拦截器需要拦截多个URL的问题
经典MVc模式中,M是值业务模型,V是值用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使用一个程序可以使用不同的表现形式,其中,View的定义比较清晰,就是用户页面
M:model业务模型
V:view用户界面,视图,就是给用户呈现数据的页面
C:control控制层
历史说明:
JSP动态页面 html代码 + java代码 写到一起 xxx.jsp
不方便后期维护. 页面和业务执行紧紧的绑定在一起耦合性高.
小结:
1.MVC是一种设计思想,编码中降低代码的耦合性
2.前段专注于开发页面view
3.后端专注于开发后端model
4.2开发者通过control进行控制
层级代码结构
说明:MVC设计思想,实现了前段和后端的松耦合,但是根据实际的开发情况,很多的业务逻辑比较复杂,如果说所有的代码都写到同一个java类中,这样的代码很臃肿,为了很好的实现MVC设计思想,所以后端代码也应该分层
分层说明:
-
控制层Controller与前端页面交互的@Controller
-
业务层Service编辑业务逻辑@Service
-
持久层Mapper实现数据库的相关操作 @Repository(暂时)
在类的数量上mapper至少2个,Service至少两个 Controller一个实现类
AbstractAnnotationConfigDispatcherSerletInitialzer是springMVC提供的抽象基类,这个类已经将springMVC的dispatcherServlet等组件配置完成,只需要继承这个类就可以轻松的完成spring配置。
@re'questPa'ram:解决地址名字和java关键字冲突,@requestParam “if” String ifv
Servlet机制
servlet是java servlet的简称,称为小服务程序或者服务连接器,用java编写的服务器端程序,具有独立平台和协议的特性,主要功能在于交互是的浏览和生成数据,生成动态内容
总结:servlet是java实现前后端的数据交互的一种机制
在servlet组件作为项目的控制器中,如果有一些功能,用户注册等,都需要创建一个servler,数量过多,不易管理和维护,也会消耗较多的内存空间。
核心对象
-
request对象
-
response对象
接受客户端提交的请求参数
在软件中无论注册登录还是填写收获地址,都需要将在浏览器表单上的数据提交到服务器,最终存储起来,springmvc可以处理用户请求,也提供了处理用户提交数据到功能
-
使用控制器方法参数接受表单数据:封装表单数据,method对应请求方法,action对应url
-
使用javabean作为参数接收表单数据:封装数据到一个单独的类中
-
使用request对象接受数据,控制器注入request对象,这样就可以获取任何请求参数包含,请求头信息,ip等信息,由于request包含getPramater方法,也可以获取请求表示数据。
中文乱码
springMVC程序启动前状态说明
父子容器的概念
-
spring容易(内存中的一大块空间)由于IOC.DI的机制,可以作为第三方管理者,所以作为父类
-
springMVC容器,之中只负责Controller曾的相关对象管理
springMVC 流程
springMVC调用流程图
重要组件
-
前端控制器 DispatcherServlet 实现请求的流转
-
处理器映射器 handlerMapping实现了请求路径与方法之间的映射.
-
处理器适配器 handlerAdapter处理器的管理器 内部有N个处理器. 针对不同的用户请求 调用不同的处理器完成任务
-
视图解析器 ViewResolver直线页面路径的拼接
-
controller,控制器,具体处理请求的组件
-
model and view,controller组件处理完请求后得到的结果,有数据与视图名称组成
springMVC运行流程
用户发起请求时,第一步经过前端控制器,
但是前端控制器 只负责请求的转发和响应.不做任何业务处理.将请求转发给处理器映射器.
处理器映射器接收到前端控制器的请求之后,查询自己维护的服务列表信息.
如果服务列表中没有这个URL的key. 该程序不能处理用户的请求,则返回特定数据,前端控制器接收之后响应用户404.
如果服务列表中有该URL key 则说明请求可以正常执行. 将该方法的对象返回给前端控制器.
前端控制器将返回的方法进行接收,但是由于前端控制器只负责转发和响应,不能直接执行该方法.所以交给处理器适配器执行.
处理器适配器根据方法的类型(xml配置文件/注解/其他方法),处理器适配器在自己的处理器库中挑选一个最为合适的处理器去执行该方法. 当处理器执行该方法时标识业务开始. 将最终的处理的结果通过ModelAndView对象进行包裹,返回给前端控制器.
ModelAndView: Model: 代表服务器返回的业务数据 View: 服务器端返回的页面的名称
视图解析器 将View中的数据进行解析 拼接一个完整的页面路径 前缀/hello后缀
视图渲染: 将数据与页面进行绑定. 这样用户就可以在页面中看到具体的数据.
由于现在流行前后端分离. 所以SpringMVC省略了视图解析和视图渲染.只有前5步. 核心注解: @ResponseBody 省略6-7步