3.5.4 配置Action
一旦提供了 Action 的实现类后,就可以在 struts.xml 文件中配置该 Action。配置 Action就是让Struts 2容器知道该Action的存在,并且能调用该Action来处理用户请求。因此,我们认为:Action是Struts 2的基本“程序单位”。
Struts 2使用包来组织Action,因此,将Action定义放在包定义下完成,定义Action通过使用<package.../>下的<action.../>子元素来完成。定义Action时,至少需要指定该Action的name属性,该name属性既是该Action的名字,也是该Action需要处理的URL的前半部分。
除此之外,通常还需要为<action.../>元素指定一个 class 属性,其中 class 属性指定了该Action的实现类。
注意
class属性并不是必需的,如果我们不为<action .../>元素指定class属性,则系统默认使用ActionSupport类。
因此,一个简单的Action配置片段如下:
<package> <!-- 配置处理用户请求的Action,其实现类为lee.LoginAction --> <action name="login" class="lee.LoginAction"/> ... <package>
Action只是一个控制器,它并不直接对浏览者生成任何响应。因此,Action处理完用户请求后,Action 需要将指定的视图资源呈现给用户。因此,配置 Action 时应该配置逻辑视图和物理视图之间的映射。
配置逻辑视图和物理视图之间的映射关系是通过<result .../>元素来定义的,每个<result .../>元素定义逻辑视图和物理视图之间的一次映射。
一个完整的Action配置定义如下:
<package> <!-- 配置处理用户请求的Action,其实现类为lee.LoginAction --> <action name="login" class="lee.LoginAction"> <result .../> <result .../> </action> ... <package>
关于<action .../>的子元素<result .../>的配置在3.6节中会有更详细的讲解。
定义<action .../>元素时,需要指定name属性,通常name属性都是由字母和数字组成的,如果需要在name属性中使用斜线(/),则需要指定Struts 2框架允许Action name中出现斜线。设置允许Action name中出现斜线通过struts.enable.SlashesInActionNames常量指定,设置该常量的值为true,即允许Struts 2框架中使用斜线。
提示:
关于Action的name属性的命名规则。Action的name命名是非常灵活的,但如果为 name 属性分配一个带点(.)或者带中画线(-)的值,例如 my.user 或者my-action等,则可能引发一些未知异常。因此,不推荐在Action的name属性值中使用点(.)和中画线(-)。
如果我们希望Struts 2应用可以列出Web应用根路径下的所有页面,则可以在struts.xml文件中配置一个name=""的Action,该Action就可以处理列出Web应用根路径下的所有文件请求。例如下面的配置文件。
程序清单:codes\03\3.5\listDir\WEB-INF\src\struts.xml
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- 配置国际化资源常量,指定国际化资源文件的baseName为messageResource --> <constant name="struts.custom.i18n.resources" value="messageResource"/> <!-- 下面配置名为lee的包,该包继承了Struts 2的默认包 没有指定命名空间,将使用默认的命名空间 --> <package name="lee" extends="struts-default"> <!-- 此处省略了配置其他Action的代码 --> ... <!-- 配置列出Web应用根路径下所有文件的Action --> <action name=""> <result>.</result> </action> </package> </struts>
上面的配置文件中粗体字代码就可以实现列出Struts 2应用根路径下的所有页面。