0

JBoss EL 解析器在线文档中有这句话 :

充分理解这个 EL 扩展是如何工作的很重要。呈现页面时,会存储参数名称(例如,hotel.id 和 user.username),并在提交页面时评估(作为值表达式)。您不能将对象作为参数传递!

但是我在我的项目中使用了对象作为函数参数,然后我不小心读到了这个提示并且它起作用了!这怎么可能?我怕现在有什么魔法……

编辑:请注意,我实际上使用完全有价值的对象作为参数,而我们的框架堆栈(MyFaces、Facelets、Trinidad、Spring、Webflow)没有任何问题,我在问这怎么可能。例如,我可以在 xhtml 模板中执行此操作:“#{pageBean.formatAccount(account)}”,其中 account 是非常复杂的类。我知道根据文档,它不应该是可能的,但它是。我应该害怕将来遇到一些困难吗?这就是问题所在。

4

2 回答 2

2

这意味着在那里说“非标准”对象。即不是String,Integer等,而是像 Javabeans 等完全有价值的值对象。


更新:我现在看到了文档的含义。这意味着这些值实际上不是作为复杂对象传递的,而是作为表示值表达式的普通字符串。从字面上看,, "bean.hotel","bean.user.address"等。提交页面时,这些字符串被评估为值表达式,并且将从 JSF 内存中检索与其关联的复杂对象。

这里的重要性在于,您需要在表单提交的后续请求中保留与表单初始显示中相同的复杂对象。如果 bean 是请求范围的,则原始对象将在响应完成时丢失。您想在后续请求期间在 bean 的构造函数中再次构造完全相同的复杂对象。解决此“问题”的另一种方法是将 bean 置于更广泛的范围内,例如会话范围或 Seam 对话范围或 JSF 2.0 视图范围。

这也是文档的下一句试图说明的内容:

您必须确保参数不仅在呈现页面时可用,而且在提交时也可用。如果在提交页面时无法解析参数,则将使用空参数调用操作方法!

于 2010-08-08T04:51:04.553 回答
1

在Seam 框架中是允许的。仅JSF 不允许它。这是使用Seam 的优点之一。您可以将对象作为参数传递。

于 2010-08-08T04:37:45.423 回答