是否可以使用JBoss EL解析器将对象用作EL中的函数参数?

时间:2010-04-21 10:48:19

标签: java jsf jboss facelets el

JBoss EL resolver online documentation中有这句话:

  

完全理解EL扩展的工作方式非常重要。呈现页面时,将存储参数名称(例如,hotel.id和user.username),并在提交页面时对其进行评估(作为值表达式)。您不能将对象作为参数传递!

但是在我意外阅读这个提示之前我曾在项目中使用过对象作为函数参数而且它有效!这怎么可能?我害怕现在有一些魔法......

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

2 个答案:

答案 0 :(得分:2)

这意味着在那里说“非标准”物体。即不是StringInteger等,而是像Javabeans这样的值得提升的价值对象。


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

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

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

  

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

答案 1 :(得分:1)

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