配置Action就是让Struts 2的容器知道Action的存在,并且能调用Action来处理用户请求,Struts 2是用包来管理Action的,所以Action是在package元素下定义的。
Action只是一个控制器,不对用户的请求作任何响应,因此当Action处理完所有的用户请求后,它需要将一个视图资源返回给用户,因此配置Action时需建立逻辑与物理视图的映射。(class)默认的Action是com.opensymphony.xwork2.ActionSupport。
3.1 struts.xml中Action配置实例:
<packagename="default"namespace="/"extends="struts-default"> <actionname="login"class="com.action.LoginAction"> <!-- result配置逻辑视图和物理视图的映射关系 , 每一个<result/>元素就是一个逻辑视图与物理视图的映射--> <resultname="success">success.jsp</result> </action> </package> |
3.2 Action配置的各项默认值
(1)、如果没有为action指定class,默认是ActionSupport。
(2)、如果没有为action指定method,默认执行action中的execute()方法。
(3)、如果没有为action指定result,默认值为success。
DMI == Dynamic Method Invocation
Struts 2中一个Action处理多个请求时,可以使用动态方法调用。
将不同的请求交给同一个Action的不同方法去做。
4.1 方式一 —— 指定method属性
一个Action可处理多个逻辑。在struts.xml配置文件中配置Action时,可以为其指定method属性,可让Action调用指定的方法来处理用户请求,而不是处理默认的execute()方法。
<!-- 使用LoginAction的regist方法来处理注册请求 --> <actionname="reg"class="com.action.LoginAction"method="regist"> </action> |
4.2 方式二 —— 感叹号
首先需要开启一个开关:
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
在处理用户请求的Action的名称后加上!然后再加上处理请求的方法名称。
<!-- action的形式为actionName!MethodName --> <formaction="login!userlogin"method="post"> </form> |
JS代码示例: <scripttype="text/javascript"> function userlogin(){ var form=document.forms[0]; form.action="login!userlogin"; form.submit(); } </script> |
4.3 方式三 —— 通配符 *
在配置Action时需填写name、class、method属性,都支持通配符。
思想:约定优于配置(约定好了名称以后,才可成功使用通配符)
<action="*_*" class="day02.{1}Action" method="{2}"
<result>{2}.jsp</result>
/action>
自动匹配参数,第一个*用{1}来代替,第二个*用{2}来代替……
{0}表示匹配所有内容
{1}表示第一个*的内容
4.4 默认的Action
有时用户请求非常简单,比如请求一个简单的视图资源,不需做其他处理或一个简单的转发。
<default-action-ref>默认的Action引用,当系统找不到指定的Action时,就会交个这个默认的Action去处理。
<packagename="org"namespace="/"extends="struts-default"> <!--配置默认的Action只需要配置<default-action-ref>即可,同时必须指定它的name属性,指向已存在的Action --> <default-action-refname="login"></default-action-ref> <actionname="login"class="com.action.LoginAction"method="login"> </action> </package> |