2013-05-24 4 views
5

私の目的は、画面の幅、高さなどをJSFのセッションBeanに取得することです。私が見つけた例によると、これを行う方法は、javascriptの値を持つcommandButtonにparamを追加することです。次に、値はassignTo bean変数に転送されます。 noEscape属性は、変数名の代わりに値が渡されるようにします。a4j:paramでJavaScript値をBeanに渡す

これはほとんど動作します。何が起きているのかは、変数名のリテラル(例: "screen.height"は数字の代わりにbeanに巻かれます。私はスクリプト関数を呼び出すように変更しようとしましたが、それは助けになりませんでした。 (例ではこのように表示されていて、このボタンは便利な場所であり、とにかくアプリのために必要なので、私は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> 

を持って、特定の問題は、私は豆ではなく、変数の値に変数名を取得していますということです。どんな助けでも大歓迎です。

答えて

6

h:commandButtonと使用すると、a4j:paramの値がJavaScriptで評価されないため、方法が機能しません。代わりに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> 

別の解決策は、これであなたはBeanにJavaScriptの値を送信することができます、a4j:jsFunctionです。

ビューコード:

<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()); 
    } 
} 

注:

私は内部のすべてのゲッター/セッターの移動の自由度を取ってきました単純化のためのアクションと同じbean、またchang h:commandButtonを平文にするinputボタン。

さらに詳しい情報:

+0

ありがとうございました。これは私の問題を解決します。どのように私がh対a4jの部分を見逃したかわからない。 – wjr

+0

@ user2418375うれしいことに、喜んで受け入れたとマークすることを忘れないでください! –

関連する問題