如何使用JSF从javascript调用java函数

如何使用JSF从javascript调用java函数,java,javascript,jsf,jakarta-ee,Java,Javascript,Jsf,Jakarta Ee,我正在使用JSF2.0并试图从javascript调用java函数,但未能实现这一点。 我有一个带有datatable的jsp,其中我的两个列(Material和Desc)从弹出的jsp中获取数据。现在用户在另外两个字段(Unit和Qty)中输入数据,将这4个字段作为输入参数,我有一个java函数,返回其余的值(在我的示例中是NetPrice和NetTax) 我如何在这里调用java方法,以便获得jsp(test.jsp)文本字段的值 test.jsp 函数TestPrevibling(按钮元

我正在使用JSF2.0并试图从javascript调用java函数,但未能实现这一点。 我有一个带有datatable的jsp,其中我的两个列(Material和Desc)从弹出的jsp中获取数据。现在用户在另外两个字段(Unit和Qty)中输入数据,将这4个字段作为输入参数,我有一个java函数,返回其余的值(在我的示例中是NetPrice和NetTax) 我如何在这里调用java方法,以便获得jsp(test.jsp)文本字段的值

test.jsp

函数TestPrevibling(按钮元素){
试一试{
//警报(按钮元素);
var inputText=buttonElement.previousSibling;
while(inputText.nodeType!=1)
{
inputText=inputText.previousSibling;
}
//警报(inputText.id);
返回inputText.id;
}捕获(ex){
警报(“坏”+ex);
}
}
函数testNextSibling(按钮元素){
试一试{
//警报(按钮元素);
var inputText=buttonElement.nextSibling;
while(inputText.nodeType!=1)
{
inputText=inputText.nextSibling;
}
//警报(“下一个同级-->”+inputText.innerHTML);
返回输入文本;
}捕获(ex){
警报(“坏”+ex);
}
}
//var输入;
功能弹出窗口(URL、按钮REF){
var inputId=testprevisibling(buttonRef);
//警报(输入);
日期=新日期();
id=day.getTime();
URL=URL+“?inputId=“+inputId;
评估(“页面”+id+”=窗口。打开(URL,“+id+”,“工具栏=0,滚动条=0,位置=1,状态栏=0,菜单栏=0,可调整大小=1,宽度=250,高度=800左=630,顶部=502”);
}
函数getDetails(inputId、matVal、desc){
var inputRef=document.getElementById(inputId);
var tdRef=inputRef.parentNode;
var tdNextRef=测试下一步启用(tdRef);
//警报(“td Ref-->”+tdRef+“td next Ref-->”+tdNextRef);
var descRef=tdNextRef.firstChild;
//警报(“子参考-->”+descRef);
//警报(“当前JSP-->”+matVal+“输入Id-->”+inputId+“desc-->”+desc);
document.getElementById(inputId).value=matVal;
descRef.value=desc;
}
JSP页面

popup.jsp

函数testNextSibling(按钮元素){
试一试{
//警报(按钮元素);
var inputText=buttonElement.nextSibling;
while(inputText.nodeType!=1)
{
inputText=inputText.nextSibling;
}
警报(“下一个同级-->”+inputText.innerHTML);
返回inputText.innerHTML;
}捕获(ex){
警报(“坏”+ex);
}
}
功能gup(名称)
{
名称=名称。替换(/[\[]/,“\\\[”)。替换(/[\]]/,“\\\]”);
var regexS=“[\\?&]”+name+“=([^&\\]*)”;
var regex=新的RegExp(regexS);
var results=regex.exec(window.location.href);
如果(结果==null)
返回“”;
其他的
返回结果[1];
}
函数setMaterialValue(mat、matNum){
//警报(“mat”+mat);
var desc=测试下一步筛选(mat);
//警报(“说明-->”+desc);
var inputId=gup(“inputId”);
window.opener.getDetails(inputId、matNum、desc);
//window.opener.document.getElementById(mat).value;
window.close();
}
JSP页面


我尝试过使用commandLink,但我希望在文本字段失去焦点或类似的情况下使用它,但你不能。您最多可以做的就是发出AJAX请求。这里也回答了类似的问题,

这确实是可能的。只有功能需求非常模糊,因此您的问题无法回答。您希望何时调用JSF操作方法?当某个元素检索焦点时?当某个元素被单击时?当某些元素变得模糊时?当用户离开
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script LANGUAGE="JavaScript">
        function testPrevSibling(buttonElement) {
            try {
                // alert(buttonElement);
                var inputText = buttonElement.previousSibling;
                while (inputText.nodeType!=1)
                {
                    inputText =inputText.previousSibling;
                }
                //      alert(inputText.id);
                return inputText.id;
            } catch(ex) {
                alert("bad " + ex);
            }
        }
        function testNextSibling(buttonElement) {
            try {
                // alert(buttonElement);
                var inputText = buttonElement.nextSibling;
                while (inputText.nodeType!=1)
                {
                    inputText =inputText.nextSibling;
                }
                // alert("next sibling-->"+inputText.innerHTML);
                return inputText;
            } catch(ex) {
                alert("bad " + ex);
            }
        }

        // var inputId;
        function popUp(URL,buttonRef) {
            var inputId = testPrevSibling(buttonRef);

            //     alert(inputId);
            day = new Date();
            id = day.getTime();
            URL = URL+"?inputId="+inputId;
            eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=0,location=1,statusbar=0,menubar=0,resizable=1,width=250,height=800 left = 630,top = 502');");
        }
        function getDetails(inputId,matVal,desc){
            var inputRef = document.getElementById(inputId);
            var tdRef = inputRef.parentNode;
            var tdNextRef = testNextSibling(tdRef);
      //      alert("td Ref-->"+tdRef+"td next Ref-->"+tdNextRef);
            var descRef = tdNextRef.firstChild;
        //    alert("Child ref-->"+descRef);
        //    alert("Current JSP-->"+matVal+"input Id-->"+inputId+"desc-->"+desc);
            document.getElementById(inputId).value = matVal;
            descRef.value = desc;
        }
    </script>
    <title>JSP Page</title>
</head>
<body>
    <f:view>
        <h:form>
            <br>
            <h:panelGrid  bgcolor="#9AC8E6" width="100%">
                <h:dataTable id="d" value="#{SalesCreate.orderBean.itemList}" var="iBean" bgcolor="#9AC8E6" border="10" cellpadding="5" cellspacing="3" rows="10" width="100%" dir="LTR" frame="hsides" rules="all" >

                    <h:column>
                        <f:facet name="header">
                            <h:outputText style=""value="Material" />
                        </f:facet>
                        <h:inputText id="mat" value="#{iBean.material}" > </h:inputText>
                        <h:commandButton value="..." onclick="javascript:popUp('MaterialList.jsp',this)" > </h:commandButton>
                        <h:commandButton style="display:none" value="..." onclick="" > </h:commandButton>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            <h:outputText style=""value="Description" />
                        </f:facet>
                        <h:inputText id="desc" value="#{iBean.description}" > </h:inputText>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            <h:outputText style=""value="Unit" />
                        </f:facet>
                        <h:inputText value="#{iBean.unit}" > </h:inputText>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="Quantity"/>
                        </f:facet>
                        <h:inputText value="#{iBean.quantity}"> </h:inputText>
                        <h:form>
                            <h:commandLink value="get Pricing" action="#{SalesCreate.pricingForQuotation}" >
                                <f:param name="mat" value="#{iBean.material}" />
                                <f:param name="unt" value="#{iBean.unit}" />
                                <f:param name="qty" value="#{iBean.quantity}" />
                            </h:commandLink> </h:form>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            <h:outputText style=""value="Unit Price" />
                        </f:facet>
                        <h:inputText value="#{iBean.netPrice}" > </h:inputText>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            <h:outputText style=""value="Total Price" />
                        </f:facet>
                        <h:inputText value="#{iBean.netTax}" > </h:inputText>
                    </h:column>
                </h:dataTable>
            </h:panelGrid>
        </h:form>
    </f:view>
</body>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script LANGUAGE="JavaScript">
        function testNextSibling(buttonElement) {
            try {
                // alert(buttonElement);
                var inputText = buttonElement.nextSibling;
                while (inputText.nodeType!=1)
                {
                    inputText =inputText.nextSibling;
                }
                alert("next sibling-->"+inputText.innerHTML);
                return inputText.innerHTML;
            } catch(ex) {
                alert("bad " + ex);
            }
        }
        function gup( name )
        {
            name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
            var regexS = "[\\?&]"+name+"=([^&#]*)";
            var regex = new RegExp( regexS );
            var results = regex.exec( window.location.href );
            if( results == null )
                return "";
            else
                return results[1];
        }
        function setMaterialValue(mat,matNum){
            //   alert("mat " + mat);
            var desc = testNextSibling(mat);
            //   alert("Description-->"+desc);
            var inputId = gup("inputId");
            window.opener.getDetails(inputId,matNum,desc);
            //  window.opener.document.getElementById(mat).value;
            window.close();
        }
    </script>
    <title>JSP Page</title>
</head>
<f:view>
    <body>
        <h:dataTable id="datatbl" value="#{SalesCreate.inquiryMaterialList}" var="materialList"  bgcolor="#9AC8E6" border="10" cellpadding="5" cellspacing="3" rows="3000" width="100%" dir="LTR" rules="all">

            <h:column>
                <f:facet name="header">
                    <h:outputText style=""value="Material" />
                </f:facet>
                <h:form>
                    <h:commandLink style="" id="materialId" value="#{materialList.material}" onclick="javascript:setMaterialValue(this,#{materialList.material})" ></h:commandLink>
                    <h:outputText style="display:none" value="#{materialList.description}"></h:outputText>
                </h:form>
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText style=""value="Description" />
                </f:facet>
                <h:form>
                    <h:commandLink style="" value="#{materialList.description}" onclick="javascript:setDescriptionValue(#{materialList.description})" ></h:commandLink></h:form>
            </h:column>
        </h:dataTable>
    </body>
</f:view>
   <h:inputText value="#{yourbackingBean.first}">
                <f:ajax event="blur" render="cm" listener="#{yourbackingBean.caluculate}"/>
     </h:inputText>
     h:inputText value="#{yourbackingBean.second}" id="cm"/>
          </h:form>
          private int first=1;
          private int second=1;
    //Getters and Setters
     public void caluculate(AjaxBehaviorEvent evt)
       {
        second=first*1000;
       }