Spring MVC 整体介绍
大学时写的的文章,当时文章水平略差,大家见谅。
Spring MVC 是以servlet 为核心进行实现的,统一入口进入拿到请求后,做一次路由,找到对应的controller及对应的RequestMapping,完成逻辑的后,返回对应的视图或者数据元,如果是顺道完成视图的解析,返回对应html,完成响应。
开发步骤:
1、建立Spring 工程,引入对应Spring MVC 所需要的Jar。
2、创建web.xml 文件,指定dispacherServlet,然后指定拦截的请求规则,比如说 *.do,再配置对应的listener,还有spring 依赖的bean的配置文件
3、创建springMVC-servlet.xml 类似于这样的一个配置文件,设置启用注解,设置对应扫描的包,然后指定页面存在的位置,指定前缀后缀什么
4、在对应目录下创建一个controller 类,并指定对应注解,创建对应RequestMapping 注解的函数,设置URI。
5、编写对应逻辑。
6、部署&运行
内部处理流程:
1、dispacher Servlet 拦截到外部所有的请求
2、根据HandlerMapping找到对应的Handler,并将一堆拦截器和Handler封装至HandlerExecutionChain
3、带着Handler 找到对应的HandlerAdapter,完成对应的逻辑处理。
4、带着具体的Model&View返回
5、首先通过ViewResolver对于视图进行解析,并完成 对应的视图渲染,反馈给Dispacher Servlet。
6、最后dispacher Servlet 完成响应
image.png这就是Spring MVC 中的一个简要流程。
这里的Handler 是需要我们手动实现逻辑的,也就具体的controller、然后ModleAndView 也是我们开发中所接触的ModelAndView,具体的渲染和解析的过程其实就是将对应视图变为前端可识别HTML 文档的形式,过程中将对应的对象信息解析进去就OK了。
具体的看后续操作~
这里介绍的主要是核心的分发器dispacherServlet,在说之前先来看一看常规的servlet。
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
sevlet 是Java 在Java web开发中定义的一个规范,任何一个可以处理外部用户请求的应用组件都需要实现这个接口(即作为一种servlet 存在)。
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
这是GenericServlet,一种servlet的通用实现,提供了servlet应该有的基础功能。
我们常用的是HTTP servlet,一种基于HTTP协议对于GenericServlet实现的Servlet,能够对于外部HTTP请求进行对应的处理并且完成对应的响应。并且针对各种HTTP 请求原语实现了对应的处理方法(具体来说是要求使用者自己必须实现)
DispacherServlet 就是一种HTTP servlet ,它实现了对于所有符合规则的的HTTP请求进行拦截,并对具有handler的请求完成具体的逻辑。
Spring MVC 中 DispacherServlet的核心初始化函数是这一个:
protected void initStrategies(ApplicationContext context) {
this.initMultipartResolver(context);//初始化多部请求解析器,没有默认的实现
this.initLocaleResolver(context);//初始化地域解析器,默认实现是AcceptHeaderLocaleResolver
this.initThemeResolver(context); //初始化主题解析器,默认实现是FixedThemeResolver
this.initHandlerMappings(context);//初始化处理器映射,这是个集合, 默认实现是BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping
this.initHandlerAdapters(context);//初始化处理器适配器,这是个集合,默认实现是HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter和AnnotationMethodHandlerAdapter
//初始化处理器异常解析器,这是个集合,默认实现是AnnotationMethodHandlerExceptionResolver,ResponseStatusExceptionResolver和DefaultHandlerExceptionResolver
this.initHandlerExceptionResolvers(context);
this.initRequestToViewNameTranslator(context);//初始化请求到视图名解析器,默认实现是DefaultRequestToViewNameTranslator
this.initViewResolvers(context);//初始化视图解析器,这是个集合,默认实现是InternalResourceViewResolver
this.initFlashMapManager(context);
}
通过ApplicationContext完成对应初始化,对应的调用关系可以搜一下对应DispacherServlet 然后找到对应函数 alt + F7 查看就OK了
初始化关系大体过程是这样的,到这里大体能清除整个的层级关系就好:
1、首先初始化GenericServlet
2、HttpServletBean的初始化
3、FrameworkServlet 初始化
4、完成最终DispacherServlet 初始化
Spring MVC 最核心的差不多就这么多东西,更细节的东西需要亲自动手去翻看源码~