Spring-mvc 的处理流程
请求的分发
请求首先到达DispatcherServlet,应用服务器会根据Web应用中web.xml文件定义的url映射将相应的请求分发到DispatcherServlet中
请求的处理
DispatcherServlet会查找相应的HandlerMapping接口的实现类,调用其中的方法:HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception,该方法会返回一个HandlerExecutionChain。返回的HandlerExecutionChain中包含了零个或者是多个Interceptor和一个处理请求的Handler。DispatcherServlet会调用Interceptor中的preHandle() 方法。然后处理Handler,这个Handler相当于Struts中Action,在SpringMVC中默认的实现是Controller接口,是具体处理请求的代码所驻留的地方。事实上HandlerExecutionChain中的getHandler()返回的是一个Object类型。DispatcherServlet不会直接调用getHandler()返回对象中的方法,DispatcherServlet会查找相应的HandlerAdapter,然后具体通过HandlerAdapter来调用getHandler()返回的handler对象中的方法。就是说我们可以实现自己的HandlerAdapter然后通过IoC注入到DispatcherServlet中,从而可以实现一套自定义的控制器。随后DispatcherServlet会调用Interceptor中的postHandle()方法。
视图的处理
DispatcherServlet会期望Hander返回一个ModelAndView,DispatcherServlet会根据所返回的ModelAndView对象所包含的信息进行视图的渲染。起具体出来流程如下:
首先DispatcherServlet会根据LocaleResolver来识别请求中的Locale,开发人员可以自己实现LocaleResolver接口,然后通过IoC注入到DispatcherServlet中,然后DispatcherServlet会判断ModelAndView中是否已经包含了接口View的具体实现,如果包含了,则直接调用View中的方法render(Map model, HttpServletRequest request, HttpServletResponse response)。如果不包含,则说明该ModelAndView只是包含了View的名称引用,DispatcherServlet会调用ViewResolver中的resolveViewName(String viewName, Locale locale)来解析其真正的视图。该方法会返回一个View的具体实现。
视图的渲染
Spring支持多种视图技术,其中比较常用的包括有Jstl视图,Veloctiy视图,FreeMarker视图等。对Jstl视图的渲染Spring是通过JstlView这个类具体实现的。事实上其最终的渲染是交给容器来做的,Spring只是通过RequestDispatcher实现了服务器内部请求的Forward。而对于模板视图,如Veloctiy和FreeMarker等,Spring会初始化其相应的模板引擎,由模板引擎生成最终的Html页面然后在合并到Response的输出流中。
异常的处理
如果在Hander中处理请求是抛出异常,DispatcherServlet会查找HandlerExceptionResolver接口的具体实现,该接口定义了一个方法:
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex),实现类需要实现该方法以便对异常进行处理,最后该方法需要返回一个ModelAndView。
SpringMVC的一些总结
灵活的Interceptor,通过Interceptor我们可以在一个请求处理前和请求处理完成之后做相应的操作,通过Interceptor机制,我们可以做authentication, logging, and filtering等。
良好的表单支持,在SpringMVC的Controller继承体系结构中,其具体的子类对表单(Form)提供了良好的支持。能够很好的支持单个表单的显示、修改、提交操作。同时也提供了表单的分步提交。
可定制的数据绑定(Data Binding)。
多视图技术的支持,SpringMVC同时支持Jstl, Velocity 等多中视图技术,但是这同时也会引出一个问题,因为各种视图技术都有自己的一套方法来处理国际化,例如Jstl和Velocity处理国际化的方式就很不相同。因此在多个视图技术并存的应用中,国际化也是一个需要注意的问题。
其Handler(控制器)作为Bean定义在Spring容器中,因此能享受容器带来的服务。
Handler(控制器)具有良好的可测试性。
spring mvc
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
apache commons介绍
iteye_4836
2020-02-23 20:10:50
Java Collection和Collections的区别?,Collections 实现sort排序
面試題, 一、 Collection 1.Collection 是一個 頂級集合是接口(如圖) 2.提供所以集合的共性方法 * 一、共性方法: * 1.add(): 添加對象到集合 * 2.rem
半亩方糖里
2020-07-06 19:53:06
Java集合 HashMap解析(源码分析)
半亩方糖里
2020-06-03 05:51:19
Java Collection和Collections的区别?
半亩方糖里
2020-06-03 05:51:19
Java 泛型 泛型规范 extends 和 super 的区别?
半亩方糖里
2020-06-03 05:51:19
Java 反射详解。(入门篇)
半亩方糖里
2020-05-17 05:44:11
Java 注解 注解入门 内置注解 元注解 自定义注解
半亩方糖里
2020-05-14 06:24:53
Java IO 总结。 字节流,字符流,Buffer缓冲,Properties集合IO 解决字符编码的问题的类 序列化和反序列化 等,
半亩方糖里
2020-05-09 10:16:34
Java IO 解决字符编码乱码的问题的类InputStreamReader ,OutputStreamWriter 使用教程.
半亩方糖里
2020-05-09 10:16:34
Java IO 打印流PrintStream 可写入任意格式数据,可改变输出到控制台的数据到文件里 教程
半亩方糖里
2020-05-09 10:16:34
Java IO教程 OutputStream InputStream 读写字节流
半亩方糖里
2020-05-09 10:16:34
Java IO Reader,Writer类 读写字符 用法详解教程。
半亩方糖里
2020-05-09 10:16:34
Java IO 读取类对象的流 ObjectInputStream,ObjectOutputStream 使用教程.
半亩方糖里
2020-05-09 10:16:34
Java IO Properties类 可以IO的集合 的总结 使用教程
半亩方糖里
2020-05-09 10:16:34
Java IO 4个Buffed的缓冲顶级类(比如bufferedInputStream)的 总结教程
半亩方糖里
2020-05-09 10:16:34