Spring MVC的初始化和流程:
Spring MVC是Spring提供给Web应用的框架设计。
Spring MVC的根本是,它的流程和各个组件的应用和改造。
早期的MVC模型为:Servlet+JSP+Java Bean,使得前后台分离。
MVC的经典框架:Struts2和Hibernate,使得控制器和模型层分离,Java代码可以得到重用。
如今互联网开发:Web页面大部分采用Ajax请求,交互只需要JSON数据,使得对JSP的耦合度的依赖降低。
随着移动互联网的发展,依赖于页面编程的Struts不适合时代的发展了。
并且随着软件发展,迁移数据库的可能性很小,用不到Hibernate的HQL来满足移植数据库的要求。
Spring MVC结构松散,可以使用各类试图:JSON、JSP、XML、PDF。
DispatcherServlet是一个Servlet,可以拦截HTTP发送过来的请求。
当Servlet在init时,Spring MVC根据配置获取配置信息,获得URI和Handler的映射关系。
并给Handler加入拦截器,可在Handler执行前后加入代码。构成处理器执行链。
初始化视图解析器和处理器返回后,通过视图解析器定位视图,用模型渲染视图,来相应用户请求。
ps:
运行处理器和拦截器,需要一个对应的环境,即处理器的适配器。
处理器会返回模型和视图,若返回的视图是逻辑视图,则用视图解析器解析。
入门实例:
配置web.xml
设置Spring IOC的配置文件路径:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
设置监听器,ContextLoaderListener继承ServletContexListener,在Web工程前后,初始化或释放Spring IOC容器的资源。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
配置DispatcherServlet:
<servlet>
<!-- 注意:Spring MVC框架会根据servlet-name配置,找到/WEB-INF/dispatcher-servlet.xml作为配置文件载入Web工程中 -->
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 使得Dispatcher在服务器启动的时候就初始化 -->
<load-on-startup>2</load-on-startup>
</servlet>
<!-- Servlet拦截配置 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
本例子,Spring Ioc没有装载自己的类,但会加载一个dispathcer-servlet.xml的文件。
dispathcer-servlet功能:
可定义一个扫描的包,用以加载控制器和一些组件。
定义视图解析器,指定视图具体路径。
定义一个控制器(Controller):
说明,通过注解@Controller,Spring MVC扫描时,会把它看作是控制器加载进来。
@RequestMapping,指定对应的请求URI,Spring MVC解析URI后,存入HandlerMapping。
其中,RequestMappingHandlerAdapter的实例,实在DispatchServlet初始化的时候进行创建的。
Spring MVC初始化:
问题:String IoC容器上下文和映射请求上下文是如何初始化的呢?
其中,映射请求,是基于Spring IoC上下文扩展出来。
一、初始化Spring IoC上下文
1、Java Web容器为其生命周期中提供ServletContextListener接口。
2、通过上述接口,能在初始化DispatcherServlet之前,完成对Spring IoC容器的初始化。
3、Spring MVC把初始化工作交给了,ContextLoaderListener。
二、初始化映射请求上下文
若没有注册ContextLoaderListener,则ServletContextListener对Spring IoC容器执行初始化,然后再初始化各个组件。
这些组件,DispatcherServlet会根据内置配置文件DispatcherServlet.properties进行初始化。
推荐使用ContextLoaderListener进行初始化。
因为DispatcherServlet间接继承HttpServlet,因此,可载入Web容器中。
Web容器对于Servlet的初始化,首先是调用其init方法,DispatcherServlet被父类HttpServletBean初始化。
三、使用注解配置方式初始化
Spring3.1之后的版本提供了注解方式配置,可取消web.xml配置。
通过继承类,AbstractAnnotationConfigDispatcherServletInitializer,并实现它的方法,即可完成初始化。
在Servlet3.0之后,允许动态加载Servlet,只需实现ServletContainerInitializer接口即可。
Spring MVC框架在自己的包内实现了一个类SpringServletContainerInitializer,继承了上述接口,所以可加载开发者提供的Initializer。
从SpringServletContainerInitializer源码可知,只要实现了WebApplicationInitializer接口的onStartup方法,Spring MVC就会把类当做一个初始化器加载进来,并同时初始化Spring IoC上下文和映射关系上下文。
Spring MVC开发流程详解:
以一个注解@Controller标注,一般只需要通过扫描配置,就能够将其扫描出来,往往还要结合注解@RequestMapping去配置它。
@RequestMapping:可配置在类或方法上,作用是指定URI和哪个类或方法作为一个处理请求的处理器。
还可定义处理器的拦截器,启动时,解析@Controller中的@RequestMapping配置,再结合所配置的拦截器,就会组成多个拦截器和一个控制器的形式,存放到HandlerMapping中去。
请求到来时,通过请求信息找到HandlerMapping,进而找到对应的拦截器和处理器,这样就能够运行对应的控制器和拦截器。
控制器开发:
获取请求参数:
ps:虽然Spring MVC会自动解析代码中的方法参数,建议不要使用Servlet容器所给予的API,不然,就会使得控制器和Servlet容器紧密关联,不利于扩展和测试。
可通过@RequestParam注解获取HTTP请求参数,默认不允许对注解了的参数为空。否则注解启用required=false
从Session中获取参数,使用@SessionAttribute注解。
视图渲染:
默认使用JstlView进行渲染,即将查询出来的模型绑定到JSTL(JSP标准标签库)模型中,这样通过JSTL就可把数据模型在JSP中读出展示数据了。
MappingJackson2JsonView是一个非逻辑视图,对于它而言并不需要视图解析器进行解析。