SpringMVC的简介和⼯作流程
⼀、简介
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow⾥⾯。Spring 框架提供了构建 Web 应⽤程序的全功能MVC 模块。SpringMVC是⼀种web层的mvc框架,⽤于替代servlet(处理响应请求,获取表单参数,表单验证等)
⼆、⼯作流程
1、⽤户发送请求⾄前端控制器DispatcherServlet。
2、DispatcherServlet收到请求调⽤HandlerMapping处理器映射器。
3、处理器映射器到具体的处理器(可以根据xml配置、注解进⾏查),⽣成处理器对象及处理器(如果有则⽣成)⼀并返回给DispatcherServlet。
4、 DispatcherServlet调⽤HandlerAdapter处理器适配器。
5、HandlerAdapter经过适配调⽤具体的处理器(Controller,也叫后端控制器)。
6、Controller执⾏完成返回ModelAndView。
7、HandlerAdapter将controller执⾏结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、ViewReslover解析后返回具体View.
10、DispatcherServlet根据View进⾏渲染视图(即将模型数据填充⾄视图中)。
11、DispatcherServlet响应⽤户。
三、理解
1、为什么要使⽤springMVC?
SpringMVC是⼀种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使⽤了MVC架构模式的思想,将Web层进⾏职责解耦。基于请求驱动指的就是使⽤请求-响应模型,框架的⽬的就是帮助我们简化开发,SpringMVC也是要简化⽇常Web开发。(处理业务数据的对象和显⽰业务数据的视图之间存在紧密耦合)
2、什么是MVC设计模式?
MVC即Model-View-Controller,将应⽤按照Model(模型)、View(视图)、Controller(控制)这样的⽅式分离。
springmvc常用标签视图(View):代表⽤户交互界⾯,对于Web应⽤来说,可以是HTML,也可能是jsp、XML和Applet等。⼀个应⽤可能有很多不同的视
图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及⽤户的请求,⽽不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。
模型(Model):是业务的处理以及业务规则的制定。模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计是MVC最主要的核⼼。MVC设计模式告诉我们,把应⽤的模型按⼀定的规则抽取出来,抽取的层次很重要,抽象与具体不能隔得太远,也不能太近。MVC 并没有提供模型的设计⽅法,⽽只是组织管理这些模型,以便于模型的重构和提⾼重⽤性。
控制(Controller):可以理解为从⽤户接收请求, 将模型与视图匹配在⼀起,共同完成⽤户的请求。划分控制层的作⽤也很明显,它清楚地告诉你,它就是⼀个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的⽤户请求。控制层并不做任何的数据处理。
3、SpringMVC的特点
清晰的⾓⾊划分:控制器(controller)、验证器(validator)、命令对象(command object)、表单对象(formobject)、模型对象(model object)、 Servlet分发器(DispatcherServlet)、处理器映射(handler mapping)、视图解析器(view resolver)等。每⼀个⾓⾊都可以由⼀个专门的对象来实现。
强⼤⽽直接的配置⽅式:将框架类和应⽤程序类都能作为JavaBean配置,⽀持跨多个context的引⽤,例如,在web控制器中对业务对象和验证器(validator)的引⽤。
可适配、⾮侵⼊:可以根据不同的应⽤场景,选择合适的控制器⼦类(simple型、command型、form型、wizard型、multi-action型或者⾃定义),⽽不是从单⼀控制器(⽐如Action/ActionForm)继承。
可重⽤的业务代码:可以使⽤现有的业务对象作为命令或表单对象,⽽不需要去扩展某个特定框架的基类。
可定制的绑定(binding)和验证(validation):⽐如将类型不匹配作为应⽤级的验证错误,这可以保存错误的值。再⽐如本地化的⽇期和数字绑定等等。在其他某些框架中,你只能使⽤字符串表单对象,需要⼿动解析它并转换到业务对象。
可定制的handlermapping和view resolution:Spring提供从最简单的URL映射,到复杂的、专⽤的定制策略。与某些webMVC框架强制开
发⼈员使⽤单⼀特定技术相⽐,Spring显得更加灵活。
灵活的model转换:在Springweb框架中,使⽤基于Map的键/值对来达到轻易地与各种视图技术的集成。
可定制的本地化和主题(theme)解析:⽀持在JSP中可选择地使⽤Spring标签库、⽀持JSTL、⽀持Velocity(不需要额外的中间层)等等。
简单⽽强⼤的JSP标签库(SpringTag Library):⽀持包括诸如数据绑定和主题(theme)之类的许多功能。
JSP表单标签库:在Spring2.0中引⼊的表单标签库,使得在JSP中编写表单更加容易。
Spring Bean的⽣命周期可以被限制在当前的HTTP Request或者HTTP Session。
4、SpringMVC的优点
让我们能⾮常简单的设计出⼲净的Web层和薄薄的Web层
进⾏更简洁的Web层的开发
天⽣与Spring框架集成(如IoC容器、AOP等)
提供强⼤的约定⼤于配置的契约式编程⽀持
⾮常灵活的数据验证、格式化和数据绑定机制
⽀持Restful风格
5、SpringMVC的⼊门程序
<web-app>
<servlet>
<!-- 加载前端控制器 -->
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
加载配置⽂件
默认加载规范:
* ⽂件命名:l====l
* 路径规范:必须在WEB-INF⽬录下⾯
修改加载路径:
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>l</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
<beans>
<!-- 配置映射处理器:根据bean(⾃定义Controller)的name属性的url去寻handler;springmvc默认的映射处理器是BeanNameUrlHandlerMapping-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 配置处理器适配器来执⾏Controller ,springmvc默认的是SimpleControllerHandlerAdapter
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 配置⾃定义Controller -->
<bean id="myController" name="/hello.do" class="ller.MyController"></bean>
<!-- 配置sprigmvc视图解析器:解析逻辑视图;
后台返回逻辑视图:index
视图解析器解析出真正物理视图:前缀+逻辑视图+后缀====/WEB-INF/jsps/index.jsp
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsps/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
⾃定义处理器
public class MyController implements Controller{
public ModelAndView handleRequest(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
ModelAndView mv = new ModelAndView();
//设置页⾯回显数据
mv.addObject("hello", "欢迎学习springmvc!");
//返回物理视图
/
/mv.setViewName("/WEB-INF/jsps/index.jsp");
//返回逻辑视图
mv.setViewName("index");
return mv;
}
}
6、SpringMVC常⽤注解及其作⽤
@Controller:标识这个类是⼀个控制器
@RequestMapping:给控制器⽅法绑定⼀个uri
@ResponseBody:将java对象转成json,并且发送给客户端
@RequestBody:将客户端请求过来的json转成java对象
@RequestParam:当表单参数和⽅法形参名字不⼀致时,做⼀个名字映射
@PathVarible:⽤于获取uri中的参数,⽐如user/1中1的值
Rest风格的新api
@RestController相当于@Controller+ @ResponseBody
@GetMapping@DeleteMapping@PostMapping@PutMapping
其他注解
@SessionAttribute:声明将什么模型数据存⼊session
@CookieValue:获取cookie值
@ModelAttribute:将⽅法返回值存⼊model中
@HeaderValue:获取请求头中的值
7、SpringMVC和Struts2的对⽐
框架机制:SpringMVC的⼊⼝是servlet,⽽Struts2是filter。
Filter在容器启动后就初始化,服务停⽌后销毁,晚于Servlet;Servlet在是在调⽤时初始化,先于Filter调⽤,服务停⽌后销毁。
拦截机制:
Struts2:1、Struts2框架是类级别的拦截,每次请求就会创建⼀个Action,和Spring整合时Struts2的ActionBean注⼊作⽤域是原型模式prototype(否则会出现线程并发问题),然后通过setter,getter吧request数据注⼊到属性;
2、⼀个Action对应⼀个request,response上下⽂,在接收参数时,可以通过属性接收,说明属性参数是让多个⽅法共享的;
3、Action的⼀个⽅法可以对应⼀个url,⽽其类属性却被所有⽅法共享,这也就⽆法⽤注解或其他⽅式标识其所属⽅法了。
SpringMVC:1、SpringMVC是⽅法级别的拦截,⼀个⽅法对应⼀个Request上下⽂,所以⽅法直接基本上是独⽴的,独享
request,response数据。⽽每个⽅法同时⼜何⼀个url对应,参数的传递是直接注⼊到⽅法中的,是⽅法所独有的。处理结果通过ModeMap 返回给框架;
2、在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建⼀个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作⽤域,需要添加@Scope注解修改;
Struts2有⾃⼰的拦截Interceptor机制,SpringMVC这是⽤的是独⽴的Aop⽅式,这样导致Struts2的配置⽂件量还是⽐SpringMVC⼤。
性能⽅⾯:SpringMVC实现了零配置,由于SpringMVC基于⽅法的拦截,有加载⼀次单例模式bean注⼊。⽽Struts2是类级别的拦截,每次请求对应实例⼀个新的Action,需要加载所有的属性值注⼊,所以,SpringMVC开发效率和性能⾼于Struts2。
配置⽅⾯:spring MVC和Spring是⽆缝的。从这个项⽬的管理和安全上也⽐Struts2⾼(当然Struts2也可以通过不同的⽬录结构和相关配置做到SpringMVC⼀样的效果,但是需要xml配置的地⽅不少);
SpringMVC可以认为已经100%零配置。
设计思想:Struts2更加符合OOP的编程思想, SpringMVC就⽐较谨慎,在servlet上扩展。
集成⽅⾯:SpringMVC集成了Ajax。
注意:springmvc是单例模式的框架,但它是线程安全的,因为springmvc没有成员变量,所有参数的封装都是基于⽅法的,属于当前线程的私有变量. 因此是线程安全的框架。所以效率⾼。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论