Action的实现方法
在传统的自定义MVC框架中,action都要实现action接口,这些接口都需要自定义MVC框架自己定义,实现MVC框架接口与MVC框架耦合。在shtruts框架中action的实现方法很灵活,主要有三种方法。
第一种继承ActionSupport类
自定义的action一般直接继承ActionSupport类,并定义变量,覆盖的execute()的方法,变量通过struts中的set进行赋值,execute()方法中直接使用即可。Execute中方法的返回值必须在strutsz.xml中进行<result>配置。例如(get,set方法)
package cn.test.action;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class LoginAction extends ActionSupport{
private String name;//帐号
private String password;//密码
//主方法
public String execute(){
//如何匹配就返回成功页面
if("hello".equals(name)&&"123".equals(password)){
return "success";
}else{
return "fail";//失败返回登录页面
}
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
第二种定义Action接口
自定义的action也可以实现action的接口,在继承actionsupport类时也可以实现自定义的接口,在接口中只自定义一个execute()主方法以及常用的结果名称例如(fail。Success,input,login等),编程中尽量要使用这些结果名称。例如
public interface Action {
public abstract String excute() throws Exception;//主方法
public static final String SUCCESS = "success";//预设置的result
public static final String ERROE = "erroe";//预设置的result
public static final String INPUT = "input";//预设置的result
public static final String FAIL = "fail";//预设置的result
public static final String LOGIN = "login";//预设置的result
}
直接实现实现接口以及execute()方法即可。
第三不继承任何类的ACTION
在struts2中不一定要实现Action接口,任何的POJO都可以用作Action,只是在这个action中我们必须定义一个public String execute()方法,如果action没有实现这个方法,会通过反射机制来实现execute方法。例如(set和get方法省略)
public class LoginAction {
private String name;//帐号
private String password;//密码
//主方法
public String execute(){
//如何匹配就返回成功页面
if("hello".equals(name)&&"123".equals(password)){
return "success";
}else{
return "fail";//失败返回登录页面
}
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
Action的搜索顺序。
第一步:假设获取的请求路径url为http://localhost:8080/Test/test/path/login.
第二步:Action的搜索顺序是首先搜索寻找namespace为/test/path的package。如果不存在package则执行步骤三,如果存在package,则在这个package中寻找名字为tlogin的action,,当在该package中寻找不到就会直接跑到默认的package里面寻找action,如果在默认的namespace的包中还寻找不到action,页面提示找不到action。(在这里说一下默认的命名空间,,它的格式如下:
<package name="default" namespace="" extends="/struts-default">
<action name="test_*" class="cn.test.action.TestAction" method="{1}">
<result name="hello">/result.jsp</result>
</action>
<package>
默认的命名空间为空字符串。
第三步:寻找namespace为/test的package。如果不存在package则执行步骤四,如果存在package,则在这个package中寻找名字为login的action,,当在该package中寻找不到就会直接跑到默认的package里面寻找action,如果在默认的namespace的包中还寻找不到action,页面提示找不到action。
第四部;寻找namespace为/的package。如果不存在package则执行步骤三,如果存在package,则在这个package中寻找名字为login的action,,当在该package中寻找不到就会直接跑到默认的package里面寻找action,如果在默认的namespace的包中还寻找不到action,页面提示找不到action。
Action的各项默认值。
在strut2中我们希望可以把处理的结果直接转发到页面了在struts.xml配置.如图
<struts>
<package name="default" namespace="/test" extends="/struts-default">
<action name="test" class="cn.test.action.TestAction" method="add">
<result name="hello">/result.jsp</result>
</action>
</package>
</struts>
在有的开发只能struts,xml中没有配置class,method或者result等属性的值,但是我们要知道他们各自有自己的默认值,在没有配置的时候他们会自动调用他们额默认值,class的默认属性为Acttiononsupport,method的默认值为execute,result的默认值为success,关于这个几个属性的默认值,可以到actionsupport类中查看。