【问题标题】:how to call a java function from javascript using JSF如何使用JSF从javascript调用java函数
【发布时间】:2011-09-28 15:34:46
【问题描述】:

我正在使用 JSF2.0 并尝试从 javascript 调用 java 函数,但无法实现。 我有一个带有数据表的 jsp,其中我的 2 个列(材料和描述)从弹出 jsp 中获取数据。现在用户在其他 2 个字段(单位和数量)中输入数据,将这 4 个作为输入参数我有一个 java返回其余值的函数(在我的示例中为 NetPrice 和 NetTax) 如何在这里调用 java 方法,以便将值获取到我的 jsp(test.jsp)文本字段中。这是我的踪迹的代码 sn-p

test.jsp

<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>

popup.jsp

<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>

我尝试过使用 commandLink,但我希望在文本字段失去焦点或类似情况时完成

【问题讨论】:

  • 这确实是可能的。只有功能要求非常模糊,因此您的问题无法回答。 什么时候 您想调用 JSF 操作方法?当某些元素检索焦点时?当某个元素被点击?当某些元素变得模糊时?当用户离开 PC 时?电脑什么时候爆炸?等等。请提供更多详细信息。
  • @BalusC: 不错:)。但我相信即使这样也是一个 AJAX 调用,不是吗?
  • @Adeel:OP 正在使用 JSF 2.0。它应该像在 somewhere 中放置 &lt;f:ajax&gt; 标签一样简单。
  • @BalusC:百分之一的协议。通常,最好描述幕后发生的事情。例如,仅仅因为 JSP 是一种类似标签的语言,很少有人认为它运行在客户端上,并且经常将 JSP 与 JavaScript 混淆。
  • 抱歉,我的问题在发布时不完整...我现在已经正确编辑了它。现在请帮帮我..

标签: java javascript jsf jakarta-ee


【解决方案1】:

你不能。您最多可以做一个 AJAX 请求。类似问题已在此处得到解答,How to access a java object in javascript from JSP?

【讨论】:

  • Ajax 与 JavaScript 有何不同?毕竟只是 JavaScript,对吧?
  • @BalusC:我的意思是是的,但我并不是说它从 JavaScript 调用 Java 方法,无论如何。中间涉及到一些东西,不能简单的说Java方法是用JavaScript调用的。你说什么?
【解决方案2】:
   <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>
  • 这里的活动可以是您的选择,例如
    模糊,更改,keyup,keydown 等等…………

    Listener 是方法 在特定事件时调用 触发。

    这里计算的是方法 包含要填充的逻辑
    您的 jsp 中的剩余字段。

你的后盾

          private int first=1;
          private int second=1;
    //Getters and Setters
     public void caluculate(AjaxBehaviorEvent evt)
       {
        second=first*1000;
       }

【讨论】:

  • JSF 2.0 让 Ajax 变得非常酷:D
猜你喜欢
  • 1970-01-01
  • 2015-06-07
  • 2019-10-24
  • 2014-12-16
  • 2017-05-28
  • 2012-01-27
  • 2011-04-07
  • 1970-01-01
  • 2012-02-07
相关资源
最近更新 更多