如何将 JavaScript 变量作为参数传递给 JSF 操作方法?

Posted

技术标签:

【中文标题】如何将 JavaScript 变量作为参数传递给 JSF 操作方法?【英文标题】:How to pass JavaScript variables as parameters to JSF action method? 【发布时间】:2015-04-19 21:47:23 【问题描述】:

我正在 javascript 中准备一些变量(在我的具体情况下,我想获取 GPS 位置):

function getVars() 
    // ...
    var x = locationInfo.lng; 
    var y = locationInfo.lat;

我想通过以下命令按钮将它们发送到我的托管 bean:

<h:commandButton value="submit" onclick="getVars()" action="#bean.submit(x,y)" />
public void submit(int x, int y) 
    // ...

如何将 xy 变量从 JavaScript 发送到 JSF 托管 bean 操作方法?

【问题讨论】:

是否要将全球定位系统 (GPS) 坐标、经度和纬度值从 JavaScript 传递到相应的支持 bean? See. @Tiny Thx 例如。这是一篇不错的文章。但我有一个问题是 URL,URL 是否等于 Xhtml 路径? 我完全错过了评论。 【参考方案1】:

让JS将它们设置为相同形式的隐藏输入值。

<h:form id="formId">
    <h:inputHidden id="x" value="#bean.x" />
    <h:inputHidden id="y" value="#bean.y" />
    <h:commandButton value="submit" onclick="getVars()" action="#bean.submit" />
</h:form>
function getVars() 
    // ...
    var x = locationInfo.lng; 
    var y = locationInfo.lat;

    document.getElementById("formId:x").value = x;
    document.getElementById("formId:y").value = y;

命令按钮操作方法可以像通常的方式一样将它们作为 bean 属性访问。

private int x;
private int y;

public void submit() 
    System.out.println("x: " + x);
    System.out.println("y: " + y);
    // ...


// Getters+setters.

另一种方法是使用OmniFaces &lt;o:commandScript&gt; 或PrimeFaces &lt;p:remoteCommand&gt; 而不是&lt;h:commandButton&gt;。另见 a.o. How to invoke a JSF managed bean on a HTML DOM event using native JavaScript?

【讨论】:

如果你想从 JS 本身调用一个支持 bean 的方法为 #bean.foo() 怎么办?你能在括号内放一个 JS var 吗? 见最后一段。 如果使用 PrimeFaces,我认为最好使用 javascript API PrimeFaces.widgets['widget_myInputTextId'] 来操作对象。如这里所解释的:blog.hatemalimam.com/intro-to-primefaces-widgetvar【参考方案2】:

如果您使用PrimeFaces,您可以使用链接到托管bean的隐藏输入字段,并且您可以使用javascript初始化其值,对于PrimeFaces,PF函数可用于访问链接到隐藏输入的小部件变量,方式如下:

<script type="text/javascript">
function getVars() 
    // ...
    var x = locationInfo.lng; 
    var y = locationInfo.lat;
    PF('wvx').jq.val( lat1 );
    PF('wvy').jq.val( lng1 );

</script>

<p:inputText type="hidden" widgetVar="wvx" value="#bean.x" />
<p:inputText type="hidden" widgetVar="wvy" value="#bean.y" />

【讨论】:

【参考方案3】:
<h:form id="formId">
<h:inputHidden id="x" value="#bean.x" />
<h:inputHidden id="y" value="#bean.y" />
<h:commandButton value="submit" onclick="getVars()" action="#bean.submit" />

 <script>
        function getVars() 

            var x; 
            var yt;

            x=#bean.x;
            y=#bean.y;
        
    </script>

【讨论】:

这不是一个解决方案... javascript 会评估渲染时间,它不会是在调用 'getVars() 时发生的分配(单击按钮)... 错误'回答'......(你真的尝试过吗?) 其实,它对我来说是正确的,我以这种方式使用它没有问题。只要 javascript 在同一个 xhtml 内。 不,它不能工作......对不起。 #bean.x 服务器端永远不会通过这段 javascript 分配 x 的值(查看源客户端显示的内容)。抱歉完全错了(其他人同意考虑反对票)。你能说服我的唯一方法是制作一个真正的minimal reproducible example。如果它对你有用,那么可能还有其他不可见的东西可以做实际的工作。

以上是关于如何将 JavaScript 变量作为参数传递给 JSF 操作方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 HtmlDocument.InvokeScript 将对象作为参数传递给 javascript

QML:如何将javascript函数作为参数传递给另一个函数

如何将 C# 对象作为参数传递给 Javascript 函数

C++:如何将变量作为参数传递给类构造函数

如何将 JS 函数的引用作为参数传递给 ExternalInterface 调用?

如何将 html id 和名称作为参数传递给 dojo javascript 模块?