JSF中输入组件的readonly属性(已解决)


<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)" />


推荐使用第三种解决方案(已测, 目前尚未发现问题).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值