【问题标题】:How to pass JavaScript variables as parameters to JSF action method?如何将 JavaScript 变量作为参数传递给 JSF 操作方法?
【发布时间】: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 路径?
  • 我完全错过了评论。

标签: javascript jsf parameter-passing managed-bean


【解决方案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。如果它对你有用,那么可能还有其他不可见的东西可以做实际的工作。
    猜你喜欢
    • 2012-07-07
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2019-11-08
    • 2018-09-03
    相关资源
    最近更新 更多