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

wjr*_*wjr 5 jsf richfaces ajax4jsf

我的目标是将屏幕宽度,高度等放入JSF中的会话bean中.根据我发现的例子中,要做到这一点的方法是添加一个参数去一个命令与JavaScript的是一个值.然后将该值传输到assignTo bean变量.应该使用noEscape属性,以便传递值而不是变量名.

这几乎可行.发生的事情是文字变量名称,例如"screen.height"在bean中而不是数字,例如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>
Run Code Online (Sandbox Code Playgroud)

哪里

<script>
  function getWidth() {
    return screen.width;
  }
</script>
Run Code Online (Sandbox Code Playgroud)

同样,具体问题是我将变量名称放入bean中,而不是变量值.任何帮助将非常感激.

Ale*_*oie 6

您的方法无法工作,因为a4j:param与plain一起使用时,不会在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>
Run Code Online (Sandbox Code Playgroud)

另一个解决方案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);" />
Run Code Online (Sandbox Code Playgroud)

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

注意 :

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

更多信息 :