实现了Action处理类之后,就可以在struts.xml文件中配置该Action了。
1.包和命名空间
struts2使用包来组织Action,因此,将Action定义放在包定义下完成,定义Action通过使用<package.../>下的<action.../>子元素来完成,而每个package元素配置一个包。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。
配置<package.../>元素时必须指定name属性,这个属性是引用该包的唯一标识,除此之外,还可以指定一个可选的extends属性,extends属性值必须是另一个包的name属性。指定extends属性表示让该包继承另一个包,子包可以从一个或多个父包中继承到拦截器、拦截器栈、action等配置。namespace属性,定义该包的命名空间;abstract属性,指定该包是否为一个抽象包。
struts2的配置文件是从上到下处理的,所以父包应该在子包前面定义。
<struts>
<package name="default" extends="struts-default">
<interceptors>
</interceptors>
<action >
<resault></resault>
</action>
</package>
</struts>
struts-default 在struts2-core-2.3.16.3.jar文件中,这里已经定义了struts-default抽象包,该包下包含了大量结果类型定义、拦截器定义、拦截器引用定义等。
struts2提供命名空间,主要是为了处理同一个Web应用中包含同名Action的情形,同一个命名空间里不能有同名的Action,不同的命名空间里可以有同名的Action。
当某个包指定了命名空间后,该包下所有的Action处理的URL应该是命名空间+Action名。
struts2还可以显示指定根命名空间,通过设置某个包的namespace=”/”来指定根命名空间。
默认命名空间里的Action可以处理任何命名空间下的Action请求,但是根命名空间下的Action只处理根命名空间下的Action请求。命名空间只有一个级别。
2.Action的基本配置
定义Action时,至少需要指定该Action的name属性,该name属性既是该Action的名字,也是指定了该Action所处理的请求的URL。还需要class属性指定该Action的实现类,如果没有指定,默认使用系统的ActionSupport类。
Action只是一个逻辑控制器,它并不直接对浏览者生成任何响应。因此,Action处理完用户请求后,Action需要将指定的视图资源呈现给用户。因此,配置Action时应该配置逻辑视图和物理视图资源之间的对应关系。
配置逻辑视图和物理视图之间的映射关系是通过<result.../>元素来定义的,每个<result.../>元素定义逻辑视图和物理视图之间的一次映射。
设置允许Action name中出现斜线通过struts.enable.SlashesInActionNames常量指定,该常量的值为true,即允许Action名中使用斜线。
3.使用Action的动态方法调用
对于同一个表单,当用户通过不同的提交按钮来提交同一个表单时,系统需要使用Action的不同方法来处理用户请求,这就需要让同一个Action里包含对个控制处理逻辑。
动态调用
<!--action属性为actionName!methodName的形式,其中actionName指定提交到哪个Action,而methodName指定提交到指定方法-->
action="actionName!methodName"
jsp
<input type="submit" value="注册" onclick="regist();"/>
function regist(){
//获取页面的第一个表单
targetForm = document.forms[0];
//动态修改表单的action属性
targetForm.action="login!regist";
}
4.指定method属性及使用通配符
在配置<action.../>元素时,可以为它指定method属性,则可以让Action调用指定方法,而不是execute()方法来处理用户请求。
<action name="" class="" method="">
</action>
即Action类的每个处理方法都映射成一个逻辑Action,前提是这些方法具有相似的方法签名:方法形参列表为空,方法返回值是String
在配置<action.../>元素时,允许在指定name属性时使用模式字符串(即用”“代表一个或多个任意字符),接下来就可以在class、method属性及<result.../>子元素中使用{N}的形式来代表前面第N个星号()所匹配的子串。
<!--该method属性使用了一个表达式{1},该表达式的值就是name属性值 中第一个*的值-->
<action name="*Action" class="" method="{1}">
</action>
当<action.../>元素的name属性使用了*之后,class属性也可以使用{N}表达式。
<action name="*Action" class="com.hyq.{1}Action">
</action>
struts2完全可以在class属性和method属性中同时使用{N}表达式:
<action name="*_*" method="{2}" class="com.hyq.{1}Action">
</action>
如果有URL为Book_save.action的请求,因为匹配了*_*的模式,且第一个*的值为Book,第二个*的值为save。
实际上struts2允许指定校验文件时准确到处理方法,即ActionName-methodName-validation.xml,所有对Book_save.action的请求,系统将优先使用BookAction-save-validation.xml校验文件。
struts2还可以在<result.../>子元素中使用{N}表达式。
<action name="*">
<result>/WEN-INF/content/{1}.jsp</result>
</action>
假设有URL为abcAction.action请求,在struts.xml文件中配置了如下三个Action,分别为abcAction、*Action和*该使用哪个呢?而是在struts.xml文件中先找到哪个Action,就会由哪个Action来处理用户请求。除非请求的URL与Action的name属性绝对相同,否则将按先后顺序来决定由哪个Action来处理用户请求。因此将name=”*”的Action配置放在最后。
5.配置默认Action
<package name="" extends="struts-default">
<default-action-ref name="simpleViewResultAction"/>
<action name="simpleViewResultAction" class="">
</action>
</package>
将默认Action配置在默认命名空间里就可以让该Action处理所有用户请求,因为默认命名空间的Action可以处理任何命名空间的请求。
6.配置Action的默认处理类
在struts2-core-2.3.16.3.jar压缩包的struts-default.xml文件中有如下配置:
<package name="" extends="struts-default">
<default-class-ref class="com.opensymphony.xwork2.ActionSupport"/>
</package>
本文详细介绍了Struts2框架中的包、命名空间、Action配置等内容,包括如何组织Action、配置默认Action、使用动态方法调用等功能,并解释了Action与视图资源的映射关系。

786

被折叠的 条评论
为什么被折叠?



