如何在 jsf 中动态添加 h:inputText 而不会丢失以前动态添加的 h:inputText 值?
How to add h:inputText dynamically in jsf without losing previously dynamically added h:inputText value?
我正在尝试在 jsf2 中动态添加 h:inputText 和一个 selectOneMenu。我在这方面取得了成功。现在的新问题是,当我单击 "Add New" 按钮时,先前动态添加的 h:inputText 值被删除。我不希望这种情况发生。我的代码如下。请帮忙。 :)
<h:form>
<h:dataTable id="bankAccountDataTable" value="#{kycBeanJSF.kycDataModelJSF.kycdto.bankAccountInfoDTOs}" var="item" binding="#{kycBeanJSF.htmlDataTable}">
<h:column>
<label class="label-control"><p:outputLabel value="आबेदकको बैंक खाता नम्बर:"/><span class="required">*</span></label>
<h:inputText value="#{item.bankAccountNumber}"/>
</h:column>
<h:column>
<h:selectOneRadio id="radio1" value="#{item.bankAccountType}" layout="lineDirection" >
<f:selectItem itemLabel="चल्ती खाता" itemValue="chalti" />
<f:selectItem itemLabel="बचत खाता" itemValue="bachat" />
<f:selectItem itemLabel="कॉल खाता" itemValue="call" />
</h:selectOneRadio>
</h:column>
<h:column>
<h:commandButton value="Remove" action="#{kycBeanJSF.kycWebCoreBean.remove(item)}" immediate="true"/>
</h:column>
</h:dataTable>
<h:commandButton value="Add New" action="#{kycBeanJSF.kycWebCoreBean.addNew()}" immediate="true"/>
</h:form>
我的 KycBeanJSF 在请求范围内。 KycDataModelJSF 在 SessionScope 中。
KycBeanJSF.java
public class KycBeanJSF {
@ManagedProperty(value = "#{kycDataModelJSF}")
private KycDataModelJSF kycDataModelJSF;
private KycWebCoreBean kycWebCoreBean;
@PostConstruct
public void initWebCore(){
kycWebCoreBean = new KycWebCoreBean();
}
//getters and setters
}
KycDataModelJSF.java
@ManagedBean(name = "kycDataModelJSF")
@SessionScoped
public class KycDataModelJSF {
private KYCDTO kycdto;
@PostConstruct
public void init(){
addNew();
}
public KYCDTO getKycdto() {
if (kycdto == null) {
kycdto = new KYCDTO();
}
return kycdto;
}
public void setKycdto(KYCDTO kycdto) {
this.kycdto = kycdto;
}
public void addNew() {
if(getKycdto().getBankAccountInfoDTOs().size()<3){
getKycdto().getBankAccountInfoDTOs().add(new BankAccountInfoDTO());
}
else if(getKycdto().getBankAccountInfoDTOs().size()>=3){
FacesUtil.setErrorFacesMessage("Sorry, cannot add more than three accounts.");
}
}
}
KycWebCoreBean.java
public class KycWebCoreBean {
private KycDataModelJSF kycDataModelJSF;
public KycWebCoreBean() {
kycDataModelJSF = (KycDataModelJSF) Util.getSessionObject("kycDataModelJSF");
kycDependencyInjection = (KycDependencyInjection) Util.getSessionObject("kycDependencyInjection");
applicantRegisterDataModelJSF = (ApplicantRegisterDataModelJSF) Util.getSessionObject("applicantRegisterDataModelJSF");
}
public void addNew() {
if(kycDataModelJSF.getKycdto().getBankAccountInfoDTOs().size()<3){
kycDataModelJSF.getKycdto().getBankAccountInfoDTOs().add(new BankAccountInfoDTO());
}
else if(kycDataModelJSF.getKycdto().getBankAccountInfoDTOs().size()>=3){
FacesUtil.setErrorFacesMessage("Sorry, cannot add more than three accounts.");
}
}
public void remove(BankAccountInfoDTO b) {
kycDataModelJSF.getKycdto().getBankAccountInfoDTOs().remove(b);
}
}
如果需要,我会提供更多信息。
提前致谢。
由于h:inputText 只能存储一个值,我假设您想将新值附加到旧值。如果是这样,那么在 setter 方法中管理 属性 的 bean 中使用
public void setValue(String value) {
this.value = this.value + " " + value;
}
而不是通常的
public void setValue(String value) {
this.value = value;
}
将 h:inputText 中的字符串 "my string" 的值更改为 "another string" 后结果为 "my string another string"
<h:dataTable id="bankAccountDataTable" value="#{kycBeanJSF.kycDataModelJSF.kycdto.bankAccountInfoDTOs}" var="item">
<h:column>
<label class="label-control"><p:outputLabel value="आबेदकको बैंक खाता नम्बर:"/><span class="required">*</span></label>
<h:inputText value="#{item.bankAccountNumber}"/>
</h:column>
<h:column>
<h:selectOneRadio id="radio1" value="#{item.bankAccountType}" layout="lineDirection">
<f:selectItem itemLabel="चल्ती खाता" itemValue="chalti" />
<f:selectItem itemLabel="बचत खाता" itemValue="bachat" />
<f:selectItem itemLabel="कॉल खाता" itemValue="call" />
</h:selectOneRadio>
</h:column>
<h:column>
<h:commandButton value="Remove" actionListener="#{kycBeanJSF.kycWebCoreBean.remove(item)}">
<f:ajax render="@form"/>
</h:commandButton>
</h:column>
</h:dataTable>
<h:commandButton value="Add New" actionListener="#{kycBeanJSF.kycWebCoreBean.addNew()}">
<f:ajax execute="bankAccountDataTable" render="bankAccountDataTable msg"/>
</h:commandButton>
我正在尝试在 jsf2 中动态添加 h:inputText 和一个 selectOneMenu。我在这方面取得了成功。现在的新问题是,当我单击 "Add New" 按钮时,先前动态添加的 h:inputText 值被删除。我不希望这种情况发生。我的代码如下。请帮忙。 :)
<h:form>
<h:dataTable id="bankAccountDataTable" value="#{kycBeanJSF.kycDataModelJSF.kycdto.bankAccountInfoDTOs}" var="item" binding="#{kycBeanJSF.htmlDataTable}">
<h:column>
<label class="label-control"><p:outputLabel value="आबेदकको बैंक खाता नम्बर:"/><span class="required">*</span></label>
<h:inputText value="#{item.bankAccountNumber}"/>
</h:column>
<h:column>
<h:selectOneRadio id="radio1" value="#{item.bankAccountType}" layout="lineDirection" >
<f:selectItem itemLabel="चल्ती खाता" itemValue="chalti" />
<f:selectItem itemLabel="बचत खाता" itemValue="bachat" />
<f:selectItem itemLabel="कॉल खाता" itemValue="call" />
</h:selectOneRadio>
</h:column>
<h:column>
<h:commandButton value="Remove" action="#{kycBeanJSF.kycWebCoreBean.remove(item)}" immediate="true"/>
</h:column>
</h:dataTable>
<h:commandButton value="Add New" action="#{kycBeanJSF.kycWebCoreBean.addNew()}" immediate="true"/>
</h:form>
我的 KycBeanJSF 在请求范围内。 KycDataModelJSF 在 SessionScope 中。
KycBeanJSF.java
public class KycBeanJSF {
@ManagedProperty(value = "#{kycDataModelJSF}")
private KycDataModelJSF kycDataModelJSF;
private KycWebCoreBean kycWebCoreBean;
@PostConstruct
public void initWebCore(){
kycWebCoreBean = new KycWebCoreBean();
}
//getters and setters
}
KycDataModelJSF.java
@ManagedBean(name = "kycDataModelJSF")
@SessionScoped
public class KycDataModelJSF {
private KYCDTO kycdto;
@PostConstruct
public void init(){
addNew();
}
public KYCDTO getKycdto() {
if (kycdto == null) {
kycdto = new KYCDTO();
}
return kycdto;
}
public void setKycdto(KYCDTO kycdto) {
this.kycdto = kycdto;
}
public void addNew() {
if(getKycdto().getBankAccountInfoDTOs().size()<3){
getKycdto().getBankAccountInfoDTOs().add(new BankAccountInfoDTO());
}
else if(getKycdto().getBankAccountInfoDTOs().size()>=3){
FacesUtil.setErrorFacesMessage("Sorry, cannot add more than three accounts.");
}
}
}
KycWebCoreBean.java
public class KycWebCoreBean {
private KycDataModelJSF kycDataModelJSF;
public KycWebCoreBean() {
kycDataModelJSF = (KycDataModelJSF) Util.getSessionObject("kycDataModelJSF");
kycDependencyInjection = (KycDependencyInjection) Util.getSessionObject("kycDependencyInjection");
applicantRegisterDataModelJSF = (ApplicantRegisterDataModelJSF) Util.getSessionObject("applicantRegisterDataModelJSF");
}
public void addNew() {
if(kycDataModelJSF.getKycdto().getBankAccountInfoDTOs().size()<3){
kycDataModelJSF.getKycdto().getBankAccountInfoDTOs().add(new BankAccountInfoDTO());
}
else if(kycDataModelJSF.getKycdto().getBankAccountInfoDTOs().size()>=3){
FacesUtil.setErrorFacesMessage("Sorry, cannot add more than three accounts.");
}
}
public void remove(BankAccountInfoDTO b) {
kycDataModelJSF.getKycdto().getBankAccountInfoDTOs().remove(b);
}
}
如果需要,我会提供更多信息。 提前致谢。
由于h:inputText 只能存储一个值,我假设您想将新值附加到旧值。如果是这样,那么在 setter 方法中管理 属性 的 bean 中使用
public void setValue(String value) {
this.value = this.value + " " + value;
}
而不是通常的
public void setValue(String value) {
this.value = value;
}
将 h:inputText 中的字符串 "my string" 的值更改为 "another string" 后结果为 "my string another string"
<h:dataTable id="bankAccountDataTable" value="#{kycBeanJSF.kycDataModelJSF.kycdto.bankAccountInfoDTOs}" var="item">
<h:column>
<label class="label-control"><p:outputLabel value="आबेदकको बैंक खाता नम्बर:"/><span class="required">*</span></label>
<h:inputText value="#{item.bankAccountNumber}"/>
</h:column>
<h:column>
<h:selectOneRadio id="radio1" value="#{item.bankAccountType}" layout="lineDirection">
<f:selectItem itemLabel="चल्ती खाता" itemValue="chalti" />
<f:selectItem itemLabel="बचत खाता" itemValue="bachat" />
<f:selectItem itemLabel="कॉल खाता" itemValue="call" />
</h:selectOneRadio>
</h:column>
<h:column>
<h:commandButton value="Remove" actionListener="#{kycBeanJSF.kycWebCoreBean.remove(item)}">
<f:ajax render="@form"/>
</h:commandButton>
</h:column>
</h:dataTable>
<h:commandButton value="Add New" actionListener="#{kycBeanJSF.kycWebCoreBean.addNew()}">
<f:ajax execute="bankAccountDataTable" render="bankAccountDataTable msg"/>
</h:commandButton>