【问题标题】:How Struts2 ModelDriven interface worksStruts2 ModelDriven 接口如何工作
【发布时间】:2011-05-29 09:02:52
【问题描述】:

我有一个疑问。 Struts2 Modeldriven 接口如何工作。在我的应用程序中,我使用了一个表单。我将 setter 和 getter 放置在与表单名称相同的位置。是否可以使用 setter 和 getter 放置多个 ModelDriven 对象。如果我这样放置那它怎么识别呢?

【问题讨论】:

  • 避免使用模型驱动,除非您的表单是多页表单(甚至可能是这样)。
  • @Quaternion 你说的多页表单是什么意思?
  • @KyelJmD 我从服务器端考虑,在客户端它们将是单独的页面,因此是单独的表单,但在服务器端,您在单个模型上使用多个操作,从概念上讲,您是将整个事物视为一个单一的形式。这就是我的意思,也许我可以更好地选择我的话。如果需要查找的东西,ajax 技术往往更直观,然后可以完成一次提交......当然有权衡。
  • 我不久前使用了ModelDriven。我想要一个位于堆栈顶部的对象,但不知道那将是什么对象,除了它将是一个 JPA 实体。调用将准备操作并设置正确的实体,这样当 ORM 实体更新时,服务和操作层可以保持不变。然而,客户可以调用的内容将会改变。无论如何,关键是我想要堆栈顶部的东西,但直到运行时才知道,在那种情况下,我认为它确实有帮助。

标签: struts2 model-driven


【解决方案1】:

任何实现ModelDriven 接口的动作都必须提供一个getModel() 方法,该方法返回代表动作模型的对象。任何传递给动作的参数都被假定为模型的子属性。 在 ModelDriven 操作中,每个操作只能有一个模型。

例如,假设我们有一个名为Profile 的模型和一个用于编辑我们个人资料的操作。在我们的表单中,我们的网站有一个文本字段。如果不使用ModelDriven,您的操作中将有getWebsitesetWebsite 方法。使用ModelDriven,模型上的getter 和setter 将被调用。实际上,getModel().setWebsite("http://stackoverflow.com")

示例

public class EditProfileAction extends ActionSupport implements ModelDriven<Profile> {
    private Profile profile;

    // todo: other methods

    @Override
    public Profile getModel() {
        return profile;
    }
}

public class Profile {
    private String website;

    public String getWebsite() {
        return website;
    }

    public void setWebsite(String website) {
        this.website = website;
    }
}

【讨论】:

  • 我觉得模型驱动很傻。如果你的模型叫做 Person 为什么不只拥有一个 person 属性呢? Struts2 将能够从表单访问深度嵌套的属性,就像我们可以从视图访问一样。使用模型驱动,您只能拥有一个模型,而以典型方式完成后,您可以拥有任意数量的对象。这个问题很可能是在对象获取上纠缠不清,这要通过 DI 来解决,然后我们不需要任何 Preparable 或 ModelDriven 接口。
  • 虽然我发现 Preparable 非常有用,但我同意 ModelDriven,Quaternion。我个人只是直接在动作上使用对象。
  • 同意四元数。我也没有明白 ModelDriven 的意义。此外,当您需要将数据存储在内存中时,将其存储在通过 ApplicationContextAware 可用的应用程序映射中,如果您需要存储用户数据(如配置文件内容),将其存储在通过 SessionAware 接口可用的会话映射中。始终保存在数据库中。
【解决方案2】:

同意... ModelDriven 看起来类似于 Struts1 中的 ActionForm 并且具有相似性,我相信提供了这种方法。即使你有你的模型,你也必须遵循 ObjectBacked 方法来设置模型中包含的对象值。

【讨论】:

    【解决方案3】:

    对于ModelDriven,您一次只能填充一个pojo。您不能在单个操作类中使用多个 ModelDriven。因为getModel() 方法填充了ModelDrive&lt;Pojo&gt; 中指定的Pojo 的对象。它会尝试在这个pojo 中找到getter。字段名称应与表单名称匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 2015-05-01
      相关资源
      最近更新 更多