Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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应用根路径下的所有页面。