【汇总】Spring 框架专题

1 Spring框架

1.1 Spring框架

    Spring框架是一个分层架构,由7个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图1所示。

图1. Spring 框架的7个模块

    组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

        核心容器:核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

        Spring上下文: Spring上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

        Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

        Spring DAO:JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。

        Spring ORM: Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

        Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

        Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

    Spring框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。

1.2 IOC 和 AOP

    控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器(在 Spring 框架中是 IOC 容器)负责将这些联系在一起。

    在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。下表列出了 IOC 的一个实现模式。

Spring框架的 IOC 容器采用类型 2 和类型3实现。

1.2.1 面向切方的编程

    面向切面的编程,即AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP的核心构造是切面,它将那些影响多个类的行为封装到可重用的模块中。

    AOP和IOC是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和Java类中才能实现日志功能。在AOP方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是Java类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用Spring AOP编写的应用程序代码是松散耦合的。

    AOP的功能完全集成到了Spring事务管理、日志和其他各种特性的上下文中。

1.3 IOC容器

    Spring设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是  BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。

    BeanFactory 支持两个对象模型。

·       单例 模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是默认的也是最常用的对象模型。对于无状态服务对象很理想。

·       原型 模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。

    bean工厂的概念是Spring作为IOC容器的基础。IOC将处理事情的责任从应用程序代码转移到框架。正如我将在下一个示例中演示的那样,Spring框架使用JavaBean属性和配置数据来指出必须设置的依赖关系。

1.3.1 BeanFactory 接口

    因为 org.springframework.beans.factory.BeanFactory 是一个简单接口,所以可以针对各种底层存储方法实现。最常用的 BeanFactory 定义是 XmlBeanFactory,它根据 XML 文件中的定义装入 bean,如清单1所示。

    清单1.XmlBeanFactory

    BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml"));

    在XML文件中定义的Bean是被懒加载的,这意味在需要bean之前,bean本身不会被初始化。要从BeanFactory检索bean,只需调用getBean()方法,传入将要检索的 bean 的名称即可,如清单2所示。

    清单2.getBean()

    MyBean mybean = (MyBean) factory.getBean("mybean");

    每个 bean 的定义都可以是 POJO (用类名和 JavaBean 初始化属性定义)或 FactoryBean。FactoryBean 接口为使用 Spring 框架构建的应用程序添加了一个间接的级别。

1.4 IOC示例

    理解控制反转最简单的方式就是看它的实际应用。在对由三部分组成的 Spring 系列 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC容器注入应用程序的依赖关系(而不是将它们构建进来)。

    我用开启在线信用帐户的用例作为起点。对于该实现,开启信用帐户要求用户与以下服务进行交互:

·       信用级别评定服务,查询用户的信用历史信息。

·      远程信息链接服务,插入客户信息,将客户信息与信用卡和银行信息连接起来,以进行自动借记(如果需要的话)。

·     电子邮件服务,向用户发送有关信用卡状态的电子邮件。

1.5  三个接口

    对于这个示例,我假设服务已经存在,理想的情况是用松散耦合的方式把它们集成在一起。以下清单显示了三个服务的应用程序接口。

    清单3. CreditRatingInterface

public interface CreditRatingInterface {

   public boolean getUserCreditHistoryInformation(ICustomer iCustomer);

}

    清单 3 所示的信用级别评定接口提供了信用历史信息。它需要一个包含客户信息的 Customer 对象。该接口的实现是由 CreditRating 类提供的。

    清单4.CreditLinkingInterface

public interface CreditLinkingInterface {

        public  String getUrl();

        public  void setUrl(String url);

        public  void linkCreditBankAccount() throws Exception ;

}

    信用链接接口将信用历史信息与银行信息(如果需要的话)连接在一起,并插入用户的信用卡信息。信用链接接口是一个远程服务,它的查询是通过 getUrl() 方法进行的。URL 由 Spring 框架的 bean 配置机制设置,我稍后会讨论它。该接口的实现是由 CreditLinking 类提供的。

    清单5.EmailInterface

public  interface EmailInterface {

      public  void sendEmail(ICustomer iCustomer);

      public  String getFromEmail();

      public  void setFromEmail(String fromEmail) ;

      public String getPassword();

      public  void setPassword(String password) ;

      public  String getSmtpHost() ;

      public void setSmtpHost(String smtpHost);

      public  String getUserId() ;

      public  void setUserId(String userId);

   }

    EmailInterface 负责向客户发送关于客户信用卡状态的电子邮件。邮件配置参数(例如 SMPT 主机、用户名、口令)由前面提到的 bean 配置机制设置。Email 类提供了该接口的实现。

1.6  Spring 使其保持松散

    这些接口就位之后,接下来要考虑的就是如何用松散耦合方式将它们集成在一起。在 清单 6 中可以看到信用卡帐户用例的实现。

    注意,所有的 setter 方法都是由 Spring 的配置 bean 实现的。所有的依赖关系(也就是三个接口)都可以由 Spring 框架用这些 bean 注入。createCreditCardAccount() 方法会用服务去执行其余实现。在 清单 7 中可以看到 Spring 的配置文件。我用箭头突出了这些定义。 

1.7   运行应用程序

    要运行示例应用程序,首先必须 下载 Spring 框架 及其所有依赖文件。接下来,将框架释放到(比如说)磁盘 c:\,这会创建 C:\spring-framework-1.2-rc2 (适用于当前发行版本) 这样的文件夹。在继续后面的操作之前,还必须下载和释放 Apache Ant

    接下来,将源代码释放到文件夹,例如 c:\ 盘,然后创建 SpringProject。将 Spring 库(即 C:\spring-framework-1.2-rc2\dist下的 spring.jar 和 C:\spring-framework-1.2-rc2\lib\jakarta-commons 下的  commons-logging.jar)复制到 SpringProject\lib 文件夹中。完成这些工作之后,就有了必需的构建依赖关系集。

    打开命令提示符,将当前目录切换到 SpringProject,在命令提示符中输入以下命令:build。 

    这会构建并运行 CreateCreditAccountClient 类,类的运行将创建 Customer 类对象并填充它,还会调用 CreateCreditCardAccount 类创建并链接信用卡帐户。CreateCreditAccountClient 还会通过 ClassPathXmlApplicationContext 装入 Spring 配置文件。装入 bean 之后,就可以通过 getBean() 方法访问它们了,如清单 8 所示。

    清单 8. 装入 Spring 配置文件

ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] {

     "springexample-creditaccount.xml"

 });

CreateCreditCardAccountInterface  creditCardAccount = (CreateCreditCardAccountInterface)

    appContext.getBean("createCreditCard");

1.8 结束语

    在这篇由三部分组成的 Spring 系列 的第一篇文章中,我介绍了 Spring 框架的基础。我从讨论组成 Spring 分层架构的 7 个模块开始,然后深入介绍了其中两个模块:Spring AOP 和 IOC 容器。

    由于学习的最佳方法是实践,所以我用一个工作示例介绍了 IOC 模式(像 Spring 的 IOC 容器实现的那样)如何用松散耦合的方式将分散的系统集成在一起。在这个示例中可以看到,将依赖关系或服务注入工作中的信用卡帐户应用程序,要比从头开始构建它们容易得多。

    请继续关注这一系列的下一篇文章,我将在这里学习的知识基础上,介绍 Spring AOP模块如何在企业应用程序中提供持久支持,并让您开始了解 Spring MVC 模块和相关插件。

2 Spring AOP与Hibernate

2.1  Spring AOP

    软件系统通常由多个组件构成,每个组件负责一个特定的功能领域。但是,这些组件也经常承担它们的核心功能之外的额外责任。系统服务(例如日志、事务管理和安全性)经常发现自己跑到了别的组件的领域里,而这些组件的核心职责是其他事情。结果就是所谓的“代码纠缠”,或者更简单点儿说“一团糟”。面向方面编程是一种试图解决这个问题的编程技术,它把关注点的隔离提升为核心的编程概念。

    使用 AOP 时,仍然是在一个地方定义系统的公共功能,但是可以声明性地定义 如何 和 在哪里 应用这个功能。如果对横切关注点(例如日志和事务管理)进行了模块化,那么不用修改每个单独的类,就可以向代码中添加新特性。这类模块化的关注点称作 方面

    以一个企业应用程序为例。这类应用程序通常要求类似于安全性和事务支持的服务。显然,可以把这些服务的支持直接编写到要求服务的每个类当中,但是更希望能够不必为大量事务性上下文编写同样的事务处理代码。如果使用 Spring AOP进行事务处理,那么可以声明性地安排适当的方法调用,而不必逐个安排。

    Spring AOP提供了几个方面,可以为 JavaBean 声明事务。例如,TransactionProxyFactoryBean 是个方便的代理类,能够拦截对现有类的方法调用,并把事务上下文应用到事务 bean。在下面的示例中会看到这个类的实际应用。

2.2   Hibernate

    Spring框架提供了对 Hibernate、JDO 和 iBATIS SQL

    Maps 的集成支持。Spring 对 Hibernate 的支持是第一级的,整合了许多 IOC 的方便特性,解决了许多典型的 Hibernate 集成问题。框架对 Hibernate 的支持符合 Spring 通用的事务和数据访问对象(DAO)异常层次结构。

    Spring为使用选择的 OR 映射层来创建数据访问应用程序提供了支持。因为所有东西都设计成一组可重用 JavaBean,所以不管选择什么技术,都能以库的格式访问大多数 Spring 的 OR 映射支持。 ApplicationContext 或 BeanFactory 内部的 OR 映射的好处是简化了配置和部署。

    Hibernate是 Java 平台上一个功能全面的、开源的 OR 映射框架。Hibernate 支持开发符合常规 Java 理念的持久性类 —— 包括关联、继承、多态、复合以及 Java 集合框架。Hibernate 查询语言(HQL)被设计成 SQL 的一个微型面向对象扩展,它是对象和关系世界之间的桥梁。Hibernate 也支持用原始 SQL 或基于 Java 的标准和示例查询表达查询。Hibernate 使用 XML(*.hbm.xml)文件把 Java 类映射到表,把 JavaBean 属性映射到数据库表。

    通过 JDBC 技术,支持所有的 SQL 数据库管理系统。Hibernate 与所有流行的 J2EE 应用程序服务器和 Web 容器都很好地集成。

2.3   实际示例

    一个银行应用程序示例可以让您自己看到 Spring AOP和 Hibernate 一起工作有多么好。银行帐户用例允许用户 (Customer)在一个事务中打开一个或多个银行帐户。用户可以申请多个银行帐户,可以选择是支票帐户类型或者是储蓄帐户类型。

    应用程序数据库(Cloudscape™)容纳所有客户和帐户信息。在这个例子中,假设在 Customer 和 Account 类之间存在 1:N 的关联。在实际生活场景中,关联可能需要按 m:n 建模,才能支持联合帐户。

    由于用户必须可以在一个事务中申请多个帐户,所以首先要为数据库交互实现一个 DOA 模式。然后要设置 Spring AOP的 TransactionProxyFactoryBean,让它拦截方法调用并声明性地把事务上下文应用到 DOA。

2.4   Hibernate实践

    在Spring框架中,像JDBC DataSource或Hibernate SessionFactory这样的资源,在应用程序上下文中可以用bean实现。需要访问资源的应用程序对象只需通过bean引用得到这类预先定义好的实例的引用即可(这方面的更多内容在 下一节中)。在清单1中,可以看到示例银行应用程序的一段摘录:XML 应用程序上下文定义显示了如何设置JDBC DataSource,并在上面放一个Hibernate SessionFactory。

    清单1.JDBC DataSource 和 HibernateSessionFactory 连接

    清单 1 显示了如何为示例应用程序数据库(是 Cloudscape)配置数据源 bean(exampleDataSource)。exampleDatasource被连接到 Spring Hibernate 的 SessionFactory。请注意 *.hbm.xml 指定了示例应用程序的OR映射文件。 

    数据源和会话工厂设置好之后,下一步就是在DAO中连接,在 CustomerDAOImpl 示例中,要使用 SessionFactory。接下来,插入Spring的TransactionProxyFactoryBean,它会拦截对应用程序的CustomerDAOImpl对象的方法调用,并声明性地在它上面应用事务。

    在 清单 2 的这个示例中,CustomerDAOImpl 类的addCustomer 方法是作为事务的一部分执行的,有一个事务属性 PROPAGATION_REQUIRED。这个属性等价于 EJB 容器的 TX_REQUIRED。如果想让这个方法一直在事务中运行,可以使用 PROPAGATION_REQUIRED。如果事务已经在运行,那么 bean 方法会加入事务,否则 Spring 的轻量级事务管理器会启动一个事务。如果想在调用组件服务时总是启动新事务,可以使用 PROPAGATION_REQUIRES_NEW 属性。

    应用程序的连接完成之后,现在来进一步查看源代码。

2.5   分析这个!

    如果以前没这么做过,那么请 下载这篇文章的源代码。把源 zip 文件释放到计算机中的任何位置上,例如 c:\。会创建一个叫作 SpringProjectPart2 的文件夹。src\spring 文件夹包含示例应用程序的 Hibernate 映射文件和 Spring 配置文件。src\springexample\hibernate 文件包含应用程序的源代码。

    在这里会发现两个类,即 Customer 和  Account,它们用 Hibernate 映射文件映射到两个表。Customer 类代表客户信息,Account 代表客户的帐户信息。正如前面提到的,我把这两个类按照 1: N 关系进行建模,即一个 Customer 可以拥有多个 Account。清单3显示了 Customer 对象的 Hibernate 映射文件。

    清单 3. Customer 对象的 Hibernate 映射文件

    set name="accounts" 和一对多类标签指定了 Customer 和 Account 之间的关系。我还在 Account.hbm.xml 文件中定义了 Account 对象的映射。

    CustomerDAOImpl.java 代表应用程序的 DAO,它在应用程序数据库中插入客户和帐户信息。CustomerDAOImpl 扩展了 Spring 的 HibernateDaoSupport,它用 Spring

    HibernateTemplate 简化了会话管理。这样,可以通过 getHibernateTemplate() 方法保存或检索数据。下面显示的 getCustomerAccountInfo() 对 Customer 进行 查找,通过getHibernateTemplate().find方法用 HQL 得到客户的帐户信息,如清单 4 所示。

    清单 4. DAO 实现

public  class CustomerDAOImpl extends HibernateDaoSupport implements CustomerDAO{

      public void addCustomer(Customer customer) {

            getHibernateTemplate().save(customer);    

            //TODO Auto-generated method stub

      }

      public Customer getCustomerAccountInfo(Customer customer) {

        Customer cust = null;

        List list = getHibernateTemplate().find("from Customer customer " +

          "where customer.userId = ?" , customer.getUserId(),Hibernate.STRING);

        if(list.size() > 0){

          cust = (Customer)  list.get(0);

        }

        return  cust;

  }

    所有这些都应当很容易掌握。现在来看代码的实际应用!

2.6  运行应用程序

    要运行示例应用程序,必须首先 下载 Spring 框架 和它的全部依赖文件。接下来,释放框架到某一位置(比如 c:\ ),这会创建文件夹 C:\spring-framework-1.2-rc2(针对当前发行版)。在继续之前还必须下载和释放 Apache Ant 和 Cloudscape。下载 Cloudscape之后,把它释放到 c:\ ,这会创建文件夹 C:\Cloudscape_10.0

    接下来,释放源代码到 c:\ ,这会创建 SpringProject2 文件夹。接下来修改 build.xml 文件的入口,用实际安装 Spring 的位置代替 C:\spring-framework-1.2-rc2,用实际安装 Cloudscape的位置代替 C:\Program Files\IBM\Cloudscape_10.0。

    打开命令行提示符,进入 SpringProject 目录,在命令行提示符下输入以下命令:build. 

    这会构建并运行 CreateBankCustomerClient 类,它会创建 Customer 类对象,用数据填充它,创建 Account 对象,填充它,并把它添加到 Customer 对象。

    然后 CreateBankCustomerClient 会调用 CustomerDAOImpl.addCustomer 类,添加客户和帐户信息。一旦插入完成,CreateBankCustomerClient 会调用CustomerDAOImpl.getCustomerAccountInfo 方法,根据 userid 得到客户和帐户信息。如果 CreateBankCustomerClient 执行成功,会在控制台上看到打印出 userid。也可以查询 Cloudscape数据库检索客户和帐户信息。 

2.7  结束语

    在三部分的 Spring 系列 的第 2 部分中,我介绍了如何集成 Spring Hibernate和Spring AOP。结果是一个强健的持久性框架,支持声明性的实现事务。

    在这个系列的下一篇,也是最后一篇文章中,我将介绍 Spring 的 MVC 模块,介绍如何用它来简化基于 Web 的应用程序的创建。

3 Spring MVC框架

3.1 Spring MVC框架

    Spring框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架。通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText 和 POI。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

    Spring的Web MVC框架是围绕DispatcherServlet设计的,它把请求分派给处理程序,同时带有可配置的处理程序映射、视图解析、本地语言、主题解析以及上载文件支持。默认的处理程序是非常简单的 Controller 接口,只有一个方法 ModelAndView handleRequest(request,response)。Spring 提供了一个控制器层次结构,可以派生子类。如果应用程序需要处理用户输入表单,那么可以继承AbstractFormController。如果需要把多页输入处理到一个表单,那么可以继承AbstractWizardFormController。

    示例应用程序有助于直观地学习这些特性。银行应用程序允许用户检索他们的帐户信息。在构建银行应用程序的过程中,可以学到如何配置 Spring MVC 框架和实现框架的视图层,视图层包括 JSTL 标记(用于显示输出的数据)和JavaServer Pages 技术。

3.2 配置Spring MVC

    要开始构建示例应用程序,请配置 Spring MVC 的 DispatcherServlet。请在 web.xml 文件中注册所有配置。清单1显示了如何配置 sampleBankingServlet。

    清单1. 配置Spring MVC DispatcherServlet

    DispatcherServlet从一个XML文件装入Spring应用程序上下文,XML文件的名称是servlet 的名称后面加上-servlet 。在这个示例中,DispatcherServlet 会从 sampleBankingServlet-servlet.xml 文件装入应用程序上下文。

3.3 配置应用程序的URL

    下一步是配置想让sampleBankingServlet处理的URL。同样,还是要在web.xml中注册所有这些信息。

    清单 2. 配置想要处理的URL

3.4 装入配置文件

    下面,装入配置文件。为了做到这点,请为 Servlet 2.3 规范注册 ContextLoaderListener 或为 Servlet 2.2 及以下的容器注册 ContextLoaderServlet。为了保障后向兼容性,请用ContextLoaderServlet。在启动 Web 应用程序时,ContextLoaderServlet 会装入 Spring 配置文件。清单3注册了 ContextLoaderServlet。

    清单 3. 注册 ContextLoaderServlet

    contextConfigLocation参数定义了要装入的 Spring 配置文件,如下面的 servlet 上下文所示。

    sampleBanking-services.xml 文件代表示例银行应用程序服务的配置和 bean 配置。如果想装入多个配置文件,可以在 标记中用逗号作分隔符。

3.5 Spring MVC示例

    示例银行应用程序允许用户根据惟一的 ID 和口令查看帐户信息。虽然 Spring MVC 提供了其他选项,但是我将采用 JSP 技术作为视图页面。这个简单的应用程序包含一个视图页用于用户输入(ID 和口令),另一页显示用户的帐户信息。

    我从 LoginBankController 开始,它扩展了 Spring MVC 的 SimpleFormController。SimpleFormContoller 提供了显示从 HTTP GET 请求接收到的表单的功能,以及处理从 HTTP POST 接收到的相同表单数据的功能。LoginBankController 用 AuthenticationService 和 AccountServices 服务进行验证,并执行帐户活动。“ 配置视图属性 ”一节中的 清单 5 描述了如何把 AuthenticationService 和 AccountServices 连接到 LoginBankController。 清单 4显示了 LoginBankController 的代码。

3.6 配置视图属性

    下面,我必须注册在接收到 HTTP GET 请求时显示的页面。我在 Spring 配置中用 formView 属性注册这个页面,如清单 5 所示。sucessView 属性代表表单数据提交而且 doSubmitAction() 方法中的逻辑成功执行之后显示的页面。formView 和 sucessView 属性都代表被定义的视图的逻辑名称,逻辑名称映射到实际的视图页面。

    清单 5. 注册 LoginBankController

    commandClass和 commandName 标记决定将在视图页面中活动的 bean。例如,可以通过 login.jsp 页面访问 loginCommand bean,这个页面是应用程序的登录页面。一旦用户提交了登录页面,应用程序就可以从 LoginBankController 的 onSubmit() 方法中的命令对象检索出表单数据。

3.7 视图解析器

    Spring MVC的 视图解析器 把每个逻辑名称解析成实际的资源,即包含帐户信息的 JSP 文件。我用的是 Spring 的 InternalResourceViewResolver,如 清单 6所示。

    因为我在 JSP 页面中使用了 JSTL 标记,所以用户的登录名称解析成资源 /jsp/login.jsp,而 viewClass 成为 JstlView。

3.8 验证和帐户服务

    就像前面提到的,LoginBankController 内部连接了 Spring 的 AccountServices 和 AuthenticationService。AuthenticationService 类处理银行应用程序的验证。AccountServices 类处理典型的银行服务,例如查找交易和电汇。清单 7 显示了银行应用程序的验证和帐户服务的配置。

    清单 7. 配置验证和帐户服务

    以上服务在 sampleBanking-services.xml 中注册,然后装入 web.xml 文件中,就像 前面讨论的那样。控制器和服务配置好后,这个简单的应用程序就完成了。现在我们来看看部署和测试它时会发生什么!

3.9 部署应用程序

    我把示例应用程序部署在 Tomcat servlet 容器中。Tomcat 是 Java Servlet 和 Java ServerPagest 技术的官方参考实现中使用的 servlet 容器。如果以前没这么做过,请 下载 jakarta-tomcat-5.0.28.exe并运行它把 Tomcat 安装到自己喜欢的任何位置,例如 c:\tomcat5.0。

    接下来,下载示例代码 并释放到驱动器(例如 c:\ )上。创建了 Spring 项目的文件夹之后,打开它并把 spring-banking 子文件夹拷贝到 c:\tomvat5.0\webapps。spring-banking 文件夹是一个 Web 档案,里面包含 Spring MVC 示例应用程序。lib 文件夹包含应用程序需要的 Spring 框架、与Spring 相关的 MVC 库以及 JSTL 标记库和 jar 文件。

    要启动 Tomcat 服务器,请使用以下命令:

    cd bin C:\Tomcat 5.0\bin>catalina.bat start

    Tomcat应当启动并部署 Spring MVC 示例应用程序。

3.10  测试应用程序

    要测试应用程序,请打开 Web 浏览器,指向http://localhost:tomcatport/springbanking并用 Tomcat 服务器实际运行的端口替换 tomcatport。应当看到图 1 所示的登录屏幕。输入用户 ID “admin”和口令“password”,并按下登录按钮。其他用户 ID 或口令会造成来自验证服务的错误。

    图 1. Spring MVC 示例登录屏幕

登录成功之后,会看到图 2 所示的帐户细节页面。

图 2. Spring MVC 示例帐户细节页面

3.11  结束语

    在三部分的 Spring 系列的第三篇文章中,我介绍了 Spring MVC 框架的特性。我演示了如何配置和开发 Spring MVC 应用程序、如何配置 Spring MVC 控制器和向其中插入依赖项、如何用 JavaServer Pages 技术开发应用程序视图,以及如何把自己的页面与 Spring MVC 的视图层集成。总结这篇文章时,我演示了如何在 Tomcat servlet 容器中部署应用程序以及如何在浏览器中测试它。

    请继续关注 Spring 系列 的下一篇文章。在下一篇文章中,我将介绍如何把基于 JMS 的应用程序与 Spring 框架集成。同时,请参阅 参考资料 学习更多有关 Spring 框架和 Spring MVC 的内容。

4  参考链接

Spring框架简介

https://www.ibm.com/developerworks/cn/java/wa-spring1/

当Hibernate遇上Spring

https://www.ibm.com/developerworks/cn/java/wa-spring2/index.html?ca=drs-

Spring(一)——总体介绍

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容