为什么在render =“false”时没有触发required =“true”

时间:2013-11-18 03:42:01

标签: validation jsf required rendered-attribute

我对在facelet中解析html标签有些怀疑。让我们有一个包含以下内容的facelet

<h:inputText id="username"
             title="My name is: "
             value="#{hello.name}"
             required="true"
             requiredMessage="Error: A name is required."
             rendered="false"
             maxlength="25" />
<h:commandButton id="submit" value="Submit" action="response">
            </h:commandButton>

提交后点击我还没有Error: A name is required。为什么? username刚刚未呈现,submit点击后username没有值。

1 个答案:

答案 0 :(得分:3)

在验证和更新模型值阶段期间还会评估rendered属性。有关证据,请检查javax.faces.component.UIInput source code(行号是按照Mojarra 2.2.0):

696     public void processValidators(FacesContext context) {
697 
698         if (context == null) {
699             throw new NullPointerException();
700         }
701 
702         // Skip processing if our rendered flag is false
703         if (!isRendered()) {
704             return;
705         }
...
...
...
735     public void processUpdates(FacesContext context) {
736 
737         if (context == null) {
738             throw new NullPointerException();
739         }
740 
741         // Skip processing if our rendered flag is false
742         if (!isRendered()) {
743             return;
744         }

解释很简单:这是防止被篡改(欺骗/黑客入侵)HTTP请求的安全措施,其中最终用户有目的地操纵HTTP请求以尝试设置值和/或调用隐藏输入/命令的操作,这些操作/命令最有可能是简单的不允许更新或调用,例如仅在用户具有管理员角色时显示的删除按钮:

<h:commandButton value="Delete" ... rendered="#{request.isUserInRole('ADMIN')}" />

注意:组件的readonlydisabled属性也会以这种方式处理。出于特定目的,请改用CSS display: none

<h:inputText ... style="display:none" />

(注意:这是一个启动示例,使用style属性是HTML / CSS透视图中的错误做法,更喜欢使用具体的CSS文件styleClass

虽然我想知道这背后的具体功能要求,但这对用户体验很不利。也许你只是在没有先学习JSF specification,更不用说JSF source code

的情况下随意进行实验