自定义的Action一般继承与ActionSupport,并定义变量,覆盖execute()方法,变量的值会被Struts2通过setter方法自动的就行赋值,execute方法直接使用即可,其中这个方法的返回值会配置在struts.xml中的

在ActionSupport直接实现了Actgion接口 如下图所示

ActionSupport中实现了其他的方法,例如数据校验,国际化等等;

 

Action详解(一)_第1张图片

如上图所示是Action的源码,我想聪明的读者已经可以想到我们在编程弄应该尽量使用源码中所示的这些预置结果名称

不继承任何类的Action

Struts2的Action并不一定要实现Action接口,任何的POJO都可以用作Action,只要这个Action具有public String execute()方法,如果Struts2发现Action类没有实现Action接口,会通过反射来调用execute()方法,例如(getter,setter方法 略)

   
   
   
   
  1. import com.opensymphony.xwork2.ActionSupport;  
  2.  
  3. public class LoginAction extends ActionSupport{  
  4.     /**  
  5.      *   
  6.      */  
  7.     private static final long serialVersionUID = 1L;  
  8.     private String account;  
  9.     private String passworld;  
  10.       
  11.     public String execute(){  
  12.         System.out.println("-----------");  
  13.         if("HelloWorld".equalsIgnoreCase(account)&&"123456".equals(passworld)){  
  14.             return SUCCESS;   
  15.         }  
  16.         return LOGIN;         
  17.     }  
  18. public String login() throws Exception{  
  19.          return execute();//返回主方法  
  20.    }  
  21. public String logout(){  
  22.          return "logout";  //返回注销页面
  23.    }  

如上图所示:login(),logout()并不是默认的执行方法,可将其配置到struts.xml中或者通过特定的URL直接执行这些非默认的方法

通过URL执行Acton方法

执行Action的非默认方法,例如如上所示的logout()方法,可以使用action!method.action的URL形式访问,其中Action为Struts.xml文件中配置的名称,method为Action的方法名,中间用!分隔开例如我们可以这样直接通过URL来执行Action的方法 例如:http://localhost:8080/struts2/loginpersion!logout.action

将执行方法配置到Action

也可以把方法用method配置到Action中,省去!符号。这时的Action名称可以随便的进行指定。可以为每一个方法均定义一种Action名称,然后使用该Action名称对应的访问方式访问Action,这样的缺点是每一个Action需要重复配置多次 例如下面代码

 

   
   
   
   
  1. <action name="LoginAction" class="com.cn.one.LoginAction" method="login"> 
  2.  
  3.     <result name="success">/success.jspresult> 
  4.     <result name="logon">/index.jspresult> 
  5.  
  6. action> 
  7.           
  8. <action name="LoginoutAction" class="com.cn.one.LoginAction" method="loginout"> 
  9.  
  10. <result name="success">/success.jspresult> 
  11. <result name="logon">/index.jspresult> 
  12.  
  13. action> 

从上面可以看出配置中 只有name于method属性是不一样的 class是一样的,请求LoginAction的时候会执行login方法,请求LoginoutAction方法的时候会执行loginout方法  当然读者可能感觉这样的写法有写费劲,我们也可以通过使用通配符的方式进行简化上面的操作,这里就不再多做陈述。