SpringMVC 简介 博客分类: SpringMVC mvc框架webjspspring
Web MVC framework
1.1 Spring MVC介绍
1.是一个模型-视图-控制(model-view-controller)框架,它设计为围绕DispatcherServlet将请求分派给各个处理器,具有可匹配的映射处理器(handler mappings)、视图解析器(view resolution)、本地设置、时区和主题解析以及支持文件上传。
2.在Spring Web MVC中,您可以使用任何对象作为命令或表单支持对象; 您不需要实现框架特定的接口或基类。
1.2 Spring MVC特性
1.明确的角色分离。各个角色--控制器,验证器,命令对象,表单对象,模型对象,DispatcherServlet,映射处理器,视图解析等等都可以用专门的对象来实现。
2.框架和程序类都可以使用直接使用强大的JavaBeans配置,这些配置包含简单的上下文的引用,如从控制器到业务对象和验证器。
3.适用性,非侵入性,灵活性,定义你需要的任何控制器方法签名。可能会使用的如(@RequestParam, @RequestHeader, @PathVariable)。
4.可重用的业务代码,不需要重复写,使用现有业务对象如命令对象或表单对象代替。
5.可定制绑定和验证,如本地化数据和数值绑定,而不要只是用字符串表单对象进行手动解析和转换业务对象。
6.可定制映射处理器和视图解析器。映射处理器和视图解析器的策略范围从简单的基于URL配置到复杂的专用解析策略,比其他框架更灵活。
7.灵活的模型传输,基础key/value的map模型,很容易与任何视图技术集成。
8.可定制化本地化,时区和主题解析。支持JSPs或不带Spring标签库的JSP,支持JSTL,内置支持Velocity。
9.提供一个称为Spring标签库的简单强大JSP标签库,支持如数据绑定和主题等功能,在标记代码方面自定义标签库提供了最大的灵活性。
10.从Spring2.0开始就引入了JSP表单标签库,使在JSP里面写表单变得更简单。
11.Beans的生命周期范围限定在当前的HTTP请求或HTTP的Session中,不是由Spring MVC提供的是由使用的WebApplicationContext容器限定的。
1.3 请求处理流程
Spring的Web MVC框架与许多其他Web MVC框架一样,以请求为驱动,围绕一个*Servlet设计,将请求发送给控制器,并提供了其他促进Web应用程序开发的功能。 但是Spring的DispatcherServlet不仅仅是这样做。 它与Spring IoC容器完全集成,因此允许您使用Spring的其他所有功能。
1.请求处理流程图
DispatcherServlet是一个实际的Servlet(它继承自HttpServlet基类),因此可以Web应用程序中被声明。 您需要使用URL映射来映射要DispatcherServlet处理的请求。 以下是Servlet 3.0+环境中的标准Java EE Servlet配置:
public class MyWebApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { ServletRegistration.Dynamic registration = container.addServlet("example", new DispatcherServlet()); registration.setLoadOnStartup(1); registration.addMapping("/example/*"); } }在这个配置中以/ example开头的所有请求都将由名为Example的DispatcherServlet实例处理。WebApplicationInitializer是由Spring MVC提供的接口,可确保您的基于代码的配置被检测并自动用于初始化任何Servlet 3容器。AbstractAnnotationConfigDispatcherServletInitializer的接口的抽象基类实现通过简单地指定其servlet映射和列出配置类来更容易地注册DispatcherServlet。
也可以在web.xml中声明,下面是一个标准的Java EE 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>
在Web MVC框架中,每个DispatcherServlet都有自己的WebApplicationContext,它继承了所有已经在根WebApplicationContext中定义的bean。
2.Spring Web MVC中的典型上下文层次结构
在初始化DispatcherServlet时,Spring MVC将在Web应用程序的WEB-INF目录中查找名为[servlet-name] -servlet.xml的文件,并创建在那里定义的bean,覆盖全局范围内使用相同名称定义的任何bean的定义。
如以下DispatcherServlet
配置
<web-app> <servlet> <servlet-name>golfing</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>golfing</servlet-name> <url-pattern>/golfing/*</url-pattern> </servlet-mapping> </web-app>
使用上述Servlet配置,您需要在应用程序中有一个名为/WEB-INF/golfing-servlet.xml的文件; 该文件将包含您所有的Spring Web MVC特定组件(bean)。 您可以通过Servlet初始化参数更改此配置文件的指定位置。
3.Spring Web MVC中的单根上下文
可以通过设置一个空的ContextConfigLocation servlet init参数进行配置,如下所示:
<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>
WebApplicationContext是普通ApplicationContext的扩展,它具有Web应用程序所需的一些额外功能。 它与普通的ApplicationContext不同之处在于它能够解析主题,并且它知道它与哪个Servlet相关联(通过连接到ServletContext)。 WebApplicationContext绑定在ServletContext中,并且通过在RequestContextUtils类上的静态方法,您可以随时查找WebApplicationContext。
我们可以通过基于Java的配置实现
public class GolfingWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { // GolfingAppConfig defines beans that would be in root-context.xml return new Class[] { GolfingAppConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() { // GolfingWebConfig defines beans that would be in golfing-servlet.xml return new Class[] { GolfingWebConfig.class }; } @Override protected String[] getServletMappings() { return new String[] { "/golfing/*" }; } }
3.WebApplicationContext中的特殊Bean类型
HandlerMapping | 将请求映射到一个处理器列表,它包含前置处理器和后置处理器(处理拦截器),其细节由HandlerMapping实现而异。 最流行的实现支持注释控制器,但其他实现也存在。 |
HandlerAdapter | 主要是用来屏蔽DispatcherServlet 的技术细节,它帮助DispatcherServlet 调用映射到请求的处理程序,而不管实际调用哪个处理程序,如调用带注释的控制器需要解析各种注释。
|
HandlerExceptionResolver | 将异常映射到视图,也允许更复杂的异常处理代码。 |
ViewResolver | 将基于逻辑字符串的视图名称解析为实际的View类型。 |
LocaleResolver & LocaleContextResolver | 解决客户端正在使用的区域设置以及可能的时区,以便能够提供国际化的视图。 |
ThemeResolver | 解决您的Web应用程序可以使用的主题,例如,提供个性化的布局 |
MultipartResolver | 解析多部分请求,以支持从HTML表单处理文件上传。 |
FlashMapManager | 存储并检索“输入”和“输出”FlashMap,它可以用于将属性从一个请求传递到另一个请求,通常是通过重定向。 |
4.默认DispatcherServlet配置
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\ org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\ org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\ org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\ org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\ org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager一旦您在WebApplicationContext中配置了一个特殊的bean(如InternalResourceViewResolver),就会覆盖了该特殊bean类型的默认实现列表。 例如,如果配置了InternalResourceViewResolver,则会忽略ViewResolver实现的默认列表。
5.DispatcherServlet处理序列
在您设置了DispatcherServlet并且针对该特定DispatcherServlet启动了一个请求后,DispatcherServlet将按如下所示开始处理请求:
● 在请求中搜索并绑定WebApplicationContext作为控制器和进程中的其他元素可以使用的属性。默认情况下,它将在DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE键下绑定。contextClass | 实现WebApplicationContext的类,它实例化了这个Servlet使用的上下文。 默认情况下,使用XmlWebApplicationContext。 |
contextConfigLocation | 传递给上下文实例(由contextClass指定)以指示可以找到上下文的字符串,该字符串可能包含多个字符串(使用逗号作为分隔符)来支持多个上下文。在具有两次定义的bean的多个上下文位置的情况下,最后定义的优先级最高。 |
namespace | WebApplicationContext的命名空间。 默认为[servlet-name] -servlet。 |