JSF更新支持bean中输入文本的值

JSF更新支持bean中输入文本的值,jsf,primefaces,Jsf,Primefaces,今天,我在解决JSF中的一个小问题。实际上,我在我的xhtml页面上有一个InputText,其readyOnly属性设置为true。要求是单击布尔复选框,我应该使输入文本可编辑,意思是readyOnlyfalse。代码有点像这样 <div class="div-form-col" > <h:outputLabel value="#{msgs.violationAmount} " for="violationAmt" /> <

今天,我在解决JSF中的一个小问题。实际上,我在我的
xhtml
页面上有一个
InputText
,其
readyOnly
属性设置为true。要求是单击布尔
复选框,我应该使输入文本可编辑,意思是
readyOnly
false。代码有点像这样

  <div class="div-form-col" >
            <h:outputLabel value="#{msgs.violationAmount} " for="violationAmt" />

      <h:inputText value="#{outpassMBean.violationWebDTO.violationAmount}" id="violationAmt" readonly="true"/>

    </div>

<div class="div-form-row">
                      <div class="div-form-col">
                          <h:outputLabel value="#{msgs.violationExemptionApplicable} " for="violationExempted" />
                          <h:selectBooleanCheckbox value="#{outpassMBean.violationWebDTO.violationExemptionApplicable}" id="violationExempted" onchange="makeViolationAmountEditable(this);">
                          </h:selectBooleanCheckbox>

                      </div>
                  </div>
现在我的第一个问题是,如果我在编辑文本字段中的值,我如何在backingbean中更新violationAmt的值。最好的办法是什么?在使用PrimeFaces时,我遇到了remoteCommand的概念。下面是我补充的内容

<p:remoteCommand name="makeViolationAmountEditableOnServer" action="#{outpassMBean.makeViolationAmountEditable}" update="amountPanelApplicant"/>
问题是,无论何时运行此代码,violationWebDTO中的违规金额都是旧的,而不是我在编辑输入字段后输入的金额。虽然我在firebug中看到更新的值是请求的一部分,但在支持bean中,仍然引用了旧值。我不明白为什么

我的前辈告诉我,您正在更新客户端而不是服务器端的readOnly值,并更新了我的代码

<p:outputPanel id="amountPanelApplicant">
          <p:outputPanel  rendered="#{outpassMBean.violationWebDTO.violationForCmb eq 2 and outpassMBean.violationWebDTO.isViolationExists}">
              <p:outputPanel styleClass="div-form twoCol">
                  <div class="div-form-row">
                      <div class="div-form-col" >
                          <h:outputLabel value="#{msgs.violationAmount} " for="violationAmt" />

                          <h:inputText value="#{outpassMBean.violationWebDTO.violationAmount}" id="violationAmt" readonly="#{outpassMBean.violationAmtEditable}">

                          </h:inputText>

                      </div>

                      <div class="div-form-col">
                          <h:outputLabel value="#{msgs.outPayTot} " for="totalViolationAmount" />
                          <h:outputLabel styleClass="readOnly" value="#{outpassMBean.violationWebDTO.totalViolationAmount}" id="totalViolationAmount" />
                      </div>
                  </div>

              </p:outputPanel>

              <p:outputPanel styleClass="div-form twoCol" rendered="#{outpassMBean.outpassApplication.applicationSubType.id eq 2 }" >
                  <div class="div-form-row">
                      <div class="div-form-col">
                          <h:outputLabel value="#{msgs.violationExemptionApplicable} " for="violationExempted" />
                          <h:selectBooleanCheckbox value="#{outpassMBean.violationWebDTO.violationExemptionApplicable}" id="violationExempted" onchange="makeViolationAmountEditableOnServer();">
                          </h:selectBooleanCheckbox>
                          <p:remoteCommand name="makeViolationAmountEditableOnServer" action="#{outpassMBean.makeViolationAmountEditable}" update="amountPanelApplicant"/>

                      </div>
                  </div>
              </p:outputPanel>
</p:outputPanel>

public void makeViolationAmountEditable(){
    if(logger.isDebugEnabled()){
      logger.debug("Inside makeViolationAmountEditable...");
    }
    //setting violation amount editable flag
    setViolationAmtEditable(false);

    //Preserving original and total amount.
    setOriginalViolationAmt(violationWebDTO.getViolationAmount());
    setOriginalTotalViolationAmount(violationWebDTO.getTotalViolationAmount());

  }

public void makeViolationAmountEditable()不可编辑{
if(logger.isDebugEnabled()){
debug(“内部makeViolationAmountEditable…”);
}
//设置违规金额可编辑标志
setViolationAmtEditable(假);
//保留原始数量和总量。
setOriginalViolationAmt(violationWebDTO.getViolationAmount());
setOriginalTotalViolationAmount(violationWebDTO.getTotalViolationAmount());
}
在上面更新的代码中,没有调用javascript。readyOnly值从支持bean本身设置为true和false。更新后,violationWebDTO中的新编辑值基本上更新了


有人能解释一下吗?为什么不在第一个快照中?这不是一个完整的代码,但我试图解释混淆。任何指针都会有帮助。

这是JSF针对篡改/黑客请求的保护措施,其中最终用户使用客户端语言/工具(如HTML或JS)操纵HTML DOM树和/或HTTP请求参数,从而禁用JSF的
结果,
只读
或甚至
呈现的
属性被更改

想象一下,如果JSF开发人员根据管理员角色(如so
disabled=“#{not user.hasRole('admin')}”
)检查了这样一个布尔属性中的用户角色,并且黑客以这样一种方式操纵它,使非管理员用户不再禁用它,会发生什么情况。这就是为什么您只能在服务器端更改提到的属性(以及
required
属性和所有转换器、验证器、事件侦听器等)

然而,这可以用一种更简单的方式来解决,不需要额外的属性,也不需要
和额外的bean方法

<h:inputText id="violationAmount" ... readonly="#{makeViolationAmountEditable.value}" />
...
<h:selectBooleanCheckbox binding="#{makeViolationAmountEditable}">
    <f:ajax render="violationAmount" />
</h:selectBooleanCheckbox>

...
另见:

在以后的问题中,请尽量只发布相关代码。当您删除那些
等标记时,问题肯定不会消失。那就别让他们进来@巴卢斯克,我肯定会使用你提供的指导方针。我正在理解答案,如果我发现更多困惑,我会告诉你。当你说readonly=“#{makeViolationAmountEditable.value}”时,我有一个困惑,你在调用backingbean方法吗。这个值指的是什么?binding属性是否将布尔复选框绑定到支持bean方法?这在第二个“请参阅”链接中有详细说明,另一个相关答案对绑定的复选框有更具体的解释:1)在这里,您使用组件的
属性进行绑定。2) 对不起?
对您来说也是新事物吗?据我所知,
绑定
是最不容易理解的特性,通常不会深入解释,但是
应该已经在sane JSF2书籍/教程的第一章中介绍过了。它只是在默认的HTMLDOM事件上触发一个ajax请求,
render
属性告诉JSF在响应中要重新呈现(更新)哪些组件。这样,复选框组件的值将在
readonly
属性中重新计算?代码刚刚完成,和我的答案一样。你不是对它的简单感到惊讶吗?它的工作原理已经在给定的链接中进行了深入解释。要继续上一个给定的链接,“视图构建时间”与“视图渲染时间”的对比将在中进行详细解释
<p:outputPanel id="amountPanelApplicant">
          <p:outputPanel  rendered="#{outpassMBean.violationWebDTO.violationForCmb eq 2 and outpassMBean.violationWebDTO.isViolationExists}">
              <p:outputPanel styleClass="div-form twoCol">
                  <div class="div-form-row">
                      <div class="div-form-col" >
                          <h:outputLabel value="#{msgs.violationAmount} " for="violationAmt" />

                          <h:inputText value="#{outpassMBean.violationWebDTO.violationAmount}" id="violationAmt" readonly="#{outpassMBean.violationAmtEditable}">

                          </h:inputText>

                      </div>

                      <div class="div-form-col">
                          <h:outputLabel value="#{msgs.outPayTot} " for="totalViolationAmount" />
                          <h:outputLabel styleClass="readOnly" value="#{outpassMBean.violationWebDTO.totalViolationAmount}" id="totalViolationAmount" />
                      </div>
                  </div>

              </p:outputPanel>

              <p:outputPanel styleClass="div-form twoCol" rendered="#{outpassMBean.outpassApplication.applicationSubType.id eq 2 }" >
                  <div class="div-form-row">
                      <div class="div-form-col">
                          <h:outputLabel value="#{msgs.violationExemptionApplicable} " for="violationExempted" />
                          <h:selectBooleanCheckbox value="#{outpassMBean.violationWebDTO.violationExemptionApplicable}" id="violationExempted" onchange="makeViolationAmountEditableOnServer();">
                          </h:selectBooleanCheckbox>
                          <p:remoteCommand name="makeViolationAmountEditableOnServer" action="#{outpassMBean.makeViolationAmountEditable}" update="amountPanelApplicant"/>

                      </div>
                  </div>
              </p:outputPanel>
</p:outputPanel>

public void makeViolationAmountEditable(){
    if(logger.isDebugEnabled()){
      logger.debug("Inside makeViolationAmountEditable...");
    }
    //setting violation amount editable flag
    setViolationAmtEditable(false);

    //Preserving original and total amount.
    setOriginalViolationAmt(violationWebDTO.getViolationAmount());
    setOriginalTotalViolationAmount(violationWebDTO.getTotalViolationAmount());

  }
<h:inputText id="violationAmount" ... readonly="#{makeViolationAmountEditable.value}" />
...
<h:selectBooleanCheckbox binding="#{makeViolationAmountEditable}">
    <f:ajax render="violationAmount" />
</h:selectBooleanCheckbox>