随笔-126  评论-247  文章-5  trackbacks-0

成为 Action 的条件

Struts2 对成为 Action 的类的要求很宽松,通常,有下面的几种方式可供选择:
a. 实现 com.opensymphony.xwork2.Action 接口
b. 继承 com.opensymphony.xwork2.ActionSupport 类
c. 一个简单的 POJO 也能成为一个 Action,前提是,你需要给这个类编写 public String xx ( ) { } 方法

简单的 POJO 作为 Action

package fan.tutorial.action;

public class Domain1Action {

    public String execute(){
        System.out.println("Domain1Action[execute] was invoked!");
        return "success";
    }

    public String launch(){
        System.out.println("Domain1Action[launch] was invoked!");
        return "success";
    }
}
在这里,你所要做的仅仅是编写 public String xx ( ) { } 方法而已。

实现 Action 接口

package fan.tutorial.action;

import com.opensymphony.xwork2.Action;

public class Domain2Action implements Action {

    public String execute(){
        System.out.println("Domain2Action[execute] was invoked!");
        return SUCCESS;
    }
    
    public String launch(){
        System.out.println("Domain2Action[launch] was invoked!");
        return SUCCESS;
    }
    
}
Action 接口非常简单,仅是声明了一个抽象的 execute 方法和定义了一些常量,快速看一眼 Action 的源代码:

继承 ActionSupport 类

package fan.tutorial.action;

import com.opensymphony.xwork2.ActionSupport;

public class Domain3Action extends ActionSupport {
    
    private static final long serialVersionUID = 1848203007453752456L;

    public String execute(){
        System.out.println("Domain3Action[execute] was invoked!");
        return SUCCESS;
    }
    
    public String launch(){
        System.out.println("Domain3Action[launch] was invoked!");
        return SUCCESS;
    }
    
}
ActionSupport 是已经实现了 Action 接口以及其它几个常用接口的类,例如数据验证接口等。
这在编程开发上给我们带来了一定的便利,下面是 ActionSupport 的部分源代码:

Action 接收参数的方式

a. 通过 Action 类的属性域来接收参数
b. 通过领域对象来接收参数
c. 通过 ModelDriven 来接收参数

通过 Action 类的属性域来接收参数

package fan.tutorial.action;

import com.opensymphony.xwork2.Action;

public class FieldAction implements Action {

    private String username;

    public String execute() {
        System.out.println("**************************");
        System.out.println("[FieldAction] username : " + username);
        System.out.println("**************************");
        return null;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
具体的做法是:
(1)  在 Action 类中定义属性名称,如上例的 username
(2)  为该属性名称添加 setter 方法,如上例的 public void setUsername...
(3)  通过 URL 将参数传递到 Action,如 field.action?username=u

通过领域对象来接收参数

package fan.tutorial.model;

public class User {

    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "[ username = " + username + ", password = " + password + " ]";
    }
}
package fan.tutorial.action;

import com.opensymphony.xwork2.Action;
import fan.tutorial.model.User;

public class ModelAction implements Action {
    
    private User user;
//  private User user = new User();

    public String execute() {
        System.out.println("**************************");
        System.out.println("[ModelAction] user : " + user);
        System.out.println("**************************");
        return null;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}
具体的做法是:
(1)  在 Action 类中定义出对象,如上例的 user
(2)  为该对象添加 setter 和 getter 方法,如上例的 setUser... 和 getUser... 方法
(3)  通过 URL 将参数传递到 Action,如 model.action?user.username=u&user.password=p
以这种方式接收参数的特点是:
(1)  Action 类中的目标对象你可以选择自己来 new 一个,如上例注释掉的那行。
(2)  Action 类中的目标对象你也可以选择不自己来 new,Struts2 在尝试获取 URL 中目标对象的引用时,当它发现目标对象 user 为 null 时,它会通过反射来调用目标类 User 的无参构造方法来创建出一个目标类的实例,然后再调用该实例的 setUsername 和 setPassword 方法来将 URL 中传递过来的参数填充进对象里面。因此,如果你选择不自己 new 目标对象,那么你必须确保目标类拥有一个无参的构造法。
(3)  参数发送的方式为:对象名称.对象属性名称。如上例 model.action?user.username=u

通过 ModelDriven 来接收参数

package fan.tutorial.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;
import fan.tutorial.model.User;

public class ModelDrivenAction implements Action, ModelDriven<User> {
    
    private User user = new User();

    public String execute() {
        System.out.println("**************************");
        System.out.println("[ModelDrivenAction] user : " + user);
        System.out.println("**************************");
        return null;
    }

    public User getModel() {
        return user;
    }

}
具体的做法是:
(1)  在 Action 类中实现 ModelDriven 接口,并实现 getModel() 方法
(2)  在 getModel() 方法中必须手动创建对象并返回该对象的引用
(3)  通过 URL 将参数传递到 Action,如 model_driven.action?username=u&password=p
以这种方式接收参数的特点是:
(1)  你必须手动创建目标的对象
(2)  参数发送的时候不需要带上对象的名称,如上例的 model_driven.action?username=u

文章示例源码下载

struts-action.zip





  
posted on 2014-03-13 16:49 fancydeepin 阅读(1524) 评论(8)  编辑  收藏

评论:
# re: Struts2 Action 2014-03-14 08:21 | 金利锁业
期待博主更新吧  回复  更多评论
  
# re: Struts2 Action 2014-03-14 09:38 | 魏五锁业
支持博主分享  回复  更多评论
  
# 港城婚纱 2014-03-14 16:07 | 婚纱摄影
话说么看懂。。  回复  更多评论
  
# re: Struts2 Action 2014-03-15 08:29 | 鹏达锁业
支持博主分享  回复  更多评论
  
# re: Struts2 Action 2014-03-15 10:46 | 金利锁业
期待更新啊  回复  更多评论
  
# re: Struts2 Action 2014-03-16 11:45 | 金利锁业
支持博主分享  回复  更多评论
  
# re: Struts2 Action 2014-03-17 08:24 | 鹏达锁业
支持博主分享  回复  更多评论
  
# re: Struts2 Action 2014-04-05 18:17 | sailboats
赞一个!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: