5

我的目标是将屏幕宽度、高度等信息放入 JSF 中的会话 bean。根据我找到的示例,执行此操作的方法是将参数添加到值为 javascript 的 commandButton。然后将该值传输到 assignTo bean 变量。noEscape 属性应该是为了传递值而不是变量名。

这几乎可以工作。发生的情况是文字变量名称,例如“screen.height”在 bean 中结束,而不是数字,例如 600。我尝试更改它,以便它调用脚本函数,但这没有帮助。(请注意,我将参数放在 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,而不是变量值。任何帮助将非常感激。

4

1 回答 1

6

您的方法无法工作,因为a4j:param与 plain 一起使用时不会在 JavaScript 中评估 value 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);" />

豆子代码:

@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按钮。

更多信息:

于 2013-05-25T07:56:06.417 回答