一、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。