【问题标题】:Disadvantages to define a form bean with session scope in struts 1.x在 struts 1.x 中定义具有会话范围的表单 bean 的缺点
【发布时间】:2012-11-26 11:25:07
【问题描述】:

在 struts 1.x 中使用具有会话范围的表单 bean 的主要缺点是什么?

【问题讨论】:

    标签: session struts struts-1


    【解决方案1】:

    如果您的表单包含从复选框填充的属性,您需要实现reset()。您不需要它来请求范围内的表单 bean。

    如果您第二次显示创建表单,则需要将表单重置为其默认值,否则创建表单将重新显示来自上次创建/更新对象的数据。

    您不能让两个浏览器选项卡或框架使用相同的表单,因为它们会互相影响。

    默认情况下表单bean应该在请求范围内。

    【讨论】:

    • 谢谢。我有一个两页的表格(第二个表格是从 json 文本动态生成的)。如果我不使用会话表单 bean,如何将 bean 传递到第二页?
    • 使用隐藏字段,或者通过将 bean 存储在 UUID 下的会话中并将 UUID 作为隐藏字段传递。
    • 在第一种情况下,有隐藏字段来表示第二种表单bean的属性吗?
    • 是的,因为它是第二个将填充此隐藏字段的表单 bean。
    • 我在将 bean 作为第二种形式 bean 的属性传递时遇到了一些问题。你能看看这个问题吗? stackoverflow.com/questions/13585948/…
    【解决方案2】:

    只需尝试同时使用这两种范围,然后为自己选择一个首选。但我应该说,当您使用持久对象(以及像 Hibernate 之类的 ORM 工具)时,差别很小,因为属性在请求之间被持久保存在数据库中。

    1. 臭名昭著的复选框(和相应的布尔属性)。如果您正在使用持久对象(编辑某些实体的布尔属性),您将需要额外的代码来重置复选框。范围无关紧要,因为布尔属性是持久的(在请求之间不会自动清除)。

    2. 当您使用复杂的持久对象(对象的层次结构,由 Hibernate 映射到一组相关的数据库表上)时,您通常只需将持久对象嵌套到 form-b​​ean 中,然后使用嵌套属性,例如<html:text property="purchase.client.name" />(当然,您可以在 form-b​​ean 中为整个层次结构的每个属性创建 getter/setter,但这很乏味,并且会使进一步的开发复杂化)。对于创建,您只需在 form-b​​ean 中创建新的空 purchase 对象,对于版本,您将从数据库中加载现有的 purchase(编辑请求将包含您要更改的对象的一些标识符)。范围不再重要。

    3. 关于两个浏览器选项卡。使用 AJAX 请求会出现更重要和被低估的问题,尤其是当它们不是幂等的并且在时间上重叠(浏览器发出更新 1 的请求,然后请求更新 2 ,而更新 1 仍在服务器上处理) - 虽然这是一种非常奇怪的设计(我的意思是在一个用户的一个会话中同时重叠更新请求)。是的,在这种情况下,您需要在不同的请求中分离数据。但是此外,您的action(如果我们谈论的是 Struts 1)应该是线程安全的,并且您的业务逻辑应该准备好并发/冲突更新(解决同步问题、锁定对象、合并/覆盖/拒绝更新等)。如果您正在开发多用户应用程序,当两个不同的用户想要同时更改同一个对象时,也可能会发生这种情况。同样,与整个问题相比,bean 范围并不重要。

    如您所见,会话范围的表单 bean 只有一个缺点,并且仅与严重的设计缺陷(来自一个用户的重叠更新请求)有关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 2010-10-29
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      相关资源
      最近更新 更多