0
点赞
收藏
分享

微信扫一扫

SpringMVC相关


一、什么是Spring MVC?

1.SpringMvc概述:
SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于 Spring FrameWork 的后续产品SpringMVC已经成为目前最主流的 MVC 框架之一它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful编程风格的请求。

2.什么是 MVC 设计模式?
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种用于设计创建 Web 应用程序表现层的模式。MVC中每个部分各司其职:

  • Model(模型): 通常指的就是我们的数据模型。作用一般情况下用于封装数据。
  • View(视图): 通常指的就是我们的jsp或者html。作用一般就是展示数据的。 通常视图是依据模型数据创建的。
  • Controller(控制器): 是应用程序中处理用户交互的部分。作用一般就是处理程序逻辑的。 它相对于前两个不是很好理解,这里举个例子:

例如: 我们要保存一个用户的信息,该用户信息中包含了姓名,性别,年龄等等。
这时候表单输入要求年龄必须是1~100之间的整数。姓名和性别不能为空。并且把数据填充到模型之中。
此时除了js的校验之外,服务器端也应该有数据准确性的校验,那么校验就是控制器的该做的。 当校验失败后,由控制器负责把错误页面展示给使用者。
如果校验成功,也是控制器负责把数据填充到模型,并且调用业务层实现完整的业务需求。

3.SpringMVC优点:
1)天生与Spring框架集成,如:(IOC,AOP)
2)支持Restful风格
3)进行更简洁的Web层开发
4)支持灵活的URL到页面控制器的映射
5)非常容易与其他视图技术集成,如:Velocity、FreeMarker等等
6)因为模型数据不存放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用)
7)非常灵活的数据验证、格式化和数据绑定机制、能使用任何对象进行数据绑定,不必实现特定框架的API
8)更加简单、强大的异常处理
9)对静态资源的支持
10)支持灵活的本地化、主题等解析

4.SpringMVC和Struts2的优略分析
共同点: 它们都是表现层框架,都是基于MVC模型编写的。 它们的底层都离不开原始ServletAPI。 它们处理请求的机制都是一个核心控制器。
区别:

  • Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
  • Spring MVC 是基于方法设计的,而Struts2是基于类,Struts2每次执行都会创建一个动作类。所以Spring MVC 会稍微比 Struts2 些。
  • Spring MVC 使用更加简洁,同时还支持 JSR303, 处理 ajax 的请求更方便 (JSR303是一套JavaBean参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean的属性上面,就可以在需要校验的时候进行校验了。)
  • Struts2 的OGNL 表达式使页面的开发效率相比Spring MVC
    更高些,但执行效率并没有比JSTL提升,尤其是struts2的表单标签,远没有html执行效率高

二、SpringMVC工作流程

1.Spring MVC 的核心组件

  • DispatcherServlet:前置控制器,是整个流程控制的核心,控制其他组件的执行,进行统⼀调度,降低组件之间的耦合性,相当于总指挥。
  • Handler:处理器,完成具体的业务逻辑,相当于 Servlet 或 Action。
  • HandlerMapping:处理器映射器,根据请求的url查找Handler。DispatcherServlet 接收到请求之后,通过 HandlerMapping 将不不同的请求映射到不不同的 Handler。
  • HandlerInterceptor:处理器拦截器,是⼀一个接口,如果需要完成⼀一些拦截处理,可以实现该接口。
  • HandlerAdapter:处理器适配器,Handler执行业务方法之前,需要进行一系列的操作,包括表单数据的验证、数据类型的转换、将表单数据封装到JavaBean等,这些操作都是由HandlerApater 来完成,开发者只需将注意力集中业务逻辑的处理上,DispatcherServlet通过HandlerAdapter 执行不同的Handler。
  • ViewResolver:视图解析器,DispatcheServlet 通过它将逻辑视图解析为物理视图,最终将渲染结果响应给客户端。
  • View:视图,View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)

相关名词解释:
ModelAndView:ModelAndView是springmvc框架的一个底层对象,包括Model和view),装载了了模型数据和视图信息,作为
Handler 的处理理结果,返回给DispatcherServlet。

HandlerExecutionChain:处理理器器执行链,包括两部分内容:Handler和HandlerInterceptor(系统会有⼀个默认HandlerInterceptor,如果需要额外设置拦截,可以添加拦截器器)。

2.SpringMVC工作流程:

SpringMVC相关_MVC


(1)用户访问浏览器,发送请求至前端控制器DispatcherServlet;

(2) 前端控制器DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handler;

(3)处理器映射器根据请求url找到具体的处理器,返回一个执行链HandlerExecutionChain给DispatcherServlet前端控制器;

(4)DispatcherServlet前端控制器 调用 HandlerAdapter处理器适配器;

(5)HandlerAdapter 经过适配调用 体处理器(Handler,也叫后端控制器);

(6)Handler执行完成返回ModelAndView;

(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;

(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;

(9)ViewResolver视图解析器解析后返回具体View;

(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)

(11)DispatcherServlet响应用户。

三、常用注解:

Spring MVC常用的注解有哪些?
@RequestMapping:
出现位置:
类上: 请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。 它出现的目的是为了使我们的URL可以按照模块化管理
方法上: 请求URL的第二级访问目录。
属性:
value:用于指定请求的URL。它和path属性的作用是一样的。 method:用于指定请求的方式。
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样。 例如: params = {“accountName”},表示请求参数必须有accountName params = {“moeny!100”},表示请求参数中money不能是100。 headers:用于指定限制请求消息头的条件。 注意: 以上四个属性只要出现2个或以上时,他们的关系是与的关系。
@RequestBody:
作用: 用于获取请求体内容。直接使用得到是key=value&key=value…结构的数据。 get请求方式不适用。
属性: required:是否必须有请求体。默认值是:true。当取值为true时,get请求方式会报错。如果取值为false,get请求得到是nul
@ResponseBody:
作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

@PathVariable:
作用: 用于绑定url中的占位符。例如:请求url中 /delete/{id},这个{id}就是url占位符。 url支持占位符是spring3.0之后加入的。是springmvc支持rest风格URL的一个重要标志。
属性: value:用于指定url中占位符名称。 required:是否必须提供占位符。
四、其他:
1.转发和重定向?

Spring MVC怎么样设定重定向和转发的?
(1)转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4"

(2)重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"
重定向和转发的区别?
======================================

转发的特点
地址栏不发生变化,显示的是上一个页面的地址
请求次数:只有1次请求
根目录:http://localhost:8080/项目地址/,包含了项目的访问地址
请求域中数据不会丢失

重定向的特点
地址栏:显示新的地址
请求次数:2次
根目录:http://localhost:8080/ 没有项目的名字
请求域中的数据会丢失,因为是2次请求

问:什么时候使用转发,什么时候使用重定向?

如果要保留请求域中的数据,使用转发,否则使用重定向。

以后访问数据库,增删改使用重定向,查询使用转发。

问:转发或重定向后续的代码是否还会运行?

无论转发或重定向后续的代码都会执行

2.过滤器和拦截器的区别?
(1).过滤器:

依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等

(2).拦截器:

依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理

(3).过滤器和拦截器的区别:

①拦截器是基于java的反射机制的,而过滤器是基于函数回调。

②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。


举报

相关推荐

0 条评论