【发布时间】:2012-11-26 11:25:07
【问题描述】:
在 struts 1.x 中使用具有会话范围的表单 bean 的主要缺点是什么?
【问题讨论】:
在 struts 1.x 中使用具有会话范围的表单 bean 的主要缺点是什么?
【问题讨论】:
如果您的表单包含从复选框填充的属性,您需要实现reset()。您不需要它来请求范围内的表单 bean。
如果您第二次显示创建表单,则需要将表单重置为其默认值,否则创建表单将重新显示来自上次创建/更新对象的数据。
您不能让两个浏览器选项卡或框架使用相同的表单,因为它们会互相影响。
默认情况下表单bean应该在请求范围内。
【讨论】:
只需尝试同时使用这两种范围,然后为自己选择一个首选。但我应该说,当您使用持久对象(以及像 Hibernate 之类的 ORM 工具)时,差别很小,因为属性在请求之间被持久保存在数据库中。
臭名昭著的复选框(和相应的布尔属性)。如果您正在使用持久对象(编辑某些实体的布尔属性),您将需要额外的代码来重置复选框。范围无关紧要,因为布尔属性是持久的(在请求之间不会自动清除)。
当您使用复杂的持久对象(对象的层次结构,由 Hibernate 映射到一组相关的数据库表上)时,您通常只需将持久对象嵌套到 form-bean 中,然后使用嵌套属性,例如<html:text property="purchase.client.name" />(当然,您可以在 form-bean 中为整个层次结构的每个属性创建 getter/setter,但这很乏味,并且会使进一步的开发复杂化)。对于创建,您只需在 form-bean 中创建新的空 purchase 对象,对于版本,您将从数据库中加载现有的 purchase(编辑请求将包含您要更改的对象的一些标识符)。范围不再重要。
关于两个浏览器选项卡。使用 AJAX 请求会出现更重要和被低估的问题,尤其是当它们不是幂等的并且在时间上重叠(浏览器发出更新 1 的请求,然后请求更新 2 ,而更新 1 仍在服务器上处理) - 虽然这是一种非常奇怪的设计(我的意思是在一个用户的一个会话中同时重叠更新请求)。是的,在这种情况下,您需要在不同的请求中分离数据。但是此外,您的action(如果我们谈论的是 Struts 1)应该是线程安全的,并且您的业务逻辑应该准备好并发/冲突更新(解决同步问题、锁定对象、合并/覆盖/拒绝更新等)。如果您正在开发多用户应用程序,当两个不同的用户想要同时更改同一个对象时,也可能会发生这种情况。同样,与整个问题相比,bean 范围并不重要。
如您所见,会话范围的表单 bean 只有一个缺点,并且仅与严重的设计缺陷(来自一个用户的重叠更新请求)有关。
【讨论】: