h:未调用inputSecret getter方法

时间:2014-08-19 09:29:51

标签: jsf-2 myfaces

版本:

Aapche MyFaces 2.1.14

RichFaces 4.3.5

问题:

我正面临着很奇怪的标签问题。 如下面的代码所示,当第一次渲染from时,应该调用bean.getPassword方法。

但似乎第一次呈现表单时(在回发之前)不会调用此方法。我通过调试验证了它。 奇怪的是,如果我把h:inputSecret的EL放在页面的其他地方,这个方法就会被称为

我真的陷入困境,为什么会发生这种情况? 有人遇到过这样的问题吗?

代码:

<h:form prependId="false">

        <!-- check whether getter is called , it gets called in this case -->

    #{bean.password}

    <h:panelGrid columns="2">

            <h:outputText value="User ID:"/>
            <h:inputText value="#{bean.userId}"/>


            <h:outputText value="Password:"/>
            <h:inputSecret id="passwd1" name="passwd1" required="true" value="#{bean.password}"
                                requiredMessage="Password is required"/>

    <h:panelGrid>


</h:form>

1 个答案:

答案 0 :(得分:1)

默认情况下,出于安全原因,<h:inputSecret>不会重新显示模型值(原始密码在生成的HTML源中可见)。您需要将其redisplay属性明确设置为true。另见tag documentation(强调我的):

  

将组件的clientId渲染为&#34; name&#34;的值。属性。将组件的当前值渲染为&#34;值&#34;的值。属性,当且仅当&#34;重新显示&#34; component属性是字符串&#34; true&#34; 。如果&#34; styleClass&#34;指定了属性,将其值作为&#34; class&#34;的值。属性。

所以,这应该做:

<h:inputSecret ... redisplay="true" />

我希望您了解安全隐患。您通常只在提交表单并在其他字段上提供验证错误时执行此操作,以避免用户烦恼重新输入(有效?)密码。像这样:

<h:inputSecret ... redisplay="#{facesContext.postback and component.valid}" />