Struts2配置详解1 基本元素介绍
Struts2配置详解
一:Struts2的配置文件:
Struts2框架的主要配置文件如表所示:
文件可选位置(相对于webapp)用途
web.xml是/WEB-INF/Web部署描述符,包括所有必须的框架组件,该文件由开发人员编写.
struts.xml否/WEB-INF/classes/主要的配置文件,包含result映射,action映射,拦截器配置等.该文件由开发人员编写。
struts.properties否/WEB-INF/classes/Struts2框架的属性配置,该文件由开发人员编写.
struts-default.xml否/WEB-INF/lib/struts2-core.jarStruts2文件提供的默认配置,该文件由框架提供.
struts-plugin.xml否/WEB-INF/lib/struts2-xxx-plugin.jarStruts2框架的插件所用的配置文件,该文件由插件提供.
Struts.xml配置详解:
1>Bean配置
Struts2是个可扩展的框架,框架的核心组件都是可配置的,这些组件通过
Struts2自己的依赖注入容器来装配。你也可以编写自己的组件实现类来扩展
或者替换框架的某一部分,并通过bean元素来配置组件实现类。
看一下struts-default.xml文件中,定义了Struts2框架的可配置组件,例如:
<bean type="com.opensymphony.xwork2.ActionProxyFactory" name="xwork"
name="myfactory" static=”true” />
提示:在Struts2.0版本中,这个配置项存在,到了Struts2.2版本中,这个配置项就不存在了.原因不明.
在实际开发中,很少使用bean元素,因为Struts2本身提供的功能已经能够满
足大多数的应用了。
2>常量(Constant)的配置:
其实配置常量,就是配置Struts2的属性,常量可以在多个文件中声明,默认
的,Struts2框架按照下列文件的顺序搜索常量,越靠后的文件,优先级越高,
也是说,顺序靠后中的文件常量设置,可以覆盖顺序靠前的文件中的常量设置。
1.struts-default.xml
2.struts-plugin.xml
3.struts.xml
4.struts.properties
5.web.xml
在struts.xml(struts-default.xml,struts-plugin.xml与struts.xml结构相同)文件中配置常量,要使用constant元素。
属性是否必须说明
name是常量的名字
value是常量的值
在struts.properties文件中,每个键值对就是一个常量设置。在web.xml文件中,FilterDispatcher的初始化参数作为常量被加载。
下面,我们以struts.i18n.encoding=UTF-8的属性设置为例,分别看
一下在三个文件(struts.xml,struts.properties和web.xml)中是如何设置的.
在struts.xml文件中的常量配置:
<struts>
<constant name="struts.i18n.encoding" value="UTF-8">
</constant>
</struts>
在struts.properties文件中的常量配置:
struts.i18n.encoding=UTF-8
在web.xml文件中的常量配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
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">
<filter>
<filter-name>struts2</filter-name> <filter-class>
org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
执行的顺序,可以自己测试一下,通过修改属性struts.action.extension对执行的后缀名,对配置文件的执行顺序进行测试。
Struts2框架提供struts.properties文件,是为了向后兼容WebWork,在配置常量时,应该首选在struts.xml文件中进行配置。
3> 包(Package)配置:
Struts2中的包类似于Java中的包,提供了将action,result,result类
型,拦截器和拦截器栈组织为一个逻辑单元的一种方式,从而简化了维护工作,提高了重用性。
在struts.xml文件中使用package元素来定义包,package元素有一个必须的属性name,指定包的名字,这个名字将作为引用该包的键key。要注意的是,包的名字必须是唯一的。在一个struts.xml文件中不能出现两个同名的包。package元素的extends属性是可选的,允许一个包继承一个或多个先前定义的包中的配置,如果指定多个包,则以逗号分隔。
需要注意的是:由于包信息的获取是按照配置文件内容的先后顺序进行的,所以父包必须在子包之前定义。
package元素的abstract属性是可选的,将其设置为true,可以把一个包定义为抽象的,抽象的包不能有action的定义,它只能作为父包,被其他的包所继承。
抽象的包,除了不能有action的定义,其他行为都与非抽象的包相同,可以有result类型,拦截器类型和拦截器栈的定义。可以利用抽象包来设置一些默认值,其他的包只需要从抽象包继承,从而减少了配置工作,提高了可重用性,降低了维护工作,在struts-default.xml文件中定义的struts-default包就是一个抽象的包。
package元素的完整属性如表所示:
属性是否必须说明
name是被其他包引用时的键key
extends否指定要扩展的包
namespace否指定名称空间
abstract否声明为抽象的(在包中没有action定义)
4> 名称空间(namespace)配置
package元素的namespace属性可以将包中的action配置为不同的名称空
间,这样在不同的名称空间中可以使用同名的action。Struts2框架使用action
的名字和它所在的名称空间来标识一个action。
当Struts2接收到一个请求的时候,它将请求URL分为namespace和action名字这两部分,然后Struts2就会从struts.xml中查找namespace/action这个命名对。如果没有找到,则到Struts2默认的名称空间中去找action。
默认的名称空间用空字符串””来表示,当你在定义包时没有使用namespace属性,那么就指定了默认的命名空间。
Struts2还支持以”/”命名的根名称空间.
看一个名称空间的例子:
<!-- default包在默认的名称空间 -->
<package name="default" extends="struts-default">
<action name="mysql" namespace="/database" extends="struts-default">
<action name="mysql"
namespace="/" extends="struts-default">
<action name="oracle"
encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-chat.xml" />
<include file="struts-interactive.xml" />
<include file="struts-hangman.xml" />
<include file="struts-tags.xml"/>
</struts>
这是struts-char.xml的代码片段:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="chat" extends="struts-default" namespace="/chat">
<action name="main">
<interceptor-ref name="chatAuthentication" />
<result type="freemarker">/chat/roomSelection.ftl
</result>
</action>
</package>
</struts>
这里要注意的是,每一个被包含的文件都必须和sruts.xml具有相同的格式,也
就是说,被包含的文件,本身也是完整的配置文件。也要按照struts-2.0.dtd中的定义。
由于Struts2是按照Web应用程序的CLASSPATH查找被包含的文件,所以,被包含的文件通常都放在WEB-INF/classes目录下,和struts.xml一起。当然,你也可以将配置模块放在对应的Java包下,例如,如果将配置文件struts-user.xml放在了包org.lessones.ch05下,在struts.xml文件中包含struts-user.xml文件时,就需要写成:
<include file="org/lessones/ch05/struts-user.xml" />
6>拦截器(Intercept)配置:
拦截器允许你在action的执行前后插入代码执行。Struts2中的拦截器是功能很
强大的工具,它可以为action动态添加输入验证,对象组装,权限控制,日志记录等功能,而不需呀修改action.
要为action配置引用的拦截器,首先需要在interceptors元素中使用interceptor元素定义拦截器,然后在action中使用interceptor-ref元素指定引用的的拦截器.interceptor有两个必须的属性:name和class,前者指定拦截器的名字,后者指定拦截器的完整类名。
假设我们要为UserAction配置两个拦截器logger和security,配置文件编写如下:
<package name="default" extends="struts-default">
<interceptors>
<!-- 定义名为logger的拦截器 -->
<interceptor name="logger" />
<!-- 定义名为security的拦截器 -->
<interceptor name="security" />
</interceptors>
<action name="user" extends="struts-default">
<interceptors>
<!-- 定义名为logger的拦截器 -->
<interceptor name="logger"
/>
<!-- 定义名为security的拦截器 -->
<interceptor name="security"
/>
<!-- 定义名为loggerAndSecurity的拦截器栈 -->
<interceptor-stack name="loggerAndSecurity">
<interceptor-ref name="logger" />
<interceptor-refname="security" /> </interceptor-stack>
</interceptors>
<action name="user" />
</action>
</package>
拦截器按照它们在拦截器栈中定义的顺序执行。
在引用拦截器时,Struts2并不区分拦截器和拦截器栈,所以,在定义拦截器时,
也可以引用其他的拦截器栈。
如果多个action都需要引用相同的拦截器栈,我们可以使用default-interceptor-ref元素来定义一个默认的拦截器或者拦截器栈引用,这样,就不需要为每个action指定引用信息了。
定义默认的拦截器栈:
<package name="default" extends="struts-default">
<interceptors>
<!-- 定义名为logger的拦截器 -->
<interceptor name="logger"
/>
<!-- 定义名为security的拦截器 -->
<interceptor name="security"
/>
<!-- 定义名为loggerAndSecurity的拦截器栈 -->
<interceptor-stack name="loggerAndSecurity">
<interceptor-ref name="logger" />
<interceptor-ref name="security" />
</interceptor-stack>
</interceptors>
<!-- 定义默认的拦截器栈 -->
<default-interceptor-ref name="loggerAndSecurity" />
<action name="user" /> </action>
</package>
这里要注意的是,如果在一个action中定义了其他的拦截器的引用,那么这个
action将不再使用默认的拦截器的引用了。
如果action想要在默认拦截器引用的基础上添加新的拦截器,那么只能在
action中重新配置默认拦截器引用中的拦截器栈。
<action name="user" />
<interceptor-ref name="loggerAndSecurity" />
</action>
Struts2提供的默认配置文件struts-default.xml定义了默认的拦截器栈的引
用,对于大多数Web应用程序来说,已经够用了。
这里需要注意的是:拦截器栈都是在包中定义的,在一个包中不能引用其他包中定义
的拦截器,除非这两个包有继承关系.