1、 spring-framework模块
springframework 包含20多种模块,可以分为:corecontainer、DateAccess、Web、AOP、 Instrumentation、 Messaging、Test。
Spring-Core模块和sping-beans模块是spring framework的基础模块,实现了IoC和依赖注入的功能。其他模块很多都用到这两个功能。
Springmvc就是spring中web模块里的一部分。spring web模块可以具体分为 spring-web、spring-webmvc、spring-websocket和spring-webmvc-portlet。
2、 webmvc
mvc模式是一种常用的web构架模式。将应用分为了三个部分:model(模型)、view(视图)、controller(控制器)。
Model:根据controller的指令,为viewer提供数据
View:根绝model的变化产生新的输出.
Controller:处理用户交互的部分。可以想model发送指令来更新model,也可以向view层发送指令来更新view .
3、 springweb mvc
spring mvc 围绕一个叫DispatcherServlet的调度器来设计的。
Spring mvc和其他的mvc框架一样,设计了一个servlet来调度request请求和controller。但是spring的DispatcherServlet是基于spring IoC设计的,它可以让应用灵活的运用spring的其他功能,比如spring-beans、spring-aop等等。
Spring mvc中处理request请求的过程如下图.
3-1、DispatcherServlet
DispatcherServlet就是一个从HttpServlet类继承来的,在应用中需要设置map来接受处理相应的url请求。标准的jave EE Servlet 3.0+ 中代码可能是写成下面这样的。
public class MyWebApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet()); registration.setLoadOnStartup(1); registration.addMapping("/example/*"); } } |
就是说这个servlet在运行中接收处理url为“http://Host:Port/example/*”开头的所有请求。
上面有一个类叫WebApplicationInitializer ,Spring中也有这个基础的接口。Spring做的就是在实现了这个类的灵活配置,通过配置文件,用户就可以实现自己的DispatchServlet。就不需要再特地编写代码了。因为是一个servlet,所以关于DispatchServlet的相关配置也是写在web.xml中的。Spring mvc是这样实现servlet的配置的。
<web-app> <servlet> <servlet-name>example</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>example</servlet-name> <url-pattern>/example/*</url-pattern> </servlet-mapping> </web-app>
|
Spring-context中有一个接口叫ApplicationContext, 这个接口是继承 spring-bean中的BeanFactory而来,作用是可以在java应用中提供一个基于java-bean的附加功能。很多javaEE的应用利用ApplicationContext来做一个实例声明,依靠ContextLoader类来自动加载实例化需要的类,而不是在代码中去实例化某个类了。
Spring的DispachServlet也有自己的WebApplicationContext,在WebApplicationContext中定义需要在应用startup 的时候需要初始化的类的实例。
默认情况下这个Servlet的configuration文件是与在“/WEB-INF/”目录下的[servlet-name]-servlet.xml。工程启动的时候,读取web.xml文件后会去找这个与定义的servlet-name相同的配置文件。也可以通过在web.xml的配置,指定特殊目录下的配置文件,如下所示。
<web-app> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/root-context.xml</param-value> </context-param> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
|
Spring中的DispatcherServlet需要用到一些特定的beans来处理request和渲染输出view。这些beans也是springmvc的一部分。可以根据需要来选择使用配置哪些beans。
Bean type | Explanation |
将request请求映射到handler中或者拦截器中 | |
HandlerAdapter | 处理适配器,帮助DispatcherServlet处理映射hanlder中的过程。 |
异常映射情况下的处理 | |
解析view name,找到正确的view | |
用来解决locale | |
主题 | |
处理multi-part requests,如上传文件 | |
处理FlashMap |