Struts 2 ModelDriven Action支持列表和单个项目

时间:2012-12-07 10:16:55

标签: rest struts2

我继承了一些基于struts2 REST-plugin的代码,以下构造让我感到困惑:

@Namespace("/merchants/{id}")
public class MerchantAction extends ActionSupport implements ModelDriven<Object> {
private Merchant merchant = new Merchant(); // A Model
private Iterable<Merchant> merchants;       // A list of models

.... 
public HttpHeaders index() {
    merchants = merchantService.findAllMerchants();
    return new DefaultHttpHeaders("index");
}
@Override
public Object getModel() {
    return (merchant != null ? merchant : merchants);
}

 public void setId(String id) {
    merchant = merchantService.findMerchant(id));
}

换句话说,它似乎是在返回列表和返回getModel()调用中的单个项之间切换。这是犹太人吗?看起来有点奇怪

1 个答案:

答案 0 :(得分:0)

我考虑过你的方法,但终于放弃了。国际海事组织,它失去了强大的行动的优势。

我的解决方案是,为每个操作创建一个ViewModel。在视图模型中,可以有单个模型,模型列表以及其他用于页面使用的项目,例如下拉列表或单选按钮的项目。

所以UserViewModel就像:

public class UserViewModel implements IViewModel<User> {

    private User model;
    private List<User> list;

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

    public User getModel() {
        return model;
    }

    public void setList(List<User> list) {
        this.list = list;
    }

    public List<User> getList() {
        return list;
    }
}

行动就像:

public class UserController implements ModelDriven<UserViewModel> {

    private int id;
    private UserViewModel model = new UserViewModel();

    public String index() { 
        return "success";
    }

    public String show() {
        return "success";
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return this.id;
    }

    @Override
    public UserViewModel getModel() {       
        return model;
    }
}

但是这样,我仍然失去了jsp文件中的快捷方式。我应该写长model.userName而不是短userName

我仍然在寻找最佳解决方案。