(2)配置form-bean
用来定义将要绑定到Action的FormBean的实例。语法如下:
<
name="name used to uniquely identify a FormBean">
type=”fully qualified class name of
FormBean"/>
例:
(3) 配置global-forwards
全局转发可以定义几个子元素,struts首先会在元素中找对应的,若找不到,则到全局转发配置中找。语法如下:
< name="unique target identifier">
path="context-relative path to targetted resource
"/>
除了name及path属性之外,还有一个redirect属性,如果redirect设为true的时候,则用HttpServletResponse.sendRedirect()方法,否则用RequestDispatcher.forward()方法,缺省为false。
注:如果为true,则用HttpServletResponse.sendRedirect()方法,此时存储在原来的HttpServletRequest中的值将会丢失。
例子:
(4)配置action-mappings
它可以定义几个子元素,它主要是定义Action实例到ActionServlet类中,语法如下:
< path="…">
type="…"
name="…"
scope=""
validate="…"
input="…">
属性及其描述信息如下:
属 性 描 述 信 息
path 指定请求访问Action的路径 (必须的)
type 连结到本映射的Action的完整类名(可选的)
name 与本操作关联的Action Bean在
中定义name名(可选的)
scope 指定ActionForm
Bean的作用域(session和request),缺省为session。(可选的),这里为request。
input 当Bean发生错误时返回的控制。(可选的)
className 指定一个调用这个Action类的ActionMapping类的全名。缺省用org.apache.struts.action.ActionMapping,(可选的)
forward 指定处理相应请求所对应的JSP页面。(可选的)
include 如果没有forward的时候,它起forward的作用。(可选的)
validate 若为true,则会调用ActionForm的validate()方法,执行表单验证。否则不调用,缺省为true。(可选的)
例子:
< path="/lookupAction">
type="wiley.LookupAction"
name="LookupForm"
scope="request"
validate="true"
input="/index.jsp">
(5) 配置RequestProcessor
在struts-config.xml文件中用子元素来定义RequestProcessor,其语法格式如下:
元素属性及其描述信息如下:
属性描述
processorClass 指定自定义的RequestProcessor类的全名
bufferSize 指定用来下载所用的缓存大小。缺省是4096字节
contentType 定义response文本类型,缺省是text/html
debug 定义当前系统的除错级别,缺省是0
locale
如果是true,则在用户的session中存放Locale对象,缺省为true
maxFileSize 指定下载文件最大的大小。缺省是250M
multipartClass
指定去代替org.apache.struts.upload.DiskMultipartRequestHandler类的类的全名
nocache
如果是true,则会关闭每个response的缓存功能。缺省是false
tempDir 指定上载文件所用的临时目录。缺省值由容器决定
例子:
①
② <>
contentType="text/html;charset=UTF-8"
debug="3"
locale="true"
nocache="true"
processorClass="org.apache.struts.action.RequestProcessor"/>
(6) 配置Message Resources
在struts-config.xml文件中用元素来定义消息资源。其语法如下:
元素属性及其描述信息如下:
属性描述
Parameter 给定资源文件全名
className 定义处理消息资源的类名的全名,缺省是org.apache.struts.config.MessageResourcesConfig
factory
定义MessageResourcesFactory类的全名,缺省是org.apache.struts.util.property.MessageResourcesFacotry
key
定义绑定在这个资源包中的ServletContext的属性主键,缺省值是Action.MESSAGES_KEY.
null 如果为true,则找不到消息key时,则返回null,缺省是true.
例子:
①
② < FONT>
parameter="StorefrontMessageResources"
null="false"/>
< FONT>
key="IMAGE_RESOURCE_KEY"
parameter="StorefrontImageResources"
null="false"/>
注意:设定key的目的如下:
<
altKey="navbar.home.image.alt">
bundle="IMAGE_RESOURCE_KEY"
pageKey="navbar.home.image"
width="125" height="15" border="0"/>
这里说明要到StorefrontImageResources.properties资源文件中找主键值是”navbar.home.image”所对应的值。
这里StorefrontImageResources.properties的内容如下:
……
navbar.home.image=/images/home.gif
navbar.home.image.alt=Home
……
此处navbar.home.image.alt说明的和一样。
(7) 配置Plug-in
也可如下:
上面主要是讲了Struts的两个配置文件web.xml 和struts-config.xml
。通过分析,我们发现配置文件是这个Struts的核心,通过[配置文件,原来松散的结构就变成系统的结构。
4.3 作为Hibernate的配置文件
Hibernate的配置文件有两种:hibernate.properties和hibernate.cfg.xml
。
先来看看hibernate.properties和hibernate.cfg.xml之间的对应关系:
PUBLIC “-//Hibernate//Hibernate Configuration
DTD//EN”
“http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd”>
Net.sf.hibernate.dialect.MySQLDialect
相当于hibernate.properties中的
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect;
这里我们重点来介绍Hibernate.cfg.xml.
PUBLIC"-//Hibernate/HibernateConfigurationDTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
举个例子:
PUBLIC"-//Hibernate/HibernateConfigurationDTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
java:comp/env/jdbc/quickstart
net.sf.hibernate.dialect.PostgreSQLDialect
我们关闭了SQL命令的log,告诉Hibernate使用哪种SQL数据库方言(dialet),还有如何得到JDBC连接(通过声明数据源池绑定的JNDI地址)。方言是必需的,因为不同的数据库都和SQL
"标准"有一些出入。Hibernate会替你照管这些差异之处,发行包包含了所有主流的商业和开放源代码数据库的方言。
SessionFactory是Hibernate的概念,对应一个数据存储源,如果有多个数据库,可以创建多个XML配置文件,也在你的程序中创建多个Configuration和SessionFactory对象。
在hibernate.cfg.xml中的最后一个元素声明了Cat.hbm.xml是一个Hibernate
XML映射文件,对应持久化类Cat。这个文件包含了把POJO类映射到数据库表(或多个数据库表)的元数据。
4.4 作为Spring的配置文件
在Spring
Framework的WEB-INF中存在两个配置文件:web.xml和Config.xml。当Tomcat初始化Spring时,会加载并解析web.xml文件,而web.xml文件是将所有的组件组合起来。
和Struts框架类似,web容器不支持动态加载web.xml文件,也就是说,一旦启动了web容器,那么它将读取web.xml文件,然后根据DTD来解析web.xml文件。如果在不关闭web容器的情况下修改web.xml文件,那么系统是不会自动更新web.xml文件的。若希望看到修改后的web.xml文件,则必须关闭web容器,然后再重新启动。
这里的Config.xml和Struts框架中的struts-config.xml类似的作用。不再赘述。
下面看看一个例子:
web.xml
<
xmlns="http://java.sun.com/xml/ns/j2ee">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
Dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/Config.xml
Dispatcher
*.do
Config.xml
"http://www.springframework.org/dtd/spring-beans.dtd">
org.springframework.web.servlet.view.JstlView
/
.jsp
action.LoginInfo
loginfail
main
了解Spring应用程序应当从配置文件开始,它显示了主要的bean以及应用程序如何将它们组合在一起。Spring配置文件在应用程序上下文中定义bean。将上下文看作是收集应用程序指定资源的一种便利方式。
这里的web.xml与Struts框架中web.xml一样,它们使用相同的DTD。Config.xml中根元素为beans,它可以有一个或者多个bean子元素,每个都有一个或者多个property子元素。
看来Struts框架和Spring FrameWork的配置文件从本质上来说是一样的。
4.5 小结
若XML作为web容器的配置文件,它是放在WEB-INF文件目录下的web.xml文件,将各个组件装配成一个大型复杂的软件,协调各组件间的工作。这里的组件是无法完成单独功能的单元,类似于模块。如果web应用在Struts框架,Spring
FrameWork或者Hibernate中,那么还要配置Config.xml文件。具体的配置文件为: struts-config.xml,spring
Config.xml ,hibernate.cfg.xml。
使用XML作为配置文件很复杂,但是,我们为什么要使用呢?
在大型并且复杂的项目中,使用传统的一个大应用程序,运行效率固然好于分布式系统,但是它的可维护性和复用能力大大下降,从而带来宽展上的麻烦。但是,使用分布式系统,整个应用程序是由一系列组件构成的,便于维护和复用。随着软件系统的复杂和升级,分布式带来更大的潜在价值。而将各组件协调起来一起工作的就是配置文件。目前,大部分的配置文件是用XML编写的有些是使用properties文件(比如hibernate.properties),但是使用properties文件没有XML文件灵活和功能强大,从发展趋势上来看,最终所有的配置文件都要基于XML编写。
至于小型项目,从开发复杂性和产品的复用上来讲,一般还是不提倡使用带有配置文件的分布式技术,显得有些大材小用。如果考虑了以后会升级为复杂的系统的话,当然也可以使用分布式模式(如J2EE模式),那么配置文件就是真个系统的灵魂,一定要花时间和精力编写和调试。
用XML的最大的好处是当你的配置文件中并非一行一行独立的配置项,而是一组一组的,每组还不一样,这个时候好处就多了,你如果自己去控制他们之间的逻辑,肯定会很复杂。但是如果你用XML就简单多了。还有XML它是一种通用的工具,它可以做任何事。就像字典一样,我们拿字典来查字,字典事什么,工具而已,XML也是一样,你可以用XML组合封装成各种各样的东西,甚至协议。
分布式技术存在的主要问题是效率。因为当容器(或者框架)启动的时候,它会读取XML配置文件到内存中。这需要花时间。这个配置文件一直存在在内存中,直到容器关闭为止,虽然XML配置文件代码量不是太大,但是长期占有内存,使得内存的使用效率下降。计算机寻找DTD来解析XML配置文件也需要花时间,所以从时间和效率来分析,分布式系统就不是很好。但是对于大型项目来说,牺牲一些时间和效率换来系统的可扩展性和可维护性是值得的。
5 XML在分布式技术的映射应用
5.1 XML在Struts中的映射作用
再回头看Struts的web-app配置文件,其中有3个映射子元素:filter-mapping,servlet-mapping,mime-mapping。
filter-mapping元素声明了在web应用程序里面的filter映射。filter-mapping规定了请求URI到filter的映射。
servlet-mapping元素定义了一个在一个servlet和一个url范式之间的映射。
mime-mapping元素定义了一个在后缀名和mime类型之间的映射。
它们都是web-app中存在的映射。
在Struts的struts-config.xml配置文件中,其中有一个映射子元素:action-mappings。
它的语法如下:
< path="…">
type="…"
name="…"
scope=""
validate="…"
input="…">
举一个Struts的例子来说:
< path="/lookupAction">
type="wiley.LookupAction"
name="LookupForm"
scope="request"
validate="true"
input="/index.jsp">
在这个例子中,从路径为/lookupAction访问name叫做LookupForm的wiley.LookupAction类型的文件,若成功通过验证,则映射到路径为/quote.jsp,name叫做success的文件;若未成功通过验证,则映射到路径为/index.jsp
,name叫做failure的文件。这里存在着name叫做LookupForm文件到name叫做success(或者failure)的文件之间的映射。
5.2 XML在Hibernate中的映射作用。
在Hibernate中,XML文件除了可以做配置文件外,还大量地以映射作用出现。
下面看一下Hibernate的映射文件的DTD
Sql-query*)>
具体地,我们举出一个Hibernate的例子:
“http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd”>
在这个例子中,hibernate-mapping是根元素,它可以有一个或多个class子元素。在每个class子元素中,它的属性总会出现name和table。name是对象,table则是数据库表。class子元素可以有自己的子元素,比如property子元素,它必须有name/
column出现,其中name是对象类,column是数据库表的属性。这样,就将对象和数据库表一一映射起来。
5.3 XML在Spring FrameWork中的映射作用
由于Spring
FrameWork的web.xml与Struts框架中web.xml一样,它在配置文件web-app同样也具有3个映射子元素:filter-mapping,servlet-mapping,mime-mapping。这里不再赘述。
在Spring FrameWork的Config.xml中也有映射作用出现。
5.4 小结
XML作为映射作用大多都出现在配置文件中,一般以
-mapping出现,理论上,使用XML可以建立任何两个对象之间的映射。作为独立的映射文件主要出现在Hibernate中。大量地使用了从对象到数据库表之间的映射,从而使得Hibernate成为了持久化层和模型层之间的中间件。可以想象使用基于XML的中间件的应用会越来越流行。
6 结束语
通过对Struts, hibernate,
spring中出现的XML研究,我们发现它在分布式系统中主要有两个作用:配置文件和映射作用。
7 参考文献
《深入浅出XML》 人民邮电出版社 老虎工作室 贾小珠 宋立智 赵玮 等 2001年第一版
《精通Struts:基于MVC的Java Web 设计与开发》电子工业出版社 孙卫琴
2004年第一版
《精通Hibernate: Java对象持久化技术祥解》电子工业出版社 孙卫琴 2005年第一版
8 致谢
在论文编写过程中,得到了复旦大学软件学院孙卫琴老师,赵卫东老师,以及数位同学的帮助,在此表示由衷的感谢!