`

Action配置的各项默认值及名称的搜索顺序

阅读更多

一、Action配置的各项默认值:
1。如果没有为action指定class,默认就是ActionSupport类;
2。如果没有为action指定method属性,则默认执行execute方法;
3。如果没有指定result的name属性,默认值为success。
ActionSupport类中的execute方法的源码如下所示:

 public String execute()   throws Exception
  {
   return "success";
  }

 (1) .我们在jsp页面之间写链接总会是.../xxx.jsp,而如果我们想屏蔽掉具体的jsp,只需要所jsp页面配置成一个ForwardAction即可实现。示例如下:在根目录下有一个xxx.jsp,我们strtus.xml中作如下配置:

<package name="def" extends="struts-default">        
        <action name="forward">
            <result >/xxx.jsp</result>
        </action>
</package>

 随后再在根目录下的aa.jsp中增加如下代码:
<a href="<%=request.getContextPath()%>/forward.action">forward</a>
最后再测试访问aa.jsp,在aa.jsp中页面中直接点链接便可以跳到xxx.jsp,观察地址栏发现此时跳到xxx.jsp页面是进行的服务器内部转发,如果我们在上面的配置中的result增加type属性变成<result type="redirect">/xxx.jsp</result>,实现的就是页面重定向,这样地址栏中就会出现xxx.jsp。 像上面的这种forward形式的action实质是执行的ActionSupport 这个Action。

(2).如果我们为action指定的class,但没有为action指定method属性,则默认执行execute方法,配置如下所示:

<package name="myDemo" namespace="/demo" extends="struts-default">
		<action name="test" class="demo.action.TestAction">
		<result>/WEB-INF/jsp/test.jsp</result>
		</action>
</package>

 此时如果demo.action.TestAction类中没有execute() 方法,则访问/demo/test.action时会报错。此时TestAction类必须有execute()方法。

因为如果没有指定result的name属性,默认值为success。所以上面的配置文件中的<result>的name属性即为success,所以TestAction类中的execute() 方法必须返回"success"否则会抛出如下异常:

警告: Could not find action or result
No result defined for action demo.action.TestAction and result test

 

二、Action名称的搜索顺序

1.获得请求路径的URI,例如url是:http://server/struts2/path1/path2/path3/test.action
2.首先寻找namespace为/path1/path2/path3的package,如果存在这个package,则在这个package中寻找名字为test的action,如果不存在这个package则转步骤3;
3.寻找namespace为/path1/path2的package,如果存在这个package,则在这个package中寻找名字为test的action,如果不存在这个package,则转步骤4;
4.寻找namespace为/path1的package,如果存在这个package,则在这个package中寻找名字为test的action,如果仍然不存在这个package,就去默认的namaspace的package下面去找名字为test的action,如果还是找不到,页面提示找不到action。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics