【问题标题】:Best Practices for Struts 2 CRUDStruts 2 CRUD 的最佳实践
【发布时间】:2011-06-16 18:35:00
【问题描述】:

所以我在网上找到了一堆 Struts 2 CRUD 示例:

Struts 2 CRUD Demo

还有几本书:

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

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

但是他们都在如何形成人口方面有所不同。

有些人建议实现 Java 接口 ModelDrivenPrepareable 来调用来准备函数来预填充任何需要的数据成员。

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

他们还非常关注如何传递对象标识符来指示要检索哪些对象进行编辑。有些人建议拦截器将其他人扔到 URL 参数中并通过 ActionContext 检索它或通过 s:hidden 字段传递它。

在 Struts 2 中是否有最佳实践方法来进行表单填充?

上述方法的优缺点是什么?

【问题讨论】:

    标签: webforms struts2 crud


    【解决方案1】:

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

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

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

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

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

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

    我以前没有见过,根据你的描述,我会避免这种技术。执行重定向并创建一个额外的 HTTP 请求来实现 prepare() 方法旨在处理的相同事情似乎很浪费。

    他们还非常了解如何传递对象标识符以指示要检索哪个对象进行编辑。

    只需在 URL 或表单中传递标识符。这是 Web 应用程序的标准方法。

    【讨论】:

    • +1 我也这样做。通常在同一个类中具有这些操作,对于 ajax 功能,我只需将 json 包和结果类型注释打到类上,它都可以正常工作。
    【解决方案2】:

    我已经使用 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;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 2016-11-26
      相关资源
      最近更新 更多