- 浏览: 81028 次
- 性别:
- 来自: 石家庄
最新评论
-
fish198398:
不是Sql语句里面的变量,那个可以传过去,没有问题,比如,
...
IBatis的xml文件中,resultClass和parameterClass能不能传变量过来 -
抛出异常的爱:
parameterClass=xxxx
select duty ...
IBatis的xml文件中,resultClass和parameterClass能不能传变量过来 -
fish198398:
可以的话,怎么传过来啊
IBatis的xml文件中,resultClass和parameterClass能不能传变量过来 -
emlyn_1180:
当然可以啊
IBatis的xml文件中,resultClass和parameterClass能不能传变量过来 -
tihualong:
楼主的同事怎么不自己做,让你来做?
最近,帮一个学生做了一个毕业设计
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.jar Struts2文件提供的默认配置,该文件由框架提供.
struts-plugin.xml 否 /WEB-INF/lib/struts2-xxx-plugin.jar Struts2框架的插件所用的配置文件,该文件由插件提供.
Struts.xml配置详解:
1>Bean配置
Struts2是个可扩展的框架,框架的核心组件都是可配置的,这些组件通过
Struts2自己的依赖注入容器来装配。你也可以编写自己的组件实现类来扩展
或者替换框架的某一部分,并通过bean元素来配置组件实现类。
看一下struts-default.xml文件中,定义了Struts2框架的可配置组件,例如:
<bean type="com.opensymphony.xwork2.ActionProxyFactory" name="xwork" class="com.opensymphony.xwork2.DefaultActionProxyFactor"/>
<bean type="com.opensymphony.xwork2.ActionProxyFactory"
name="struts"
class="org.apache.struts2.impl.StrutsActionProxyFactor"
/>
Bean元素的完整属性如表所示:
属性 是否必须 说明
class 是 bean的类名
type 否 bean实现的接口
name 否 bean的名字,在具有相同type属性的Bean中,该名字是唯一的
Scope 否 bean的范围,有效的值包括default,singleton,request,session和thread
Static 否 是否使用静态方法注入,如果指定了type属性,就不要把该属性设置为true.
optional 否 bean是否是可选的
可以配置两种那个用途的Bean:
1.框架的Ioc容器创建bean的实例,然后将该实例注入到框架的内部对象中
2.通过bean的静态方法向bean注入值.
在第一种用法中,bean将被注入到框架内部,和内部对象协作,框架要知道bean的类型,因此,在配置bean时,通常要使用type属性,以指明bean实现的接口.例如我们创建了自己的ObjectFactory,可以在struts.xml文件中使用bean元素配置如下:
<struts>
<bean
type="com.opensymphony.xwork2.ObjectFactory"
name="myfactory" class="com.company.myapp.MyObjectFactory "/>
</struts>
在第二种方法中,使用值注入,允许不创建bean,而让bean接收框架的
常量,bean使用值注入,必须使用static属性,并将该属性设置为true.例如struts-default.xml文件中的一个配置项.
<bean class="com.opensymphony.xwork2.ObjectFactory" 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" class="org.lesson05.MySqlAction">
<result name="success">/mysql.jsp</result>
</action>
<action name="oracle" class="org.lesson05.OracleAction">
<result name="success">/oracle.jsp</result>
</action>
</package>
<!-- mysql包在/database名称空间中 -->
<package name="mysql" namespace="/database" extends="struts-default">
<action name="mysql"
class="org.lesson05.MySqlAction">
<result name="success">/mysqldatabase.jsp</result>
</action>
</package>
<!-- oracle包在默认的名称空间 -->
<package name="oracle" namespace="/" extends="struts-default">
<action name="oracle"
class="org.lesson05.OracleAction">
<result name="success">/mysqldatabase.jsp</result>
</action>
</package>
如果请求/database/mysql.action,框架将首先查找
/database名称空间,如果找到了,则执行mysql.action,如果没有找到,则在默认名称空间中继续查找。
如果请求/database/oracle.acion。框架将会在/database空间中查找oracle这个action,因为/database空间不存在oracle这个action,所以,默认空间的oracle将会被找到并被执行.
如果请求/oracle.action,框架将会在根名称空间(‘/’)中查找oracle.action,如果没有找到,则在到默认名称空间下去查找。
如果请求/mysql.action,框架则首先到根名称空间(‘/’)下去查找,因为没有根名称空间(‘/’)下没有mysql.action,所以,默认空间的mysql.action则会被执行。
这里需要注意的是,名称空间和文件系统的路径,具有多级目录不同,名称空间只有一个级别。例如,请求URL:/myspace/database/mysql.action,框架将首先在/myspace/database名称空间查找,如果没有找到,则直接到默认的名称空间去查找。框架并不会将名称空间解析为一系列的“文件夹”。
不同的包,可以定义相同的名称空间,但是同一个名称空间下,包名不能相同。,
5> 包含(include)配置
在一些大型项目中,为了降低项目的复杂度,便于团队成员分工协作,通常会将
项目划分为多个较小的模块,每个模块单独开发和管理。为此,Struts2提供了
include元素来解决这个问题。我们可以为每个模块单独提供一个配置文件,对其进行配置,然后在struts.xml中使用include这个元素来包含其他的配置文件。
Include元素只有一个必须的属性file,指定被包含文件的文件名。看一些Struts2自带的showcase例子中的例子:
<?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>
<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" class="org.lesson05.LogInterceptor" />
<!-- 定义名为security的拦截器 -->
<interceptor name="security" class="org.lesson05.ValidationInterceptor" />
</interceptors>
<action name="user" class="org.lesson05.UserAction">
<result name="success">/user.jsp</result>
<!-- 为user action指定拦截器,当user action被调用时,
logger和security拦截器也会被调用 -->
<interceptor-ref name="logger"></interceptor-ref>
<interceptor-ref name="security"></interceptor-ref>
</action>
</package>
拦截器按照action引用拦截器的顺序执行。
如果一个action需要多个拦截器,引用他们也是一件麻烦事,我们可以将多个
拦截器组合在一起,组成一个拦截器栈,然后在action中直接调用拦截器栈就可
以了。
配置文件如下:
<package name="default" extends="struts-default">
<interceptors>
<!-- 定义名为logger的拦截器 -->
<interceptor name="logger"
class="org.lesson05.LogInterceptor" />
<!-- 定义名为security的拦截器 -->
<interceptor name="security"
class="org.lesson05.ValidationInterceptor" />
<!-- 定义名为loggerAndSecurity的拦截器栈 -->
<interceptor-stack name="loggerAndSecurity">
<interceptor-ref name="logger" />
<interceptor-refname="security" /> </interceptor-stack>
</interceptors>
<action name="user" class="org.lesson05.UserAction">
<result name="success">/user.jsp</result>
<!-- 为user action指定拦截器,引用名即可以是拦截器名,
也可以是拦截器栈 -->
<interceptor-ref name="loggerAndSecurity" />
</action>
</package>
拦截器按照它们在拦截器栈中定义的顺序执行。
在引用拦截器时,Struts2并不区分拦截器和拦截器栈,所以,在定义拦截器时,
也可以引用其他的拦截器栈。
如果多个action都需要引用相同的拦截器栈,我们可以使用default-interceptor-ref元素来定义一个默认的拦截器或者拦截器栈引用,这样,就不需要为每个action指定引用信息了。
定义默认的拦截器栈:
<package name="default" extends="struts-default">
<interceptors>
<!-- 定义名为logger的拦截器 -->
<interceptor name="logger"
class="org.lesson05.LogInterceptor" />
<!-- 定义名为security的拦截器 -->
<interceptor name="security"
class="org.lesson05.ValidationInterceptor" />
<!-- 定义名为loggerAndSecurity的拦截器栈 -->
<interceptor-stack name="loggerAndSecurity">
<interceptor-ref name="logger" />
<interceptor-ref name="security" />
</interceptor-stack>
</interceptors>
<!-- 定义默认的拦截器栈 -->
<default-interceptor-ref name="loggerAndSecurity" />
<action name="user" class="org.lesson05.UserAction">
<result name="success">/user.jsp</result>
<!-- 为user action指定拦截器,引用名即可以是拦截器名,
也可以是拦截器栈 -->
<interceptor-ref name="loggerAndSecurity" /> </action>
</package>
这里要注意的是,如果在一个action中定义了其他的拦截器的引用,那么这个
action将不再使用默认的拦截器的引用了。
如果action想要在默认拦截器引用的基础上添加新的拦截器,那么只能在
action中重新配置默认拦截器引用中的拦截器栈。
<action name="user" class="org.lesson05.UserAction">
<result name="success">/user.jsp</result>
<!-- 为user action指定拦截器,引用名即可以是拦截器名,
也可以是拦截器栈 -->
<interceptor-ref name="timer" />
<interceptor-ref name="loggerAndSecurity" />
</action>
Struts2提供的默认配置文件struts-default.xml定义了默认的拦截器栈的引
用,对于大多数Web应用程序来说,已经够用了。
这里需要注意的是:拦截器栈都是在包中定义的,在一个包中不能引用其他包中定义
的拦截器,除非这两个包有继承关系.
一: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.jar Struts2文件提供的默认配置,该文件由框架提供.
struts-plugin.xml 否 /WEB-INF/lib/struts2-xxx-plugin.jar Struts2框架的插件所用的配置文件,该文件由插件提供.
Struts.xml配置详解:
1>Bean配置
Struts2是个可扩展的框架,框架的核心组件都是可配置的,这些组件通过
Struts2自己的依赖注入容器来装配。你也可以编写自己的组件实现类来扩展
或者替换框架的某一部分,并通过bean元素来配置组件实现类。
看一下struts-default.xml文件中,定义了Struts2框架的可配置组件,例如:
<bean type="com.opensymphony.xwork2.ActionProxyFactory" name="xwork" class="com.opensymphony.xwork2.DefaultActionProxyFactor"/>
<bean type="com.opensymphony.xwork2.ActionProxyFactory"
name="struts"
class="org.apache.struts2.impl.StrutsActionProxyFactor"
/>
Bean元素的完整属性如表所示:
属性 是否必须 说明
class 是 bean的类名
type 否 bean实现的接口
name 否 bean的名字,在具有相同type属性的Bean中,该名字是唯一的
Scope 否 bean的范围,有效的值包括default,singleton,request,session和thread
Static 否 是否使用静态方法注入,如果指定了type属性,就不要把该属性设置为true.
optional 否 bean是否是可选的
可以配置两种那个用途的Bean:
1.框架的Ioc容器创建bean的实例,然后将该实例注入到框架的内部对象中
2.通过bean的静态方法向bean注入值.
在第一种用法中,bean将被注入到框架内部,和内部对象协作,框架要知道bean的类型,因此,在配置bean时,通常要使用type属性,以指明bean实现的接口.例如我们创建了自己的ObjectFactory,可以在struts.xml文件中使用bean元素配置如下:
<struts>
<bean
type="com.opensymphony.xwork2.ObjectFactory"
name="myfactory" class="com.company.myapp.MyObjectFactory "/>
</struts>
在第二种方法中,使用值注入,允许不创建bean,而让bean接收框架的
常量,bean使用值注入,必须使用static属性,并将该属性设置为true.例如struts-default.xml文件中的一个配置项.
<bean class="com.opensymphony.xwork2.ObjectFactory" 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" class="org.lesson05.MySqlAction">
<result name="success">/mysql.jsp</result>
</action>
<action name="oracle" class="org.lesson05.OracleAction">
<result name="success">/oracle.jsp</result>
</action>
</package>
<!-- mysql包在/database名称空间中 -->
<package name="mysql" namespace="/database" extends="struts-default">
<action name="mysql"
class="org.lesson05.MySqlAction">
<result name="success">/mysqldatabase.jsp</result>
</action>
</package>
<!-- oracle包在默认的名称空间 -->
<package name="oracle" namespace="/" extends="struts-default">
<action name="oracle"
class="org.lesson05.OracleAction">
<result name="success">/mysqldatabase.jsp</result>
</action>
</package>
如果请求/database/mysql.action,框架将首先查找
/database名称空间,如果找到了,则执行mysql.action,如果没有找到,则在默认名称空间中继续查找。
如果请求/database/oracle.acion。框架将会在/database空间中查找oracle这个action,因为/database空间不存在oracle这个action,所以,默认空间的oracle将会被找到并被执行.
如果请求/oracle.action,框架将会在根名称空间(‘/’)中查找oracle.action,如果没有找到,则在到默认名称空间下去查找。
如果请求/mysql.action,框架则首先到根名称空间(‘/’)下去查找,因为没有根名称空间(‘/’)下没有mysql.action,所以,默认空间的mysql.action则会被执行。
这里需要注意的是,名称空间和文件系统的路径,具有多级目录不同,名称空间只有一个级别。例如,请求URL:/myspace/database/mysql.action,框架将首先在/myspace/database名称空间查找,如果没有找到,则直接到默认的名称空间去查找。框架并不会将名称空间解析为一系列的“文件夹”。
不同的包,可以定义相同的名称空间,但是同一个名称空间下,包名不能相同。,
5> 包含(include)配置
在一些大型项目中,为了降低项目的复杂度,便于团队成员分工协作,通常会将
项目划分为多个较小的模块,每个模块单独开发和管理。为此,Struts2提供了
include元素来解决这个问题。我们可以为每个模块单独提供一个配置文件,对其进行配置,然后在struts.xml中使用include这个元素来包含其他的配置文件。
Include元素只有一个必须的属性file,指定被包含文件的文件名。看一些Struts2自带的showcase例子中的例子:
<?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>
<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" class="org.lesson05.LogInterceptor" />
<!-- 定义名为security的拦截器 -->
<interceptor name="security" class="org.lesson05.ValidationInterceptor" />
</interceptors>
<action name="user" class="org.lesson05.UserAction">
<result name="success">/user.jsp</result>
<!-- 为user action指定拦截器,当user action被调用时,
logger和security拦截器也会被调用 -->
<interceptor-ref name="logger"></interceptor-ref>
<interceptor-ref name="security"></interceptor-ref>
</action>
</package>
拦截器按照action引用拦截器的顺序执行。
如果一个action需要多个拦截器,引用他们也是一件麻烦事,我们可以将多个
拦截器组合在一起,组成一个拦截器栈,然后在action中直接调用拦截器栈就可
以了。
配置文件如下:
<package name="default" extends="struts-default">
<interceptors>
<!-- 定义名为logger的拦截器 -->
<interceptor name="logger"
class="org.lesson05.LogInterceptor" />
<!-- 定义名为security的拦截器 -->
<interceptor name="security"
class="org.lesson05.ValidationInterceptor" />
<!-- 定义名为loggerAndSecurity的拦截器栈 -->
<interceptor-stack name="loggerAndSecurity">
<interceptor-ref name="logger" />
<interceptor-refname="security" /> </interceptor-stack>
</interceptors>
<action name="user" class="org.lesson05.UserAction">
<result name="success">/user.jsp</result>
<!-- 为user action指定拦截器,引用名即可以是拦截器名,
也可以是拦截器栈 -->
<interceptor-ref name="loggerAndSecurity" />
</action>
</package>
拦截器按照它们在拦截器栈中定义的顺序执行。
在引用拦截器时,Struts2并不区分拦截器和拦截器栈,所以,在定义拦截器时,
也可以引用其他的拦截器栈。
如果多个action都需要引用相同的拦截器栈,我们可以使用default-interceptor-ref元素来定义一个默认的拦截器或者拦截器栈引用,这样,就不需要为每个action指定引用信息了。
定义默认的拦截器栈:
<package name="default" extends="struts-default">
<interceptors>
<!-- 定义名为logger的拦截器 -->
<interceptor name="logger"
class="org.lesson05.LogInterceptor" />
<!-- 定义名为security的拦截器 -->
<interceptor name="security"
class="org.lesson05.ValidationInterceptor" />
<!-- 定义名为loggerAndSecurity的拦截器栈 -->
<interceptor-stack name="loggerAndSecurity">
<interceptor-ref name="logger" />
<interceptor-ref name="security" />
</interceptor-stack>
</interceptors>
<!-- 定义默认的拦截器栈 -->
<default-interceptor-ref name="loggerAndSecurity" />
<action name="user" class="org.lesson05.UserAction">
<result name="success">/user.jsp</result>
<!-- 为user action指定拦截器,引用名即可以是拦截器名,
也可以是拦截器栈 -->
<interceptor-ref name="loggerAndSecurity" /> </action>
</package>
这里要注意的是,如果在一个action中定义了其他的拦截器的引用,那么这个
action将不再使用默认的拦截器的引用了。
如果action想要在默认拦截器引用的基础上添加新的拦截器,那么只能在
action中重新配置默认拦截器引用中的拦截器栈。
<action name="user" class="org.lesson05.UserAction">
<result name="success">/user.jsp</result>
<!-- 为user action指定拦截器,引用名即可以是拦截器名,
也可以是拦截器栈 -->
<interceptor-ref name="timer" />
<interceptor-ref name="loggerAndSecurity" />
</action>
Struts2提供的默认配置文件struts-default.xml定义了默认的拦截器栈的引
用,对于大多数Web应用程序来说,已经够用了。
这里需要注意的是:拦截器栈都是在包中定义的,在一个包中不能引用其他包中定义
的拦截器,除非这两个包有继承关系.
发表评论
-
报错!Syntax error,parameterized types are only available if source level is 5.0 解决
2011-06-24 21:31 2373今天被一个错误折磨了半个小时,在Eclipse里面,原来的项目 ... -
JDBC预编译PreparedStatement支持in参数
2011-06-15 11:43 25300JDBC PreparedStatement预编译SQL语句时 ... -
Struts2学习笔记(四) Struts2架构剖析
2010-10-23 16:02 1314Stru ... -
Struts2学习笔记(三) Struts2中访问request,session,和application对象
2010-10-14 23:04 2277访问request,session,和application对 ... -
Struts2学习笔记(二) Struts2获取用户客户端输入的三种的方法
2010-10-14 22:55 1169Struts2获取用户客户端输 ... -
Struts2学习笔记(一) 环境的搭建与HelloWorld程序
2010-10-14 22:51 945Struts2初体验 1,需要在Web.xml文件中配置Str ... -
Struts2学习笔记前瞻
2010-10-14 22:46 1029几年前,学习Java的时候,主要是看的孙鑫的《Java ... -
ServletContext详解
2010-09-30 20:39 1058ServletContext详解 ServletConte ...
相关推荐
118 8.3.5 Struts2配置文件 119 8.4 Action的配置方式 121 8.4.1 动态方法调用 121 8.4.2 设置action元素的method属性 122 8.4.3 使用通配符配置action 122 8.4.4 默认action 123 8.5 拦截器Interceptor 123 8.5.1 ...
22.4.1 配置进程范围内的第二级缓存 22.4.2 配置集群范围内的第二级缓存 22.4.3 在应用程序中管理第二级缓存 22.4.4 Session与第二级缓存的交互模式 22.5 运行本章的范例程序 22.6 小结 22.7 思考题 ...
22.4.1 配置进程范围内的第二级缓存 22.4.2 配置集群范围内的第二级缓存 22.4.3 在应用程序中管理第二级缓存 22.4.4 Session与第二级缓存的交互模式 22.5 运行本章的范例程序 22.6 小结 22.7 思考题 ...
22.4.1 配置进程范围内的第二级缓存 22.4.2 配置集群范围内的第二级缓存 22.4.3 在应用程序中管理第二级缓存 22.4.4 Session与第二级缓存的交互模式 22.5 运行本章的范例程序 22.6 小结 22.7 思考题 ...
22.4.1 配置进程范围内的第二级缓存 22.4.2 配置集群范围内的第二级缓存 22.4.3 在应用程序中管理第二级缓存 22.4.4 Session与第二级缓存的交互模式 22.5 运行本章的范例程序 22.6 小结 22.7 思考题 ...
1. 介绍.........................................................................................................18 1.1. 关于本书..........................................................................
1. 介绍.........................................................................................................18 1.1. 关于本书...........................................................................
3.3.2. 依赖配置详解 3.3.3. 使用depends-on 3.3.4. 延迟初始化bean 3.3.5. 自动装配(autowire)协作者 3.3.6. 依赖检查 3.3.7. 方法注入 3.4. Bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用...
3.3.2. 依赖配置详解 3.3.3. 使用depends-on 3.3.4. 延迟初始化bean 3.3.5. 自动装配(autowire)协作者 3.3.6. 依赖检查 3.3.7. 方法注入 3.4. Bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用...
12.5.1. iBATIS 1.x和2.x的概览与区别 12.5.2. iBATIS SQL Maps 1.x 12.5.2.1. 创建SqlMap 12.5.2.2. 使用 SqlMapTemplate 和 SqlMapDaoSupport 12.5.3. iBATIS SQL Maps 2.x 12.5.3.1. 创建SqlMapClient 12.5.3.2....