我尝试将表格的长度存储在 JavaScript 的隐藏输入中时javax.el.PropertyNotWritableException
:
Caused by: javax.el.PropertyNotWritableException: /view/ci/buttons.xhtml at line 34 and column 73 value="#{fn:length(order.phases)}": Illegal Syntax for Set Operation
at org.apache.myfaces.view.facelets.el.TagValueExpression.setValue(TagValueExpression.java:125)
JSF:
<h:inputHidden id="phasesCount" value="#{fn:length(order.phases)}"/>
我不明白那个错误,fn:length是否支持只读操作,或者我错过了什么?
答案 0 :(得分:3)
完全可以预期此行为。 <h:inputHidden>
也会在表单提交时处理。这允许通过JavaScript操纵隐藏值。但是,EL函数调用不是有效的setter方法操作。因此这个例外。与每个其他UIInput
组件一样,该值必须是一个值得满足的bean属性。
鉴于您将变量传递给JavaScript的具体功能要求,<h:inputHidden>
实际上是该作业的错误工具。让JSF打印出来就好像它是JS变量一样:
<script>var phasesCount = #{fn:length(order.phases)};</script>
或者,如果确实需要一个隐藏的输入元素,即使它在服务器端没有完全使用,那么请使用纯HTML元素:
<input type="hidden" id="phasesCount" value="#{fn:length(order.phases)}" />
请注意,您可以使用完全任意的HTML元素或属性来执行相同的工作:
<div id="phasesCount" data-phasesCount="#{fn:length(order.phases)}">
JS也可以访问此值。
答案 1 :(得分:0)
<h:inputHidden id="phasesCount" value="#{fn:length(order.phases)}"/>
inputHidden
是input control。在提交表单时,JSF将尝试在此表达式上调用setValue。