2

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

4

2 回答 2

2

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

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

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

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

于 2012-11-26T12:42:53.110 回答
0

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

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

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

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

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

于 2012-11-30T07:37:02.203 回答