SpringMVC的工作流程
1、简单的谈一下SpringMVC的工作流程?
流程
1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给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响应用户
2、简要说说Struts2的处理流程?
Struts2框架的大致处理流程如下:
1、加载类(FilterDispatcher)
2、读取配置(struts配置文件中的Action)
3、派发请求(客户端发送请求)
4、调用Action(FilterDispatcher从struts配置文件中读取与之相对应的Action )
5、启用拦截器(WebWork拦截器链自动对请求应用通用功能,如验证)
6、处理业务(回调Action的execute()方法)
7、返回响应(通过execute方法将信息返回到FilterDispatcher)
8、查找响应(FilterDispatcher根据配置查找响应的是什么信息如:SUCCESS、ERROER,将跳转到哪个jsp页面)
9、响应用户(jsp--->客户浏览器端显示)
10、struts2标签库(相比struts1的标签库,struts2是大大加强了,对数据的操作功能很强大)
请求(.action)---->经过StrutsPrepareAndExecuteFilter 核心控制器---->进入到Struts2的拦截器Interceptor
(实现代码功能)----->通过action的名称找对应的Action类----->执行Action类的execute方法----->通过exec
ute方法中返回的字符串,在Struts.xml中找对应的结果页面(result)【在action执行之前,执行了defaultStack
拦截器栈】
* 拦截器 在 struts-default.xml定义 【它位于sruts2-core-xxx.jar目录下】
* 执行拦截器 是 defaultStack 中引用拦截器
3、 说说Struts2的输入校验流程
Struts2校验框架进行校验时,将执行以下流程:
A:类型转换器负责对字符串的请求参数执行类型转换,并将这些值设置成Action的属性值
B:在执行类型转换过程中可能出现异常,如果出现异常,将异常信息保存到ActionContext中
convertionError拦截器将负责将其封装到fieldError里,如果没有异常,直接进入第3步
C:调用Struts2的内置校验规则进行输入校验
D:通过反射调用validateXXX()方法
E:调用Action类中的validate()方法
F:如果上面的几步中没有出FiledError,就调用Acton中的逻辑处理方法,如果有,则进入input视图
所以,在进行校验时,别忘记在Action中的配置名为input的结果如:<result name=“input”>validate.jsp</result>
4、拦截器和过滤器有什么区别?
①拦截器是基于java的反射机制的,而过滤器是基于函数回调
②过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
拦截器 :是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态
代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字
符串,甚至在你抛出异常的时候做业务逻辑的操作。
5、Struts2请求流程
1、客户端发送请求
2、请求先通过ActionContextCleanUp-->FilterDispatcher
3、FilterDispatcher通过ActionMapper来决定这个Request需要调用哪个Action
4、如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,这儿已经转到
它的Delegate--Dispatcher来执行
5、ActionProxy根据ActionMapping和ConfigurationManager找到需要调用的Action类
6、ActionProxy创建一个ActionInvocation的实例
7、ActionInvocation调用真正的Action,当然这涉及到相关拦截器的调用
8、Action执行完毕,ActionInvocation创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。添加PreResultListener可以在Interceptor中实现。
6、SpringMVC与Struts2的主要区别?
①springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
②springmvc是基于方法开发,传递参数是通过方法形参,可以设计为单例或多例(建议单例),struts2是基于类开发,
传递参数是通过类的属性,只能设计为多例。
③Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request对象内容进
行解析成方法形参,将响应数据和页面封装成ModelAndView对象,最后又将模型数据通过request对象传输到页面。 Jsp视图解析器默认使用jstl。