You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将两个<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:50:34