1、第23章 Spring的Web架构,同Struts 2框架一样,Spring也可以给Web开发者提供一个MVC框架。虽然Web框架只是Spring的一个模块,但是它却应用的非常广泛。本章结合实例分析Spring Web框架的使用方法、各个组件的作用。,23.1 第一个Spring MVC例子,在讲解Spring的MVC框架的各个组件之前,先通过一个例子来体会一下其流程。,23.1.1 配置web.xml文件,在ch23的WEB-INF目录下创建web.xml。在使用Struts 2时,需要在web.xml文件配置FilterDispatcher,在使用Spring的MVC框架时,也需要配置we
2、b.xml文件。,23.1.2 编写用于输出的页面,在ch23文件夹下面创建sayHello.jsp,该页面用来被Spring的控制器调用向页面上输出一个字符串。,23.1.3 创建控制器,Spring的MVC框架也有充当控制器的组件。下面先在ch23中创建一个package:com.examp.ch23,然后在其中添加HelloWorldAction.java类,用于调用sayHello.jsp去显示字符串。,23.1.4 创建Spring的配置文件,在前面讲Struts 2时,配置文件struts.xml主要用来对Action类进行配置,下面看Spring的配置文件是如何配置的。,23.1
3、.5 运行Spring MVC示例,在Eclipse中启动Tomcat,在浏览器中输入http:/localhost:8080/ch23/helloWorld.do,可以访问到sayHello.jsp。,23.1.6 使用JSTL视图技术,JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。使用JSTL可以实现迭代和条件判断、数据管理格式化、XML操作以及数据库访问等操作。可以使用JSTL技术去实现sayHello.jsp。,23.2 Spring MVC的控制器,和Struts
4、2一样,Spring MVC框架的控制器也用来建立视图层和模型层的联系,Spring的控制器可以通过继承一些接口来实现,下面进行讲解。,23.2.1 核心控制器DispatcherServlet,DispatcherServlet是Spring MVC的核心控制器,其作用相当于Struts 2的FilterDispatcher,负责对客户端的请求进行分发,把满足特定格式的请求交给业务控制器去处理。 1DispatcherServlet的配置 2DispatcherServlet的工作流程 当DispatcherServlet接收到用户请求后,按照如下步骤进行处理。 (1)搜索封装配置文件信息的
5、WebApplicationContext,并将它作为一个属性存储在请求对象中,这样DispatcherServlet就可以使用WebApplicationContext调用配置文件中定义的 资源。 (2)把本地化信息、主体信息也存储到请求对象上。 (3)根据配置文件搜索合适的业务处理器,并准备用于返回的ModelAndView。 (4)当业务处理器处理完业务逻辑后,根据WebApplicationContext中绑定的视图信息显示对应的视图。,23.2.2 控制器接口Controller,Controller接口是所有控制器接口的父类,所有Spring框架提供的控制器,以及所有用户自定义的控
6、制器都得实现这个接口。,23.2.3 表单控制器SimpleFormController,SimpleFormController可以自动将用户从表单获取的参数存入一个JavaBean的实例中,这样就不用逐一调用request.getAttribute()方法去获取。,23.3 Spring MVC视图,Spring MVC框架主要以控制器和视图为核心,业务控制器调用模型层完成请求处理后,试图层负责把处理完后的数据显示出来。Spring MVC的试图层有其自己的特点,如下所述。 使用ModelAndView类用来存储处理完后的结果数据,以及显示该数据的视图。 支持多种视图层技术,如JSP/Se
7、rvlet、Jstl、Velocity等,通过配置相应的视图解析器来实现。,23.3.1 模型视图类ModelAndView,从名字上看ModelAndView中的Model代表模型,View代表视图,这个名字就很好地解释了该类的作用。业务处理器调用模型层处理完用户请求后,把结果数据存储在该类的model属性中,把要返回的视图信息存储在该类的view属性中,然后让该ModelAndView返回该Spring MVC框架。框架通过调用配置文件中定义的视图解析器,对该对象进行解析,最后把结果数据显示在指定的页面上。,23.3.2 支持不同的视图,Spring MVC支持不同的视图技术,如JSP/S
8、ervlet、Jstl、Velocity等。每种视图技术对应一个XXXView.java类,它们都要实现View接口。例如,JSP/Servlet技术对应的类是InternalResourceView.java;Jstl技术对应的类是JstlView.java;Velocity技术对应的类是VelocityView.java。,23.4 使用拦截器,和Struts 2一样,Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口。 下面对代码中的三个方法进行解释。 preHandle():这个方
9、法在业务处理器处理请求之前被调用,在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。 postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回请求前被调用,在该方法中对用户请求request进行处理。 afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。,23.5 数 据 验 证,在Sp
10、ring MVC框架中,同样可以对表单数据进行验证,把错误信息返回页面,提示用户重新输入。Spring MVC框架提供了Validator接口,用户通过实现该接口来对数据进行研制,Validator的代码如下:01 package org.springframework.validation; 02 public interface Validator 03 boolean supports(Class clazz); 04 void validate(Object obj, Errors errors); 05 上面代码有两个方法,如下所述。 supports:用来判断参数clazz是否是要
11、验证的Class类。 validate:用来对参数obj进行研制,并把错误信息存入errors对象。,23.6 Spring和Struts 2整合,Spring 和Struts 2都是应用非常广泛的J2EE应用程序框架,Struts 2主要注重的是将视图层和控制层分开,但是不涉及对模型层的优化设计;而Spring除了实现Struts 2的MVC功能外,还可以利用其控制反转的思想实现对模型层的优化,从更深层次去降低应用程序各个组件的耦合程度。本节将结合实例讲解如何实现Spring框架和Struts 2框架的集成使用。,23.6.1 整合原理,Struts 2在发布的时候在其插件包struts-2
12、.1.2lib中有Struts 2-spring-plugin-2.1.2.jar,正是它实现了Struts 2和Spring的整合。这个插件覆盖了Struts 2的ObjectFactory,所以在Struts 2创建一个对象的时候,例如Action类,它会先到Struts 2的配置文件去寻找类的名字,然后转到Spring配置文件中去查找名字找到该类。,23.6.2 整合步骤,Spring和Struts 2的整合其实很简单,下面是整合步骤。 (1)复制jar文件。 (2)配置struts.objectFactory属性。 (3)配置Spring监听器。 (4)编写Spring配置文件。 (5)编写Struts 2配置文件。,23.7 一个Spring+Struts 2的开发实例,下面通过一个实例来讲解如何实现Spring和Struts 2的集成使用。,23.8 小 结,本章结合实例讲解了Spring MVC框架的各个组件的使用方法、Spring拦截器和数据验证的使用方法,以及Spring和Struts 2集成的实现方法。本章的重点是掌握Spring MVC框架的思想及其原理,并且能够实现Struts 2框架和Spring的整合使用。通过本章的学习,读者应该可以掌握Spring MVC框架的使用方法,并且能够实现Spring和Struts 2的集成使用。,