Struts 2 CRUD的最佳实践

时间:2011-01-27 18:57:13

标签: webforms struts2 crud

所以我在网上发现了一堆Struts 2 CRUD示例:

Struts 2 CRUD Demo

和几本书:

Apache Struts 2 Web应用程序开发ISBN:978-1847193391

Struts 2设计与编程ISBN:978-0980331608

但是他们所有人在如何进行表格填充方面都有所不同。

有人建议实现Java接口 ModelDriven Prepareable 来调用准备函数来预先填充任何所需的数据成员。

其他人建议您创建自己的 PrepareForUpdate 操作,该操作会调用预填充功能,然后重定向到主编辑视图。

他们还非常关注如何传递对象标识符以指示要检索的对象以进行编辑。 SOme建议截取其他人在URL参数中抛出的内容并通过 ActionContext 检索它或通过 s:hidden 字段传递它。

Struts 2中是否有一种最佳实践方式来进行表单填充?

上述方法有哪些优点/缺点?

2 个答案:

答案 0 :(得分:6)

我不知道任何记录的最佳实践,但我已经使用Webwork和Struts2大约三年了,所以我可以告诉你我在我的项目中使用了什么。顺便说一下,你链接到的CRUD演示文档让我觉得有些过时(我从项目网站上意识到它)。

我将CRUD工作分为三个不同的行动:

  • 列出实体的操作。它支持分页并填充某种类型的表格或网格视图。
  • 处理添加和编辑功能的操作。使用prepare()方法设置下拉列表等。
  • 处理删除功能的操作。
  

有人建议实现Java接口ModelDriven或Prepareable来调用come prepare函数来预先填充任何所需的数据成员。

这是我提倡的方法,虽然我不使用ModelDriven接口。有关详细信息,请查看how Struts2 ModelDriven interface works以及我的回答评论。您是否使用ModelDriven只是个人选择。另外,请查看why is model-driven action preferred over object backed bean properties.

  

其他人建议您创建自己的PrepareForUpdate操作,该操作会调用预填充函数,然后重定向到主编辑视图。

我之前没有看到过,根据你的描述,我会避免这种技巧。执行重定向并创建其他HTTP请求以实现prepare()方法旨在处理的相同内容似乎很浪费。

  

他们还非常关注如何传递对象标识符以指示要检索的对象以进行编辑。

只需传递网址或表单中的标识符即可。这是Web应用程序的标准方法。

答案 1 :(得分:0)

我已经使用Struts 2大约3年了。我在同一个动作中一起使用ModelDriven和Prepareable。每个域对象(模型)都有一个struts动作类,它根据id是否传递给动作返回列表或单个对象。这对我来说效果很好,唯一有问题的是使用Ajax时。如果我使用它,我通常将我的Ajax操作分离为模型的单独操作。我将模型ID以及我可能需要的任何相关对象存储为视图中的隐藏HTML字段。

使用此方法,操作和视图是宁静的。您可以长时间离开页面并调用操作,而不必担心操作会失败。这是一个例子:

public class ApplicationAction extends MyBaseAction 
implements ModelDriven<Application>, Preparable {

    private static final long serialVersionUID = 7242685178906659449L;
    private ApplicationService applicationService;
    private Application application;
    private Integer id;
    List<Application> allApplications;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

    public Application getModel() {
        return application;
    }

    public void prepare() throws Exception {
        if(id == null || id.intValue() == 0){
            application= new Application();
        }else{
            application= applicationService.getApplication(id);
        }
    }

    @SkipValidation
    public String list() throws Exception {
        allApplications = applicationService.getApplications();
        return SUCCESS;
    }

    @Validations( visitorFields = {@VisitorFieldValidator(message = "Validation Error", fieldName = "model", appendPrefix = false)})
    public String update() throws Exception {
        applicationService.saveApplication(application);
        addActionMessage("Application Saved Successfully.");
        return SUCCESS;
    }

    public void setApplicationService(ApplicationService applicationService) {
        this.applicationService = applicationService;
    }

    public List<Application> getAllApplications() {
        return allApplications;
    }

}