【问题标题】:How do you pass parameters(from javascript) into remoteCommand(& then send it to backing beans)? [duplicate]你如何将参数(从javascript)传递到remoteCommand(然后将它发送到支持bean)? [复制]
【发布时间】:2011-11-21 19:15:33
【问题描述】:

为了将参数从 JS 传递到 p:remoteCommand(primefaces 提供),你可以使用这个:

remoteCommandFunctionName({name1:'value1', name2:'value2'});

之后,您如何在remoteCommand 中接收这组参数以将其发送到 backing beans?

【问题讨论】:

标签: jsf primefaces


【解决方案1】:

如果你已经定义了这样的远程命令:

<p:remoteCommand name="remoteCommandFunctionName" 
                 actionListener="#{myBean.exec}"/>

你有一个带参数的 Javascript 方法调用:

remoteCommandFunctionName({name1:'value1', name2:'value2'});

您不需要指定传递给 Javascript 方法调用到 remoteCommand 的参数。我认为您毕竟需要在支持 bean 中使用这些参数。您可以使用请求参数映射来获取支持 bean 方法中 JavaScript 调用中传递的参数的值:

public void exec() {
    FacesContext context = FacesContext.getCurrentInstance();
    Map map = context.getExternalContext().getRequestParameterMap();
    String name1 = (String) map.get("name1");
    String name2 = (String) map.get("name2");
}

【讨论】:

  • 你究竟是如何通过 javascript 传递这些请求参数的?
  • 其实我还没有找到足够的关于使用 javascript 传递参数到 backing bean 的信息。我在这里提供的信息与我使用 PrimeFaces remoteCommand 的经验有关。可能有更好的实现方式。
  • 谢谢我会测试这是否适合我
  • 旁注:getRequestParameterMap()是一个Map,如果你把这些类型的参数添加到Map中,你就不需要强制转换了。
【解决方案2】:

我用 primefaces 4.0 尝试了以前的解决方案,但它们对我不起作用。

因此,作为一种解决方法,我必须放置一个 &lt;h:inputHidden&gt; 并将值设置为 ManagedBean 的属性, 在调用 &lt;p:remoteCommand&gt; 之前,我设置了这个 h:inputHidden 的值(使用 jQuery)并调用 p:remoteCommand (确保远程命令正在处理h:inputHidden)

FormBean.java

@ManagedBean(name = "formBean")
@ViewScoped
public class FormBean {

  private String myValue;

  public String getMyValue() {
   return myValue;
  }

  public void setMyValue(String myValue) {
      this.myValue = myValue;
  }

  public void remoteAction() {
     someAction(myValue);
  }

}

form.xhtml

.....
<p:remoteCommand name="remoteAction" actionListener="#{formBean.remoteAction()}" process="@this myValueHidden" />

<h:inputHidden id="myValueHidden" value="#{formBean.myValue}" />
.....

form.js

function onClickOfSomeButton() {
$('#formName\\:myValueHidden').val('myValue test value');
  remoteAction();   
}

编辑

这也很完美..

remoteAction([{name: 'name1', value: 'value1'}, {name: 'name2', value: 'value2'}]);

希望这会有所帮助...

【讨论】:

    【解决方案3】:

    instcode 的解决方案适用于 primefaces 4.0

    xhtml

    <p:remoteCommand name="remoteCommandFunctionName" actionListener="#{myBean.exec}"/>
    

    豆子

    public void exec() {
        FacesContext context = FacesContext.getCurrentInstance();
        Map map = context.getExternalContext().getRequestParameterMap();
        String name1 = (String) map.get("name1");
        String name2 = (String) map.get("name2");
    }
    

    JavaScript

    remoteCommandFunctionName([{name: 'name1', value: 'value1'}, {name: 'name2', value: 'value2'}]);
    

    【讨论】:

      【解决方案4】:

      无耻地插入我的答案,因为在 PrimeFace 3.3 中解决这个问题需要花费我几个小时。解决方案是将参数作为 {name: , value: } 的数组传递。

      在 Neyko 的回答中,调用应该更改为:

      remoteCommandFunctionName([{name: 'name1', value: 'value1'}, {name: 'name2', value: 'value2'}]);
      

      【讨论】:

      • 现在在 primfaces 3.4.2 中工作。从 3.2 迁移到 3.4.2 并停止调用。 Neyko 的回答也应该更新。
      • 是的,我很高兴我进一步阅读并得到了这个评论。
      • @instcode 有正确的答案,如果(像我一样)你第一次没有理解它,让我们更明确一点:你必须用文字写出“名称:”和“值:”,因为它们是关键字。您不能将 name: 替换为您的自定义名称(例如,name1...)。当然,冒号右边的可以是js变量,也可以是'常量'。再次感谢!你解决了我的问题!
      猜你喜欢
      • 1970-01-01
      • 2013-07-13
      • 2013-06-29
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 2021-11-06
      相关资源
      最近更新 更多