<h:inputText id="theValue" readonly="true"
value="#{readonlyBean.theValue}" onClick="setDay(this)"/>
以上的使用情况还是比较多的. 主要应用在: 让用户选择时间, 禁止输入. 在HTML中直接设置其readonly属性即可. 但在JSF中, 是不行的.
查看其源码:
然后首先找到HtmlInputText的renderer:HtmlTextRenderer,因为提交时首先调用组件的renderer的 docode方法来解析request的参数。然后发现该类是扩展了HtmlTextRendererBase,之后发现是调用了 HtmlRendererUtils.decodeUIInput()来解析的,在该方法的一开始,就发现如下语句:
if(isDisabledOrReadOnly(component))
return;
这里充分说明了在JSF中readonly和disable一样,都是不会将参数提交给后台的。
解决方案有三种:
1.编写 inputText.onKeydown 事件, 直接 return false; (不写readonly属性)
这种解决办法比较简单. 实际上还是会存在一些问题.
2.继续用readonly属性的同时, 再增加hidden来保存数据.
这种解决办法,全导致hidden过多.
3.继续用readonly属性的同时, 再加入: style="readonly:expression(this.readOnly=true)"
最终代码如下:
<h:inputText id="theValue" readonly="true"
value="#{readonlyBean.theValue}" onClick="setDay(this)"
style="readonly:expression(this.readOnly=true)" />
推荐使用第三种解决方案(已测, 目前尚未发现问题).