2013-05-24 14 views
5

Mein Ziel ist es, die Bildschirmbreite, Höhe usw. in eine Session-Bean in JSF zu bekommen. Nach den Beispielen, die ich gefunden habe, ist die Art, dies zu tun, ein Parameter zu einem Befehlsschaltfläche mit einem Wert, der Javascript ist hinzuzufügen. Der Wert wird dann an die Bean-Variable assignTo übergeben. Das noEscape-Attribut soll bewirken, dass der Wert anstelle des Variablennamens übergeben wird.Übergeben von JavaScript-Werten an Bean mit a4j: param

Das funktioniert fast. Was passiert, ist, dass der Name der Literalvariablen, z. "Screen.Height" endet in der Bean anstelle einer Zahl, z. 600. Ich habe versucht, es so zu ändern, dass es eine Skriptfunktion aufruft, aber das hat nicht geholfen. (Beachten Sie, dass ich die Parameter in eine Befehlsschaltfläche einfüge, da die Beispiele es auf diese Weise zeigten und diese Schaltfläche ein praktischer Ort ist und für die App sowieso benötigt wird).

Ich habe den folgenden Code

<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> 

wo

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

Auch das spezifische Problem ist, dass ich die Variablennamen in die Bohne ich immer, nicht die Variablenwerte. Jede Hilfe würde sehr geschätzt werden.

Antwort

6

Ihre Methode kann nicht funktionieren, da der Wert a4j:param in JavaScript nicht ausgewertet wird, wenn er mit plain h:commandButton verwendet wird. Sie müssen stattdessen die a4j:commandButton verwenden.

<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> 

Eine andere Lösung ist a4j:jsFunction, damit Sie in der Lage sein wird, sie JavaScript Werte an die Bohne zu senden.

anzeigen Code:

<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 Code:

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

Hinweis:

ich den Spielraum innerhalb der nahm habe jeden Getter/Setter bewegter gleiche Bohne wie die Aktion für die Einfachheit, auch chang e die h:commandButton zu plain input Taste.

Weitere Informationen:

+0

Danke. Das behebt mein Problem. Nicht ganz sicher, wie ich den h vs a4j Teil verpasst habe. – wjr

+0

@ user2418375 Froh, dass es geholfen hat, vergessen Sie nicht, als akzeptiert zu markieren! –

Verwandte Themen