0

我继承了一些基于 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() 调用中的单个项目之间切换。这是犹太洁食吗?我觉得有点奇怪

4

1 回答 1

0

我考虑过你的方法,但最终放弃了。IMO,它失去了强类型动作的优势。

我的解决方案是,为每个动作创建一个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文件中的快捷方式。我应该写 longmodel.userName而不是 short userName

我仍在寻找最好的解决方案。

于 2013-03-13T06:58:47.250 回答