`
daha33
  • 浏览: 52442 次
社区版块
存档分类
最新评论

Spring MVC框架的高级配置

阅读更多
时间:2006-06-08
作者:Dejan Bosanac

本文将为您提供关于Spring MVC框架的配置技巧,以帮助管理基于Spring的web应用程序的多个实例。本配置管理主题常被学术界所忽略,但是,这对于现实的web开发尤为重要。本主题并不直接关联任何具体的技术,因此,我们将从最基本的概念开始对这个问题进行说明。下面,我们将根据Spring MVC框架,为基于本技术开发的项目提供一系列的解决方案。

Spring配置
  人们经常会在一台以上的主机上配置一种Web应用程序。例如,在生产中,一个网站可能只有一个实例。除了此实例外,开发人员可以在用于开发的机器上配置其他的(开发)实例。也可以在公司(机构)内部的本地开发服务器上维护其他应用程序装置,这将让您受益匪浅。该实例的目的是使Web设计者可以获得有质量保证的材料,并为需要为应用程序提供文件资料的人提供准入。

  大家都知道,即使是最简单的场景,也需要安装、配置和维护三个实例。而对于位于不同地理位置的团队来说,要从事这样的项目便更加困难。对于任何不是特别简单的Web应用程序项目,都需要多名开发人员来安装项目装置和本地设置以及运行单元测试的装置等。

  很多组织都将自己开发的产品作为Web应用程序。我们可以在很多产品中发现这种情况,例如电子商务系统、内容管理系统(CMS),以及博客发布平台等。这类产品可在多个服务器中进行部署。对于成功的多用途Web应用程序来说,他们的开发人员必须要保证他们的应用程序便于安装,并且能够与其他Web应用程序完美集成。经过上述讨论之后,我们应该明了,作为本文主题的应用程序配置是通用Web应用程序项目开发人员所需要解决的重要问题之一。

  诸如CVS或Subversion之类的版本控制系统是开发组织使用的一种标准工具。这种工具代表了一些组织的中心源代码版本库,它们被用于保持源代码的有序。用户可以跟踪应用程序源代码的变化,显示不同版本的区别,并可以确定项目分支。而且,它们使得在应用程序部署中进行部分更新成为可能。

  很明显,版本控制系统软件是跟踪源代码所必需的,它对于解决应用程序配置问题有非常大的帮助。在本文中,我们将不会把重点放在版本控制系统上,因为这方面已经有很多相关的材料了。在此,我们将关注版本控制问题中的一个小话题:如何使Web应用程序的配置更加便捷(尤其是使用Spring MVC框架编写的Web应用程序)。

  问题是:我们在此讨论的是一种什么样的配置?任何Web应用程序都需要一些资源,这些资源通常都是其所运行的服务器所特有的,例如数据库URL、发送电子邮件的SMTP服务器,以及包含专用软件文件的文件夹等。这样的设置应该集中,从而使应用程序配置更加简单。

  但是,这只是这个问题最简单的一种版本。有时候,在应用程序开发中需要更加复杂的配置。这意味着,必须将各次部署中的不同Bean连接起来,而这会使问题更加复杂。

  这些应用程序配置问题的解决方案有诸多优势,包括:简化应用程序的安装和配置过程,使源代码版本控制更加简便,减少源代码版本库中的冲突现象。下面,我们将通过示例详细讨论这个话题。

问题
  我们首先来演示一下上文所提到的最简单的版本。在这一场景中,我们希望在应用程序部署中改变的是简单的配置参数,例如链接、密码等。如果您曾经使用Spring MVC框架开发过Web应用程序,那么您应该知道这里将用到的两个配置文件:

  • /WEB-INF/applicationContext.xml,它让您可以配置Bean,或者显示应用程序上下文。通过这个文件,您可以定义自己的业务逻辑Bean、资源以及其他可以与Web端口相关联的所有Bean。
  • /WEB-INF/[servlet-name]-servlet.xml,它被用于配置Web层、视图解析器、控制器、校验器以及其他所有MVC框架中必需的Bean。[servlet-name]指的是在web.xml部署描述符中定义的Spring dispatcher servlet的名称。
  那么问题在哪儿呢?问题就出在applicationContext.xml中将包括一些特定于主机的Bean定义。其中,最明显的一个示例就是包含了JDBC连接信息的bean,但是任何一种稍微复杂些的应用程序都有十几个类似的Bean。看一下下面的示例:

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
   <property name="driverClassName">
       <value>org.postgresql.Driver</value>
   </property>
   <property name="url">
       <value>jdbc:postgresql://localhost/test</value>
   </property>
   <property name="username">
       <value>postgres</value>
   </property>
   <property name="password">
       <value></value>
   </property>
</bean>  
这个解决方案的问题在于对applicationContext.xml文件的维护。对于初学者来说,设想一下,项目放在源代码版本控制系统中,例如CVS。下面,假设您希望在网站中添加新的功能,那么就需要在应用程序上下文定义中添加额外的Bean定义。问题是如何在生产服务器上体现这些改变。

  通常情况下,应用程序的本地实例不会与活动站点使用同样的数据库,因此applicationContext.xml文件将包括让您能够访问本地数据库的设置。当您想提交在源代码版本库中的改变时,就需要注意这些特定于主机属性的同步性。版本库中的文件最终可能使用本地设置中的配置。如果想在生产服务器上更新配置,就必须手动同步这些属性的值。这是非常枯燥的任务,而且还非常容易出错。

  对于应用程序的每个实例来说,这个问题更加重要。假如有三位开发人员正在使用代码段基址,而且他们使用的是本地的数据库。当您提交更改的时候,他们每个人在本地服务器上更新源代码的时候都必须非常谨慎。他们会手动同步这些更改,然后提交他们的工作。这样一来,版本控制系统对于这些配置文件来说已经毫无用处。如果曾经使用过Spring MVC,那么您应该知道applicationContext.xml是应用程序中的关键组件,因为是它将所有的东西粘合在一起。所以,我们需要一种机制来帮助使应用程序中各项保持有序,这点非常重要。

  正如前面所提到的,这是您可能遇到的较简单的配置问题。更难的问题出现在当需要在不同服务器中进行不同的Bean连接的时候。这类问题常会出现在日常软件开发任务中。例如,假如您的产品有一个客户身份验证模块,可以对来自关系数据库或LDAP服务器中的用户进行身份验证。自然,这一身份验证模块可以使用抽象了特定版本库的Bean进行配置。如果您想改变不同应用程序部署中验证用户的方式,就需要在applicationContext.xml文件中进行不同的Bean连接。这种配置问题常见于在部署中有可配置特性的所有应用程序。

  在下文中,我们将讨论这两种配置问题。首先我们会关注同步的Bean属性问题及其解决方案,接下来,我们会讨论更加复杂的同步Bean连接问题。

解决方案

同步Bean属性

  这个问题的一种可行的解决方案是将所有特定于主机的参数都放到普通的Java属性文件中,使用Spring的PropertyPlaceHolderConfigurer类,将这些参数写入Bean属性中。

  使用这一解决方案,我们可以生成如下的属性文件(/WEB-INF/jdbc.properties):

jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost/test
jdbc.user=postgres
jdbc.password=
  
    我们的Bean配置如下:

<bean id="propertyConfigurer" 
 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
       <value>/WEB-INF/jdbc.properties</value>
    </property>
</bean>

<bean id="dataSource" 
 class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
         <value>${jdbc.driver}</value>
    </property>
    <property name="url">
         <value>${jdbc.url}</value>
    </property>
    <property name="username">
         <value>${jdbc.user}</value>
    </property>
    <property name="password">
         <value>${jdbc.password}</value>
    </property>
</bean>


  如上所述,我们定义了一个PropertyPlaceholderConfigurer类的实例,并将其位置属性设置为我们的属性文件。该类被实现为Bean工厂的后处理器,并将使用定义在文件中的属性来代替所有的占位符(${...}value)。

  利用这种技术,我们可以从applicationContext.xml中移除所有特定于主机的配置属性。通过这种方式,我们可以自由地为该文件添加新的Bean,而不必担心特定于主机属性的同步性。这样可以简化生产部署和维护。

同步性连接

  上面的技术解决了第一个问题,可是如果您计划修改不同应用程序部署之间的Bean连接,这一技术便不很适合。针对这一问题的一个解决方案便是额外创建一个名为applicationContext-[hostname].xml 的XML定义文件。其中[hostname]是部署应用程序的主机的名称。例如,在本地的机器上,这个文件通常名为applicationContext-localhost.xml,而在部署时,它可能更名为applicationContext-somehost.com.xml。

  可以猜测,这一文件必须包括特定于某一主机的所有配置Bean。在本文中,我们将假设dataSource bean定义将位于这类文件中,而不是通用的applicationContext.xml定义。当然,这种机制与前者并非冲突,但是为了更加简单明了,我们将只关注这种方法。

  既然我们已经有了特定的配置,下面我们就来讨论一下如何将其整合到整个Spring MVC配置概念中。要达到这一目的,可以有许多方法,我们将详细地一一说明。但首先,我们应该注意到,由于有些Bean可能位于独立的配置文件中,因此在applicationContext.xml中,所有对它们的局部引用都必须更换成全局名称。

  例如,如下引用:

<property name="someProperty">
   <ref local="someBean"/>
 </property>
  应更改为:

<property name="someProperty">
   <ref bean="someBean"/>
 </property>

  在这之后,我们有很多可以添加额外的资源以用于配置的方式。其中最明显的就是使用<import>标签将这一额外资源包含在applicationContext.xml配置文件中。使用时,要将该标签放在applicationContext.xml文件开头。例如:

<import resource="applicationContext-somehost.com.xml"/>
  
    现在,在独立的XML定义文件和普通的应用程序上下文定义文件中的所有通用Bean定义都有了特定于主机的连接。由于大多数的Bean都不是特定于主机的,因此我们可以像处理Web应用程序中的其他资源一样自由地处理applicationContext.xml文件,并可以通过合适的版本控制系统与其进行同步。

  但是,上述方法也有一定的弊端。如果您想保留不同XML文件的不同配置,就仍然必须担心applicationContext.xml的同步性,因为资源的名称必须根据不同服务器进行更改。虽然与原有的解决方案相比有了很大提高,只需更改文件名,但是这还是需要开发人员的手动协助。

  由于与applicationContext.xml相比,主机配置不需如此频繁地进行更改,因此下一步便是将主机配置移动到web.xml文件中(如果可能的话)。幸运的是,我们有一个可用的解决方案。看一下下面关于web.xml配置的片断:

<listener>
   <listener-class>
    org.springframework.web.context.ContextLoaderListener
   </listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    /WEB-INF/applicationContext.xml 
       /WEB-INF/applicationContext-somehost.com.xml
    </param-value>
  </context-param>


  正如您所看到的,除了web.xml文件中常有的ContextLoaderListener之外,我们还添加了contextConfigLocation上下文参数配置。这一参数用于指示框架查找这些配置文件的位置。如果这一参数被省略,则Spring就只能到applicationContext.xml中查找。这里我们也定义了特定于主机的配置文件来使用。

  利用这种方法,我们将所有特定于主机的配置从applicationContext.xml文件中移除,这样便减轻了其在不同应用程序部署中的同步性。

  如果这种方法成为您的新习惯,您还可以使其更加灵活。通过遵守下列指令,也可以将特定于主机的配置从web.xml文件中移除。

  为此,需要创建特定于我们的应用程序上下文的类:

package net.nighttale.spring.util;

import java.net.InetAddress;

import org.springframework.web.context.support.XmlWebApplicationContext;

public class PerHostXmlWebApplicationContext 
 extends XmlWebApplicationContext {
        
    protected String[] getDefaultConfigLocations() {
            String hostname = "localhost";
            try {
                hostname = InetAddress.getLocalHost().getHostName();
            } catch (Exception e) {
            }
            
            String perHostConfiguration = DEFAULT_CONFIG_LOCATION_PREFIX 
                 + "applicationContext-" 
                 + hostname 
                 + DEFAULT_CONFIG_LOCATION_SUFFIX
                 ;
    
            logger.debug(
                 "Adding per host configuration file: " 
                 + perHostConfiguration
                 );
            
            if (getNamespace() != null) {
                    return new String[] {
              DEFAULT_CONFIG_LOCATION_PREFIX 
                + getNamespace() 
                + DEFAULT_CONFIG_LOCATION_SUFFIX
             , perHostConfiguration};
            }
            else {
                    return new String[] {
             DEFAULT_CONFIG_LOCATION
              , perHostConfiguration};
            }
    }
}


  这个类拓展了Spring中常被作为默认值使用的XmlWebApplicationContext。XmlWebApplicationContext类将Web应用程序的配置从XML定义文件中复制过来。默认情况下,它可以配置来自applicationContext.xml和[servlet-name]-servlet.xml文件中的应用程序。这个类执行的惟一一项额外任务便是获取它所在的主机名称,并将applicationContext-[hostname].xml文件添加到配置文件列表中。

  为了使用这个类,我们需要对其进行编译,将其包含在类途径中,并指示Spring框架使用它。前两步非常简单,我们就不在此赘述。我们可以指示Sping通过contextClass上下文参数来使用它。除了web.xml文件中的原有配置,我们还可以添加下列内容:

<context-param>
   <param-name>contextClass</param-name>
  <param-value>
   net.nighttale.spring.util.PerHostXmlWebApplicationContext
  </param-value>
</context-param>

  如果我们使用这一配置片断,将会有三个文件被用于初始化这个框架:[servlet-name]-servlet.xml、applicationContext-[hostname].xml以及applicationContext.xml。

  正如您所看到的,applicationContext.xml和web.xml文件已经完全摆脱了任何特定的配置细节,而且您也不必担心会在更新应用程序时破坏配置。

  但是,这种方法有一个不足之处。因为,不论是否会使用,都需要在应用程序部署中有第三个配置文件。在这种情况下,便不需要特定于主机的配置。例如:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
    "http://www.springframework.org/dtd/spring-beans.dtd">

<beans></beans>

  最后,需要知道应用程序上下文类需要查找的特定主机名。检查主机名称的最简单的方法是在机器上运行下列代码:

System.out.println(InetAddress.getLocalHost().getHostName())

  可以将其作为Java代码执行,也可在喜欢使用的脚本语言(如BeanShell或Groovy)中作为一个具有Java风格语法的脚本执行。在获取了主机的名称之后,应该创建一个默认的/WEB-INF/applicationContext-[hostname].xml空文件夹(如我们上面所定义的),然后便可以开始了。

结束语
  在本文中,我们提供了一系列的配置技巧,让您在使用Spring MVC框架完成日常工作的时候更加轻松。如果您希望知道如何维护各种Web应用程序部署,可以试着找出最适合您的开发过程的解决方案。您的生活会更为轻松。

分享到:
评论

相关推荐

    基于Spring MVC框架的Web应用开发.zip

    本项目是一个基于Spring MVC框架的Web应用开发示例,涵盖了从基础的MVC模式实现到高级的注解开发、数据交互、文件上传下载、拦截器配置等多个方面的功能。通过本项目,开发者可以深入了解Spring MVC框架的核心功能和...

    Spring mvc 教程

    - **使用 MVC Java 编程进行高级定制**:通过 Java 配置类来定制 Spring MVC 的行为。 - **使用 MVC 命名空间进行高级定制**:XML 配置文件中的命名空间可以用来简化配置过程。 #### 结论 Spring MVC 是一个功能...

    Spring_MVC框架的高级配置

    Spring MVC 框架是Java开发中广泛使用的Web应用程序框架,尤其在构建现代企业级应用时,其高级配置显得尤为重要。本文将深入探讨如何优化Spring MVC应用的配置,以适应多环境部署,提高开发效率,并确保应用的可扩展...

    Spring MVC 框架搭建及详解

    总之,Spring MVC 作为一个成熟的 MVC 框架,提供了丰富的特性和灵活的配置,使得开发 Web 应用变得更加便捷。理解其工作原理和配置细节,对于提升开发效率和代码质量至关重要。在实际项目中,你可以根据需求调整...

    Spring MVC框架实例

    Spring MVC是Spring框架的一个核心模块,它主要用于构建Web应用程序。这个实例将带你了解Spring MVC的基本概念和使用方式,不涉及数据库交互,所有依赖项都已包含在压缩包中,但你需要自行配置Tomcat服务器。 首先...

    spring mvc 框架搭建

    在搭建Spring MVC框架的过程中,我们需要遵循以下步骤: 1. **环境准备**:首先确保已安装Java Development Kit (JDK) 和 Apache Maven,这两个是Spring MVC项目的基础。Maven是Java项目的构建工具,它管理项目依赖...

    Spring MVC 框架搭建配置方法及详解

    除了基本的配置,Spring MVC还支持许多高级特性,如: - 自定义注解:可以通过创建自定义注解来增强Controller方法的行为,如方法参数的验证、权限控制等。 - 数据绑定:自动将HTTP请求参数绑定到Controller方法的...

    Java EE 框架整合开发⼊⻔到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf

    这份文档名为《Java EE 框架整合开发入门到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf》,它显然是关于Java EE中流行的三个框架整合使用的教程。这三个框架分别是Spring、Spring MVC和MyBatis,...

    Spring.MVC-A.Tutorial-Spring.MVC学习指南 高清可复制版PDF

    总之,“Spring MVC - A Tutorial”这份指南会详细讲解Spring MVC的各个核心组件和使用技巧,包括控制器的创建、模型数据的管理、视图的渲染、以及各种高级特性。通过学习,开发者可以熟练地运用Spring MVC来构建...

    Spring MVC框架的各种依赖包下载

    本资源包含了Spring MVC框架下所需的各种依赖包,方便用户快速搭建一个功能完备的Spring MVC项目。 在Spring MVC框架中,以下几个主要组件起着关键作用: 1. **DispatcherServlet**:这是Spring MVC的前端控制器,...

    spring mvc mybatis 整合源码,带数据库脚本,带详细注释

    Spring MVC 和 MyBatis 是两个在Java Web 开发中广泛使用的框架。Spring MVC 作为Spring框架的一部分,负责处理HTTP请求并转发到相应的业务逻辑,而MyBatis则是一个轻量级的持久层框架,用于简化数据库操作。整合这...

    spring MVC配置,六步简单搞定

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为构建模型-视图-控制器(MVC)架构的应用程序提供了强大的支持。这篇博客“spring MVC配置,六步简单搞定”可能介绍了如何快速且有效地设置Spring MVC项目。下面...

    spring mvc的相关配置文档

    在本文中,我们将深入探讨Spring MVC的配置,这是一个广泛使用的Java Web框架,用于构建高效、模块化的Web应用程序。Spring MVC通过解耦应用程序的不同组件,如控制器、视图和模型,提供了灵活的架构。我们将主要...

    Mastering Spring MVC 3中文版

    《Mastering Spring MVC 3中文版》是一本深入解析Spring MVC框架的专业书籍,它涵盖了Spring MVC的核心概念、设计原理以及实际应用。Spring MVC是Spring框架的一部分,主要用于构建Web应用程序的模型-视图-控制器...

    《精通Spring MVC 4》源码

    通过仔细阅读和分析这些源代码,开发者不仅可以提升对Spring MVC框架的理解,还能学习到设计模式、性能优化和最佳实践,从而在实际项目中更有效地应用Spring MVC。无论是初学者还是经验丰富的开发者,都应该充分利用...

    spring mvc

    以上是Spring MVC框架的核心知识点,它们构成了一个功能强大且灵活的Web开发框架,使得开发者能够高效地构建复杂的企业级应用。在实际项目中,结合Spring Boot和其他Spring生态组件,可以进一步提升开发效率和应用...

    Spring mvc + Spring + Mybatis 整合demo

    在本文中,我们将深入探讨如何将Spring MVC、Spring和Mybatis这三大流行框架整合到一个Java Web项目中,创建一个高效、灵活的数据访问层。这个整合的Demo项目名为"ssm-demo",它是一个基于Maven构建的项目,这意味着...

Global site tag (gtag.js) - Google Analytics