如何将两个<h:inputText>输入值传入Java单个方法(JSF场景)
可直接传递两个输入值到Java单方法的替代方案
当然存在这类方案,以下是几种实用的实现方式:
方案1:EL表达式直接传递输入值到方法
JSF 2.0及以上版本支持在EL中直接调用带参数的方法,你可以直接在按钮的action属性里调用双参数方法,参数直接绑定输入框的值,同时将计算结果绑定到输出文本。
修改后的XHTML代码
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:p="http://xmlns.jcp.org/jsf/passthrough" xmlns:f="http://xmlns.jcp.org/jsf/core"> <h:head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Ana Sayfa</title> </h:head> <h:body> <h:form id="indexForm"> <h:outputLabel value="Tarih1"/><br/> <h:inputText id="tarih1Text" p:placeholder="gg/aa/yyyy" binding="#{tarih1}"/> <br/> <h:outputLabel value="Tarih2"/><br/> <h:inputText id="tarih2Text" p:placeholder="gg/aa/yyyy" binding="#{tarih2}"/> <br/> <h:commandButton id="btn" value="Farkı Hesapla" action="#{dateCDIBean.hesapla(tarih1.value, tarih2.value)}"/> <br/> <h:outputText id="cikti" value="#{dateCDIBean.hasil}"/> </h:form> </h:body> </html>
修改后的CDI Bean代码
package tr.com.bilisim.cdibeans; import jakarta.enterprise.context.SessionScoped; import jakarta.inject.Named; import java.io.Serializable; import tr.com.selimfatih.tarihfark.TarihFark; import tr.com.selimfatih.tarihkontrol.TarihKontrol; @Named @SessionScoped public class dateCDIBean implements Serializable { private String hasil; // 存储计算结果 public dateCDIBean() { } public void hesapla(String date1, String date2) { // 验证日期格式 TarihKontrol tk1 = new TarihKontrol(); tk1.Kontrol(date1); TarihKontrol tk2 = new TarihKontrol(); tk2.Kontrol(date2); if (!tk1.hataliMi && !tk2.hataliMi && date1 != null && date2 != null) { TarihFark fark = new TarihFark(date1, date2); this.hasil = fark.GunFark() + " gün, " + fark.AyFark() + " ay, " + fark.YilFark() + " yıl"; } else { this.hasil = "Yukarıdaki alanlara \"gg/aa/yyyy\" ya da \"gg.aa.yyyy\" formatında tarih değeri giriniz."; } } public String getHasil() { return hasil; } public void setHasil(String hasil) { this.hasil = hasil; } }
这里通过binding="#{tarih1}"将输入组件直接绑定到EL变量,无需在Bean中维护date1、date2字段,直接传递输入值到计算方法。
方案2:使用<f:param>传递参数
如果需要保留输入框与Bean字段的绑定关系,可通过<f:param>在按钮点击时传递参数到方法:
XHTML修改部分
<h:inputText id="tarih1Text" p:placeholder="gg/aa/yyyy" value="#{dateCDIBean.date1}"/> <!-- 省略其他代码 --> <h:inputText id="tarih2Text" p:placeholder="gg/aa/yyyy" value="#{dateCDIBean.date2}"/> <!-- 省略其他代码 --> <h:commandButton id="btn" value="Farkı Hesapla" action="#{dateCDIBean.hesapla}"> <f:param name="date1" value="#{dateCDIBean.date1}"/> <f:param name="date2" value="#{dateCDIBean.date2}"/> </h:commandButton>
Bean中修改hesapla方法
import jakarta.faces.context.FacesContext; import java.util.Map; // 省略其他代码 public void hesapla() { Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); String date1 = params.get("date1"); String date2 = params.get("date2"); // 验证及计算逻辑同方案1 TarihKontrol tk1 = new TarihKontrol(); tk1.Kontrol(date1); TarihKontrol tk2 = new TarihKontrol(); tk2.Kontrol(date2); if (!tk1.hataliMi && !tk2.hataliMi && date1 != null && date2 != null) { TarihFark fark = new TarihFark(date1, date2); this.hasil = fark.GunFark() + " gün, " + fark.AyFark() + " ay, " + fark.YilFark() + " yıl"; } else { this.hasil = "Yukarıdaki alanlara \"gg/aa/yyyy\" ya da \"gg.aa.yyyy\" formatında tarih değeri giriniz."; } }
这种方式保留了原有字段绑定,通过请求参数传递值到计算方法,适合需要复用输入值的场景。
方案3:Ajax即时计算(无需点击按钮)
若希望输入完成后自动计算结果,可通过<f:ajax>绑定输入框的失焦或按键事件,实时调用计算方法:
XHTML代码
<h:inputText id="tarih1Text" p:placeholder="gg/aa/yyyy" binding="#{tarih1}"> <f:ajax event="blur" listener="#{dateCDIBean.hesapla(tarih1.value, tarih2.value)}" render="cikti"/> </h:inputText> <br/> <h:inputText id="tarih2Text" p:placeholder="gg/aa/yyyy" binding="#{tarih2}"> <f:ajax event="blur" listener="#{dateCDIBean.hesapla(tarih1.value, tarih2.value)}" render="cikti"/> </h:inputText> <br/> <h:outputText id="cikti" value="#{dateCDIBean.hasil}"/>
Bean代码与方案1一致,用户输入完日期失去焦点时,会自动触发计算并更新输出文本。
内容的提问来源于stack exchange,提问作者Mehmet Fatih ÇİN
相关产品推荐
相关产品推荐

