23.1 鸟瞰Spring MVC
粗略的介绍了SpringMVC的主要组成部分,SpringMVC作为一个Web层的框架,最大的作用是把我从繁重的web.xml文件编写中解救出来,再也不要不停的添加Servlet和Servlet-mapping了。
通过引入Front Controller和Page Controller的概念,把映射的编写从单一的wen.xml中分离出来。具体来说,DispatcherServlet作为Front Controller是所有应用的大总管,所有的请求都要由DispatcherServlet来先处理,所谓的处理即选择一个合适的Controller来具体的处理请求,Controller就是Page Controller的角色,这个选择是根据HandlerMapping来决定的。最终Controller会返回一个ModelAndView对象,该对象里封装了需要生产一个View的所有必要的信息,DispatcherServlet拿着MondelAndView对象传给ViewResolver去生产View对象。
时序图如下。
23.2 实践出真知
具体的介绍了如何实现上述的控制流程,即如何写配置文件,如何继承接口,如何继承类等等。
用SpringMVC写的Web程序也要遵循Servlet规范,也要遵循基本的web工程的文件夹结构,更得有一个web,xml。
大体的结构如上图所示,在WEB-INF下面有三个xml文件,首先是老朋友web.xml。如果让我设计,我会在这里放什么呢?我设计的哲学是只在web.xml里放最主要的servlet即DispatcherServlel,后续的乱七八糟的都交给他,那么肯定这个servlet和servlet-mapping的编写是逃不掉的。一个框架只有这点东西不行,SSM,还要和后面的Spring结合,所以我tomcat服务器启动的时候也要加载Spring的容器,相关的Bean如DAO、Service都定义在这个Spring容器里,所以web.xml文件里还得有办法启动Spring容器。
先从启动Spring容器看起,启动Spring容器就得有一个Spring的配置文件,这个配置文件就是上面三个xml文件中的applicationContext.xml,前面学的IOC、AOP乱七八糟的都可以在这里用起来。怎么启动呢?我想在Tomcat服务器启动的是就加载这个Spring容器,而且还得让Tomcat所有的请求都能共享这个容器。在Tomcat启动是时候,会调用实现了ServletContextListener接口类的contextInitialized方法,所以Spring提供一个类实现了该接口,并把加载Spring容器的逻辑封装在contextInitialized方法里,这个类就是ContextLoaderListener。所以Toncat加载Spring容器就是利用监听器机制实现的。并且在Spring容器启动后也会和ServletContext绑定到一起实现了全局请求的共享。
ContextLoaderListener加载Spring容器时,在没有特殊配置的时候回加载一个默认位置的默认名称的配置文件:WEB-INF/applicationContext.xml,这是一个和web.xml同位置的文件,有的时候需要把Spring配置文件分开配置并且放到别的位置,就需要特殊的配置,如下。在param-value里用空格隔开多个配置文件,可是实现配置文件分层。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:smart-context.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
下面的配置是关于DispatcherServlet,这个是SpringMVC里最重要的一个Servlet。就像下面那样配置,平平无常,和普通的Servlet一样。
<servlet>
<servlet-name>smart</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>smart</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
但其实这个Servlet也需要一个配置文件,这个配置文件的默认名称是<servlet-name>加上servlet.xml,在这个例子里就是smart-servlet.xml,其默认位置也是在WEB-INF下。在smart-xml里需要配置HandlerMapping、controller、ViewResovler等等,这就是我们学习SpringMVC的主要内容。同样的,也可以改变DispatcherServlet配置文件的默认位置和名称,如下。
<servlet>
<servlet-name>smart</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:smart-servlet.xml</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>smart</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>