MVC设计思想:
基于java的web 应用系统采用的mvc架构模式,即model(模型),view(视图),controller(控制器)分离设计
Model 即处理业务逻辑的模块, 每一种处理一个模块
View负责页面显示,显示Model处理结果给用户,主要实现数据到页面转换过程
Controller负责每个请求的分发,把Form数据传递给Model处理,把处理结果的数据传递给View
1. 什么是MVC?
MVC是一种架构模式 --- 程序分层,分工合作,既相互独立,又协同工作
MVC核心思想:业务数据抽取同业务数据实现相分离
总结:
模型层(M) :业务数据的信息表示,关注支撑业务的信息构成,通常是多个业务实体的组合;
视图层(V): 为用户提供UI,重点关注数据的呈现;
控制器(C) : 相当于一个总调配中心,接受用户请求,并调用相应的模型处理最后通过视图给用户进行展示);
MVC(Model-View-Controller)设计思想
即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。
视图(View)代表用户交互界面;
模型(Model):就是业务流程/状态的处理以及业务规则的制定。
业务模型还有一个很重要的模型那就是数据模型。数据模型主要指实体对象的数据 保存(持续化)。
控制(Controller)可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求.
MVC的优点
大部分用过程语言比如ASP、PHP开发出来的Web应用,初始的开发模板就是混合层的数据编程。例如,直接向数据库发送请求并用HTML显示,开发速度往往比较快,但由于数据页面的分离不是很直接,因而很难体现出业务模型的样子或者模型的重用性。产品设计弹性力度很小,很难满足用户的变化性需求。MVC要求对应用分层,虽然要花费额外的工作,但产品的结构清晰,产品的应用通过模型可以得到更好地体现。
2 什么是springMVC?
springMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校验等)。
为什么要用springMVC?
基本上,框架的作用就是用来简化编程的,相对于servlet来说,获取表单参数,响应请求等变得更简单了。
SpringMVC 工作流出图:
springmvc的工作机制
在容器初始化时会建立所有url和controller的对应关系,保存到Map<url,controller>中.tomcat启动时会通知spring初始化容器(加载bean的定义信息和初始化所有单例bean),然后springmvc会遍历容器中的bean,获取每一个controller中的所有方法访问的url,然后将url和controller保存到一个Map中;
这样就可以根据request快速定位到controller,因为最终处理request的是controller中的方法,Map中只保留了url和controller中的对应关系,所以要根据request的url进一步确认controller中的method,这一步工作的原理就是拼接controller的url(controller上@RequestMapping的值)和方法的url(method上@RequestMapping的值),与request的url进行匹配,找到匹配的那个方法;
确定处理请求的method后,接下来的任务就是参数绑定,把request中参数绑定到方法的形式参数上,这一步是整个请求处理过程中最复杂的一个步骤。springmvc提供了两种request参数与方法形参的绑定方法:
① 通过注解进行绑定,@RequestParam
② 通过参数名称进行绑定.使用注解进行绑定,我们只要在方法参数前面声明@RequestParam("a"),就可以将request中参数a的值绑定到方法的该参数上.使用参数名称进行绑定的前提是必须要获取方法中参数的名称,Java反射只提供了获取方法的参数的类型,并没有提供获取参数名称的方法.springmvc解决这个问题的方法是用asm框架读取字节码文件,来获取方法的参数名称.asm框架是一个字节码操作框架,关于asm更多介绍可以参考它的官网.个人建议,使用注解来完成参数绑定,这样就可以省去asm框架的读取字节码的操作.
springMVC流程
用户发送请求至前端控制器DispatcherServle
注:DispatcherServlet作为springMVC的前端控制器,负责接收用户的请求并根据用户的请求返回相应的视图给用户(分发调度);相当于中央处理器,是整个流程控制的中心,有了dispatcherServlet减少了其它组件之间的耦合度。前端控制器(DispatcherServlet): 用户请求到达前端控制器,dispatcherServlet调用HandlerMapping(处理器映射器)。
3 处理器映射器(HandlerMapping) :前端控制器根据用户的url,请求处理器映射器(HandlerMapping)查找匹配该url的handler,并返回一个执行链(HandlerExecutionChain)。
*4 前端控制器收到HandlerMapping返还的Handler信息后,再请求处理器适配器(HandlerAdapter)调用相应的handler进行处理并返回给前端控制器一modelAndView。
处理器适配器(HandlerAdapter): HandlerAdapter根据DispatcherServlet 发来的handler信息找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- 处理器-Handler:Handler 是后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
(由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler;编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler)。
5 前端控制器拿到modelAndView之后,再请求视图解析器(ViewResolver)进行解析。
- 视图解析器View resolver: 负责将处理结果生成View视图。
(View Resolver首先根据逻辑视图名,解析成物理视图名(具体的页面地址),再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等)
6 最后前端控制器将返回的视图进行渲染并把数据装入到request域,返回给用户。* 视图View**(需要工程师开发) : View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)
为什么叫前端控制器?前端又是什么?
举个例子:假如你去医院看病,通过向分诊台的医院描述自己的病情,就可以得到医生的指导具体去看外科、内科或者神经科等等,这里我们的分诊台就扮演着前端控制器(Dispatcher)的角色,也叫做调度器,而各个科室就扮演着控制器(Controller)的角色,因为分诊台是在具体各个科室之前,所以这个模式就叫做前端控制器。
3 说说spring mvc中常用注解有哪些,分别什么作用?
@Controller标识这个类是一个控制器
@RestController= @Controller+ @ResponseBody
@Autowired 根据SpringMVC的依赖注入通过包扫描自动注入
@Resource 根据SpringMVC的依赖注入通过配置文件注入
@Service 用来声明业务层
@RequestMapping给控制器方法绑定一个uri/ 用来定义访问接口,可以在类名和方法上使用
@ResponseBody将java对象转成json,并且发送给客户端
@RequestBody将客户端请求过来的json转成java对象
@RequestParam当表单参数和方法形参名字不一致时,做一个名字映射
@PathVarible用于获取uri中的参数,比如user/1中1的值
Rest风格的新api
@GetMapping@DeleteMapping@PostMapping@PutMapping
其他注解
@SessionAttribute声明将什么模型数据存入session
@CookieValue获取cookie值
@ModelAttribute将方法返回值存入model中
@HeaderValue获取请求头中的值
4 如何在spring mvc实现RESTful 服务
1,导入jackson2包
2,开启注解驱动<mvc:annotation-driven/>
3,json交互=@RequestBody @ResponseBody
5 WebService如何与客户端交互
① webServices通过SOAP协议进行参数的接收与返回值的传递。
② SOAP协议在web上提供软件服务,使用WSDL文件进行说明,通过UDDI进行注册
③ WSDL文件是一个XML文档,用于说明一组SOAP消息以及如何交换这些信息,大多数情况下由软件自动生成和使用
④ XML是一种扩展型可标记语言,面向短期临时数据和万维网络。
⑤ UDDI是一个主要针对web服务供应商和使用者的项目,在用户能够调用web服务之前,必须确定这个服务包含哪些商务方法,找到被调用的接口定义,还要服务端来编制软件;UDDI是一种根据描述文章来引导系统查找响应服务的机制,UDDI利用SOAP消息机制来发布、编译、浏览及查找注册信息,它采用XML格式来封装各种不同类型的数据,并且发送到注册中心来返回需要的数据。
6 什么是拦截器?有什么用?spring mvc如何定义拦截器?
what:
类似于filter的一个对象,用于预处理以及后处理处理器(控制器)。
how:
新建class实现HandlerInterceptor重写三个方法:
preHandler
postHandler
afterCompletion
springmvc.xml中配置拦截器
7 springMVC与struts2的区别
一、拦截机制的不同
Struts2是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype,然后通过setter,getter把request数据注入到属性。Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了,只能设计为多例。
SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。
Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。
二、底层框架的不同
Struts2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。Filter在容器启动之后即初始化;服务停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。
三、性能方面
Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。所以,SpringMVC开发效率和性能高于Struts2。
四、配置方面
spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高。
8 .拦截器和过滤器的区别
① 拦截器inteceptor是基于java的反射机制实现的;
过滤器Filter是基于函数回调实现(filter接口中的doFilter方法是回调函数实现的)
② 拦截器不依赖于servlet容器;
过滤器filter依赖servlet,没有servlet无法回调doFilter
③ 拦截器只能对action请求起作用;
而filter可以对所有请求起作用,filter过滤范围比拦截器大
④ 拦截器可以访问action上下文,值栈里的对象;
而过滤器filter不能;
⑤ 在action的生命周期中,拦截器可以多次被调用;
而过滤器只能在容器初始化时被调用一次;
⑥ 拦截器可以获取IOC容器中的各个bean,而过滤器不行;