使用a4j:param将JavaScript值传递给Bean

时间:2013-05-24 17:13:09

标签: jsf richfaces ajax4jsf

我的目标是将屏幕宽度,高度等放入JSF中的会话bean中。根据我发现的示例,执行此操作的方法是向commandButton添加一个param,其值为javascript。然后将该值传输到assignTo bean变量。应该使用noEscape属性,以便传递值而不是变量名。

这几乎可行。发生了什么是文字变量名称,例如" screen.height"缠绕在豆而不是数字,例如600.我尝试更改它以便它调用脚本功能,但这没有帮助。 (注意,我将params放在commandButton中,因为这些示例以这种方式显示,并且此按钮是一个方便的地方,无论如何都需要它。)

我有以下代码

<h:commandButton value="Log In"  action="#{loginBean.login}" styleClass="buttons">
   <a4j:param name="w" value="getWidth()" assignTo="#{browser.screenWidth}" noEscape="true" />
   <a4j:param name="h" value="screen.height" assignTo="#{browser.screenHeight}" noEscape="true" />
   <a4j:param name="a" value="navigator.userAgent" assignTo="#{browser.userAgent}" noEscape="true" />
</h:commandButton>

其中

<script>
  function getWidth() {
    return screen.width;
  }
</script>

同样,具体问题是我将变量名称输入bean,而不是变量值。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:6)

您的方法无法正常工作,因为与普通a4j:param一起使用时,JavaScript中未评估h:commandButton值。您需要改为使用a4j:commandButton

<a4j:commandButton value="Log In" action="#{loginBean.login}" styleClass="buttons">
   <a4j:param name="w" value="getWidth()" assignTo="#{browser.screenWidth}" noEscape="true" />
   <a4j:param name="h" value="screen.height" assignTo="#{browser.screenHeight}" noEscape="true" />
   <a4j:param name="a" value="navigator.userAgent" assignTo="#{browser.userAgent}" noEscape="true" />
</a4j:commandButton>

另一个解决方案a4j:jsFunction,您可以将此JavaScript值发送给bean。

查看代码:

<a4j:jsFunction name="login" action="#{loginBean.login}">
    <a4j:param name="screenWidth" assignTo="#{loginBean.screenWidth}" />
    <a4j:param name="screenHeight" assignTo="#{loginBean.screenHeight}" />
    <a4j:param name="userAgent" assignTo="#{loginBean.userAgent}" />
</a4j:jsFunction>

<input type="button" onclick="login(screen.width,screen.height,navigator.userAgent);" />

Bean代码:

@ManagedBean
@ViewScoped
public class TestJavaScriptActions
{
    private Integer m_iScreenWidth;
    private Integer m_iScreenHeight;
    private String m_sUserAgent;

    public void setScreenWidth(Integer p_iScreenWidth)
    {
        m_iScreenWidth = p_iScreenWidth;
    }

    public Integer getScreenWidth()
    {
        return m_iScreenWidth;
    }

    public void setScreenHeight(Integer p_iScreenHeight)
    {
        m_iScreenHeight = p_iScreenHeight;
    }

    public Integer getScreenHeight()
    {
        return m_iScreenHeight;
    }

    public void setUserAgent(String p_sUserAgent)
    {
        m_sUserAgent = p_sUserAgent;
    }

    public String getUserAgent()
    {
        return m_sUserAgent;
    }

    public void login()
    {
        System.out.println(getScreenWidth() + ", " + getScreenHeight() + ", " + getUserAgent());
    }
}

注意:

为了简单起见,我采取了移动每个getter / setter在同一个bean内部的自由度,同时将h:commandButton更改为普通input按钮。

更多信息: