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