`
阅读更多

几乎所有的开源框架都有配置。配置之所以能够作为一个很重要的内容成为开源框架的一部分,可能基于以下的原因:

1. 配置是避免硬编码的有效途径

通过配置,我们可以非常轻松的替换某些运行参数、替换接口的实现类等,从而达到使程序更加灵活的目的。在这里,最典型的例子就是基于XML的Spring的配置文件。由于Spring提倡的面向接口的编程,使得你可以通过配置来灵活地替换内部实现,从而可以轻而易举地改变程序的运行特性。

2. 配置必须被用于指定某些映射关系

这一点其实大家也深有体会。以Hibernate为例,ORM的映射关系最早就是通过XML配置文件来指定的。而许多传统的Web层框架,更加通过XML配置文件,来指定URL与Control层的Java类的映射关系。

3. 配置能提供系统运行必须的参数

这一点与第一点非常类似,只是目的迥异。第一点的目的在于偷懒,在于保持足够的灵活性。而这里,我们可能不得不将一些系统化的参数进行固化处理,从而用到了配置文件。


有关配置的讨论

基于上面所提到的三点的原因,配置文件被认为是架起外界与程序之间的桥梁、是反应框架内部功能的一面镜子、更是程序是否灵活的一个重要标准,同时,其也成为了程序员学习框架时必须迈过的一道坎。说它是一道坎,一点也不过分,因为随着时代的发展,程序员们已经越来越开始报怨配置文件的庞大和无序,报怨过多的重复的配置劳动力成本,报怨配置本身的学习成本。

于是,一场试图改变当前生活状态的大讨论轰轰烈烈的开始。我从Javaeye上摘录了几篇有价值的讨论,分别站在不同的角度,对配置这一问题进行了剖析:

1. 从配置文件的归类和使用方式上入手

[downpour] 若干条J2EE应用中运用“配置”的最佳实践:http://www.iteye.com/topic/185542

2. 有关配置的表现形式的讨论

[ahuaxuan] xml和annotation的是是非非:http://www.iteye.com/topic/178725

[Readonly] 如何才算滥用annotation?:http://www.iteye.com/topic/16062

3. 试图通过改进框架,来加强或简化配置

[cnoss] 让你的 Ibatis2 也支持Annotation:http://www.iteye.com/topic/251047

[downpour] LightURL——打造零配置的Struts2开发方式:http://www.iteye.com/topic/242838

配置的现状和趋势

随着时代的发展,人们对配置的要求越来越高,这些高要求体现在:不丧失程序的灵活性,但是要保持尽量简单。于是,有关配置的现状和趋势,就体现为:表现形式的多样化和命名约定的广泛使用性。

表现形式的多样性,就要求我们能够根据实际情况在配置的不同表现形式中做出选择。在ahuaxuan的《xml和annotation的是是非非》中,讨论了如何在xml和annotation中做出合理的选择:

ahuaxuan 写道

于是我们看到我的项目里到处都是xml配置文件,从struts,到 hibernate,而且尤其是struts和hibernate,一个中型项目,struts的xml配置文件有时候达到数万行,再大一点的,可以数十万行,虽然很多时候都是拷贝,粘贴,但是看这个这个数十个几千行的struts配置文件能不让人倒胃口吗。再说那个hbm.xml,大家再熟悉不过了,你想想吧,一个几域模型的项目里,你需要有多少配置文件,我眼睛都看花了。这些都是xml的缺点。


Readonly 写道
ahuaxuan 写道

Model一个field上挂了O/R Mapping, Full Text Index, Validation, Security...如果这么多配置不放在annotation中还是需要放在配置文件中,那么一个model就需要很多配置文件了

偶的意见就是要分开多个配置文件,减少Line Of Code per File,减少维护成本,降低出错概率,分离关注点。



而在这里,我也再次重申一下我的观点:

downpour 写道
我现在的原则是,能不用Annotation的地方尽量不用,能不用XML的地方尽量不用。两者皆可时,看哪个需要敲的字母少,扩展性更强。

某个Annotation受到欢迎的程度我觉得取决于两点,一个是Annotation是否足够简单,例如像Spring2.5中的@Service,@Autowired。另外一个,就是如果有相应的XML配置,是否能完成“弱智”过度。我这里所说的弱智过度其实就是指Annotation中的语义是否能够和XML中的属性语义保持一致,以至于那些原本从XML过度到Annotation的朋友可以很容易的就切换过来。这一点,Struts2的Annotation就做得比较好,但是Hibernate的Annotation就很不容易让人产生联想。

事实上,我个人很反对在一个Domain Model上加Annotation来完成类似持久化、搜索等语义。就像Readonly说的,一个Domain Model就是一个Domain Model,很多情况下,我需要在其中填充一些业务逻辑,或者甚至我只想看看有那些字段。加上了过多的Annotation,导致这个文件臃肿不堪,也搞不清楚它到底承担了多少责任。甚至还要因为某些Annotation增加很多不必要的工作量。比如,没事情在Domain Model里面加了一个额外的getter方法为了前台显示用,结果为了Hibernate还要搞个恶心的@Transit的annotaion。实在是不能让人接受。。



当然,这是一个仁者见仁智者见智的问题,希望大家可以从讨论中多多思考,获取自己的观点。

至于说到命名约定,RoR已经在这个方面为我们做出了强烈的表率作用。而从Spring开始提倡使用@Autowired的Annotation,到Struts2的零配置插件的不断涌现,也正体现了配置正在越来越往这个方向靠。大家也可以在学习的过程中,多多注意命名约定在项目中的使用,从中学到几招最佳实践。

Struts2中的配置

Struts2作为一个传统的MVC框架,同样有很多基础配置。包括它的前身Webwork2在内,最早也是完全使用XML作为全程的配置语义的。

从配置文件的管理和配置结构上来讲,Struts2优于之前的许多Web层框架。这一点moxie曾经写过一篇文章介绍过:

[moxie] WebWork2多模块解决方法:http://www.iteye.com/topic/6529

从XML的语义设计来看,Struts2和Webwork2比起他们的先辈来说,也有明显的进步,不会在出现Struts1中,name居然表示actionForm这样让人匪夷所思的语义了。

从功能上来说,Struts2的配置文件不仅提供了URL到Control层的映射关系的定义,同时也成为了一个简单的容器定义的场所。所以,事实上Struts2包含了双重的功能。有关容器和IoC方面的内容,我在后面的章节会详细介绍。

而Struts2在配置简化方面,由于它提供了插件的机制,所以这部分功能往往由插件来完成。有兴趣的读者可以自行参考相关的插件:

codebehind:http://cwiki.apache.org/S2PLUGINS/codebehind-plugin.html

smarturls:[url]http://cwiki.apache.org/S2PLUGINS/smarturls-plugin.html [/url]

lighturl:http://www.iteye.com/topic/242838

最后一个插件是我写的,在这里做个小小的广告,大家可以尝试着用用看,并提出宝贵意见。

在接下来的章节中,我会重点介绍Struts2中有关配置的详细内容、包括源码分析、简化配置的扩展点、自行编写插件来简化配置等等

分享到:
评论

相关推荐

    struts2 配置dtd 自动提示

    在配置Struts2时,通常会使用一个名为`struts.xml`的配置文件,该文件定义了应用程序的行为和组件。为了在开发环境中获得更好的代码辅助和提示,我们需要使IDE(例如Eclipse)理解`struts.xml`文件的结构,这通常...

    Struts2配置详解

    ### Struts2配置详解 #### 一、总览 在深入了解Struts2的配置细节之前,我们先来简要概述一下Struts2框架的核心特点及其配置文件的基本结构。Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web...

    SSH笔记_Struts2配置

    总结,Struts2配置涉及多个方面,包括核心库的引入、配置文件的编写、Action、Result、Interceptor的定义以及与Spring的整合等。通过合理配置,可以构建出高效、灵活的Web应用。在实际项目中,应根据需求调整和优化...

    struts2配置文件

    在Struts2中,配置文件主要分为两个部分:`struts-default.xml`和用户自定义的配置文件,如`struts.xml`或`struts-config.xml`。这些XML文件定义了Action、结果类型、拦截器和包等元素,从而控制应用程序的行为。 *...

    struts2配置文件加载顺序

    1. **struts-default.xml**:这是Struts2的核心配置文件,位于`struts2-core.jar`库的`/org/apache/struts2/defaults`包内。它包含了框架的基本设置,如拦截器栈、默认Action配置等。 2. **struts-plugin.xml**:这...

    struts2 配置JSP时需要的jar

    在配置Struts2与Spring的整合时,我们需要`spring-context.jar`、`spring-webmvc-struts.jar`等,它们负责管理Bean、依赖注入以及与Struts2的集成。 5. **Hibernate ORM**:如果项目中使用Hibernate作为持久层框架...

    ·Struts2配置文件介绍 超级详细

    ### Struts2配置文件介绍 #### 一、Struts2的核心配置文件 在Struts2框架中,有多个重要的配置文件用于控制应用的行为与结构,其中最核心的是`struts.xml`文件。此外还包括`web.xml`、`struts.properties`、`...

    struts2配置文件详细说明

    配置文件在Struts2中起着至关重要的作用,它定义了框架的行为、动作映射、拦截器和其他关键设置。以下是Struts2配置文件的一些核心元素和属性的详细说明: 1. **配置文件结构**: Struts2的配置通常存储在一个名为...

    struts2 Https 配置

    2. **Struts2配置**:在Struts2的应用中,我们需要确保Action请求被重定向到HTTPS。这可以通过在`struts.xml`配置文件中使用`<constant>`标签设置`struts.action.excludePattern`属性来实现。 ```xml ...

    struts2 配置文件

    ### Struts2 配置文件详解 #### 一、引言 在Struts2框架的应用开发过程中,配置文件起到了至关重要的作用。Struts2主要依赖于两种基于XML的配置文件:`web.xml` 和 `struts-config.xml`(通常命名为 `struts.xml`)...

    struts2配置文件改变位置问题

    在Struts2中,`struts.xml`文件是核心配置文件,它定义了动作、结果、拦截器等关键组件。在默认情况下,`struts.xml`通常位于`src/main/resources`或在Web应用中是`WEB-INF/classes`目录下。 在描述的问题中,...

    struts2配置文件传值中文乱码

    本文将围绕“Struts2配置文件传值中文乱码”这一主题,深入探讨其成因、解决方案以及相关的配置细节,旨在帮助开发者有效解决中文乱码问题,提升用户体验。 ### Struts2框架简介 Struts2是Apache组织下的一个开源...

    Struts2 配置文件手册

    配置文件在Struts2框架中起着至关重要的作用,它们定义了框架的行为、拦截器、对象工厂以及各种组件的配置。下面将详细介绍Struts2配置文件中的关键元素。 1) **struts-default.xml**: 这是Struts2框架默认加载的...

    Struts2 配置文件

    配置SSH框架时关于Struts2的配置文件

    struts2配置文件详解

    ### Struts2配置文件详解 #### 一、引言 在Java Web开发中,Struts2框架因其灵活性和强大的功能而被广泛采用。Struts2框架的配置主要通过多个XML文件来实现,这些配置文件定义了应用程序的行为和结构。本文将详细...

    struts2配置环境需要的jar包

    2. **插件库**:Struts2提供了一系列插件,如`struts2-convention-plugin.jar`(用于自动配置)和`struts2-dojo-plugin.jar`(提供dojo相关的UI组件)。这些插件可以按需选择并添加到lib目录。 3. **依赖的第三方库...

    struts2配置示例

    这个“struts2配置示例”提供了一个基础的实现,展示了如何配置Struts2框架来处理用户的登录功能,使用OGNL(Object-Graph Navigation Language)表达式语言,并实现后台验证。下面我们将深入探讨这些关键知识点。 ...

Global site tag (gtag.js) - Google Analytics