【Spring MVC】5.1、Spring MVC起步

在基于HTTP协议的Web应用中,Spring MVC将用户请求在调度Servlet、处理器映射、控制器以及视图解析器之间移动,再将用户结果返回给用户。

我们将介绍请求如何从客户端发起,经过Spring MVC中的组件,最终回到客户端。

1、跟踪Spring MVC的请求

0、请求:请求离开浏览器时,带有用户请求内容的信息。一般包含请求的URL、用户提交的表单信息等。

1、前端控制器:前端控制器是一种常用的Web应用程序模式。服务器使用一个单例的Servlet(Spring的DispatcherServlet)作为前端控制器,将请求委托给应用程序的其它组件来执行实际的处理。

2、查询映射并分发请求:DispatcherServlet的任务是讲请求发送给Spring MVC控制器。DispatcherServlet收到请求后,根据请求携带的URL信息,查询处理器映射,确定请求对应的控制器,并发送给控制器。

3、控制器处理请求:控制器得到请求后,会获取请求中用户提交的信息,并等待控制器处理这些信息。

4、模型和视图名:控制器处理完数据后,会产生一些信息(称为模型),为了显示,这些模型需要发送给一个视图。控制器把模型数据打包,并标示出用于渲染输出的视图名,然后将请求、模型、视图逻辑名发送回给DispatcherServlet

5、视图解析器:DispatcherServlet根据逻辑视图名找到真正的视图实现。

6、视图渲染:根据找到的视图实现,并将模型数据交付给视图实现,即可将数据渲染输入。

7、传递到客户端:这个输出会通过响应对象传递给客户端。

2、搭建Spring MVC

2.1、配置DispatcherServlet

传统方式:配置在web.xml中,这个文件放到应用的WAR包中。

现在方法:使用Java将DispatcherServlet配置到Servlet容器中。

public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
  
  @Override
  protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[] { RootConfig.class };
  }

  @Override
  protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] { WebConfig.class };//指定配置类
  }

  @Override
  protected String[] getServletMappings() {
    return new String[] { "/" };//将DispatcherServlet映射到“/”
  }

}

扩展AbstractAnnotationConfigDispatcherServletInitializer的任意类都会自动配置DipatcherServlet和Spring应用上下文,Spring的应用上下文会位于应用程序的Servlet上下文之中。

getServletMappings()方法将一个或多个路径映射到DispatcherServlet上。本例中“/”,代表是应用的默认Servlet,会处理进入应用的所有请求。

要理解另外2个方法,需要先理解DispatcherServlet和一个Servlet监听器(ContextLoaderListener)的关系。

2.2、两个应用上下文之间的关系

DispatcherServlet启动时,创建Spring应用上下文,加载配置文件或配置类中声明的bean。

getServletConfigClasses()方法要求DispatcherServlet加载应用上下文时,使用定义在WebConfig配置类中的bean。

ContextLoaderListener会创建另外一个应用上下文

我们希望DispatcherServlet记载包含Web组件的bean,如控制器、视图解析器以及处理器映射;而ContextLoaderListener要加载应用中其它bean,通常是驱动应用后端的中间层和数据层组件。

AbstractAnnotationConfigDispatcherServletInitializer 会同时创建DispatcherServlet和ContextLoaderListener。

getServletConfigClasses()方法返回的带有@Configuration注解的类会用来定义DispatcherServlet应用上下文的bean。

getRootConfigClasses()方法返回的带有@Configuration注解的类将会用来配置ContextLoaderListener创建的应用上下文中的bean。

Servlet3.0之前的服务器,只能支持web.xml的配置方式;Servlet3.0及以后版本才支持AbstractAnnotationConfigDispatcherServletInitializer 的配置方式。

2.3、启动Spring MVC

传统方法:使用XML配置Spring MVC组件

现在方法:使用Java配置Spring MVC组件

最简单的Spring MVC配置

@Configuration
@EnableWebMvc
public class WebConfig {
}

这样就能启动Spring MVC,但是有以下问题:

1、没有配置视图解析器,Spring使用默认的BeanNameViewResolver,这个视图解析器会查找ID与视图名称匹配的bean,并且查找的bean要实现View接口,以这样的方式解析视图。

2、没有启动组件扫描。导致Spring只能找到显式声明在配置类中的控制器。

3、DispatcherServlet会映射为默认的Servlet,所以会处理所有的请求,包括对静态资源的请求,如图片和样式表(一般不希望这样)。

以下配置即可解决上述问题

@Configuration
@EnableWebMvc//启用Spring MVC
@ComponentScan("spittr.web")//启用组件扫描
public class WebConfig extends WebMvcConfigurerAdapter {
  @Bean
  public ViewResolver viewResolver() {//配置JSP视图解释器
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
  }
  @Override
  public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
  }
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {//配置静态资源处理
    // TODO Auto-generated method stub
    super.addResourceHandlers(registry);
  }
}

1、@ComponentScan注解,会扫描spittr.web包查找组件;通常我们编写的控制器会使用@Controller注解,使其成文组件扫描时的houxuanbean。所以我们不需要在配置类显式声明任何控制器。

2、ViewResolver bean。后面会详细讨论,这个的作用是查找JSP文件。例如home的视图会被解析为/WEB-INF/views/home.jsp。

3、新的WebConfig类扩展了WebMvcConfigurerAdapter并重写了其configureDefaultServletHandling()方法。通过调用enable()方法,要求DispatcherServlet将对静态资源的请求转发到Servlet容器中默认的Servlet上,而不是使用DispatcherServlet本身来处理此类请求。

RootConfig的配置

@Configration
@ComponentScan(basePackages={"spitter"},
    excludeFilters={
        @filter{type=FilterType.ANNOTATION, value=EnableWebMvc.class)
    })
public class RootConfig{
}

猜你喜欢

转载自www.cnblogs.com/LiveYourLife/p/9045390.html
今日推荐