[Spring MVC菜鸟之旅] 通过配置文件看最简单的Spring MVC应用程序


Spirng MVC

Spring MVC是什么?

Spring MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的是使用请求-相应模型,框架的目的就是帮助我们简化开发,Spring MVC也是要简化我们日常Web开发的。

核心架构图

核心架构图

具体流程

  1. 用户发送请求 —> DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制。
  2. DispatcherServlet —> HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器对象)对象,通过这种策略模式,很容易添加新的映射策略。
  3. DispatcherServlet —> HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器。
  4. HandlerAdapter —> 处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名)。
  5. ModelAndView逻辑视图名 —> ViewResolver,ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术。
  6. View —> 渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术。
  7. 返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

配置文件

web.xml

Java 的Web应用程序中通常都会有一个web.xml文件,这个文件是不是必须的呢?

要回答上面的问题,首先要了解web.xml文件到底有什么用,web.xml文件是用来配置欢迎页、servlet、filter等的。如果你的应用程序中没有用到这些,自然就不需要web.xml文件了。

Spring MVC的核心是DispatcherServlet,这个Servlet充当Spring MVC的前端控制器。与其他Servlet一样,DispatcherServlet必须在Web应用程序的web.xml文件中进行配置。所以在应用程序中使用Spring MVC的第一件事就是将下面的声明放入web.xml中去:

1
2
3
4
5
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

默认情况下,DispatcherServlet在加载时会从一个基于配置名字的XML文件中加载Spring应用上下文。在这个示例中,因为servlet的名字为dispatcher,DispatcherServlet将尝试从一个名为dispatcher-servlet.xml的文件(位于应用程序的WEB-INF目录下)来加载应用上下文。

1
2
3
4
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

上面示例中声明了DispatcherServlet处理那些URL。通过将DispatcherServlet映射到 / ,声明了它会作为默认的servlet并且会处理所有的请求,包括对静态资源的请求。

dispatcher-servlet.xml

根据web.xml文件的配置,我们需要在WEB-INF目录下创建dispatcher-servlet.xml文件,DispatcherServlet将使用它来创建应用上下文,而我们也将对Spring MVC的配置写在这个文件上。

  1. 静态资源访问
    1
    <mvc:resources location="/resources/**" mapping="/resources/" />

正如前面所述,所有经过DispatcherServlet的请求必须以一定的方式来进行处理,而通常情况下是需要用控制器进行处理。静态资源的请求也需要通过DispatcherServlet,我们需要以某种方式来告诉DispatcherServlet如何处理这些资源。

恰好元素就是做这个的,它建立了一个服务于静态资源的处理器。属性mapping表明路径必须以/resources开始,而且也包括他的任意自路径。属性location表明了要提供服务的文件位置。以上配置表明,所有以/resources路径开头的请求都会自动由应用程序根目录下的/resources目录提供服务。因此我们的所有图片、样式表、JavaScript以及其他的静态资源都必须放在应用程序的/resources目录下。

  1. 配置注解驱动的Spring MVC
    在dispatcher-servlet.xml文件中添加一行配置就能得到Spring MVC所提供的注解驱动特性:

    1
    <mvc:annotation-driven />
  2. 默认扫描包路径

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Controller
    @RequestMapping(value="/system")
    public class SystemController {
    @RequestMapping(value="/login",method=RequestMethod.GET)
    public ModelAndView login(){
    ModelAndView mav = new ModelAndView("login");
    System.out.println("login");
    return mav;
    }
    }

我们先来看一下上一篇文中用作测试的SystemController,虽说比较简单,但还是有许多内容需要介绍。首先@Controller注解表明这个类是一个控制器类。这个类是@Component注解的一种具体化,也就是说将查找使用@Component注解的类并将其注册为Bean,就像它们使用@Component注解那样。

这意味着我们需要在dispatcher-servlet.xml文件中配置一个,这样SystemController类(以及将要编写的所有其他控制器)竟会自动被发现并注册为Bean。以下是相关的XML片段。

1
<context:component-scan base-package="com.niklaus.learn" />
  1. 解析视图
    处理请求的最后一件必须要做的事情就是为用户渲染输出。为了确定值定的请求需要使用哪个视图,DispatcherServlet会查找一个视图解析器来将控制器返回的逻辑视图名称转换成渲染结果的实际视图。
    在Spring MVC中,大量使用了约定优于配置的开发模式。InternalResourceViewResolver就是一个面向约定的元素。它将逻辑视图名称解析为View对象,而该对象将渲染的任务委托给Web应用程序上下文的一个模板(通常是JSP)。它通过为逻辑视图名称添加前缀和后缀来确定Web应用程序中的模板路径。
    假设我们已经将应用程序的所有JSP放在“/WEB-INF/views/”目录下。基于这样的安排,我们需要在dispatcher-servlet.xml中配置InternalResourceViewResolver,如下所示:
1
2
3
4
5
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp"/>
</bean>

参考&引用

  • 《Spring实战(第3版)》
  • 《跟开涛学Spring MVC》

更新时间

发布时间 : 2016-06-26

看你的了!