强制JSF无论如何都要处理,验证和更新只读/禁用的输入组件

时间:2015-09-04 04:27:59

标签: validation jsf

我正在创建一个计算器,用户可以通过单击虚拟小键盘来执行各种操作。现在我想限制用户只通过点击按钮选择各种字符,他/她不应该使用键盘输入值。我尝试使用readonly="true",但是当我们点击任何按钮时,它既不验证输入也不设置bean中的值。

我们在jsf中有任何此类限制吗?

enter image description here

3 个答案:

答案 0 :(得分:16)

这是JSF防范篡改/攻击请求的效果,其中黑客试图通过操纵HTML DOM和/来规避readonly(和disabled)属性或HTTP请求。

而不是

<x:inputXxx ... readonly="true">

使用

<x:inputXxx ... readonly="#{facesContext.currentPhaseId.ordinal eq 6}">

<x:inputXxx ... readonly="#{not facesContext.postback or facesContext.renderResponse}">

这可确保readonly仅在呈现响应阶段有效,而不是在所有其他JSF阶段有效。因此,当JSF即将在应用请求值阶段解码输入组件时,它会以这种方式考虑readonly="false"

另见:

答案 1 :(得分:2)

第一行数字的key codes为48-57,因此您可以编写一个函数来禁用这些字符上的按键。

像这样的东西

function disableEnter(event) {
    var charCode = (event.which) ? event.which : event.keyCode;
    if (charCode > 31  && (charCode > 47 || charCode < 58)) {
        return false;}
    } else return true;
}

<h:inputText onkeypress="return disableEnter(event);" />

答案 2 :(得分:1)

我找到了另一种解决方法:

function stopEvent(event){
    event.stopPropagation();
    event.preventDefault();
}

onkeyup="stopEvent(event)" onkeydown="stopEvent(event)" onkeypress="stopEvent(event)"