Frage

Ich versuche, eine Liste von Benutzernamen zu implementieren, die durch Klicken neu angeordnet werden können HOCH oder NIEDER Links.

<ul>
    <ui:repeat var="user" value="#{cc.attrs.value}">
        <li>
            #{user.name}
            <h:link outcome = "user" value = "left" onclick="#{accountController.moveDown}">
                <f:param name="id" value = "${user.id}" />
            </h:link>
        </li>

    </ui:repeat>
</ul>

Das Problem hier ist, dass ich das Onclick -Attribut nicht richtig verwende. Was ist der richtige Weg, dies zu tun?


Bearbeiten: Nach Ihren Ratschlägen habe ich alle Links in einem Formular platziert:

<h:form>
        <ui:repeat value="#{cc.attrs.value}" var = "user">
        <div class = "user">
            <h:commandLink id = "Link1" value = "Up" binding = "#{accountController.ommandLink}" action = "#{accountController.moveUserUp}">
                <f:attribute name = "userId" value = "#{user.id}" />
            </h:commandLink>
            <h:commandLink id = "Link2" value = "Down" binding = "#{accountController.commandLink}" action = "#{accountController.moveUserDown}">
                <f:attribute name = "userId" value = "#{user.id}" />
            </h:commandLink>
            <h:commandLink id = "Link3" value = "Delete" binding = "#{accountController.commandLink}" action = "#{accountController.deleteUser}">
                <f:attribute name = "userId" value = "#{user.id}" />
            </h:commandLink>
    </div>
</h:form>

Die verwaltete Bohne:

private UIComponent commandLink;

public void moveUserUp(){
    Integer userId = (Integer)commandLink.getAttributes().get("userId");
    System.out.println("MOVE TAB LEFT :" + userId);
}

public void moveUserDown(){
    Integer userId = (Integer)commandLink.getAttributes().get("userId");
    System.out.println("MOVE TAB RIGHT: " + userId);
}

public void deleteUser(){
    Integer userId = (Integer)commandLink.getAttributes().get("userId");
    System.out.println("DELETE TAB: " + userId);
}

public UIComponent getCommandLink() {
    return commandLink;
}

public void setCommandLink(UIComponent commandLink) {
    this.commandLink = commandLink;
}

Die Kommunikation zwischen dem Befehlsverknüpfung und der verwalteten Bean funktioniert jedoch in der Benutzeroberfläche, nur im letzten Befehlslink (Schlussaktion) wird angezeigt.

War es hilfreich?

Lösung

Um eine Bean -Aktionsmethode auf Klicken auf einen Link aufzurufen, benötigen Sie <h:commandLink>. Dies muss in a eingeschlossen sein <h:form>.

<h:form>
    <h:commandLink ... action="#{bean.action}" />
</h:form>

public String action() {
    // ...

    return "/other.xhtml";
}

In JSF nur die Attribute die den EL -Ausdruck als a interpretieren MethodExpression Kann verwendet werden, um Aktionsmethoden zu deklarieren. Alle anderen Attribute werden als interpretiert als ValueExpression und sie werden sofort ausgeführt, wenn die HTML -Ausgabe von JSF generiert wird. Dies deckt die ab onclick Attribut, dessen Wert tatsächlich eine JavaScript -Funktion darstellen sollte.

Falls Sie tatsächlich einen GET -Link verwenden möchten, verschieben Sie die Aktionsmethode auf a <f:viewAction> Auf der Zielseite. Dies wird auf der Seite der Zielseite auf dem Seitenladung aufgerufen.

<h:link ... outcome="/other.xhtml" />

<f:metadata>
    <f:viewAction action="#{bean.onload}" />
</f:metadata>

public void onload() {
    // ...
}

Siehe auch:


Nach Ihren Ratschlägen habe ich alle Links in einem Formular platziert

Die Kommunikation zwischen dem Befehlsverknüpfung und der verwalteten Bean funktioniert jedoch in der Benutzeroberfläche, nur im letzten Befehlslink (Schlussaktion) wird angezeigt.

Sie sollten nicht mehrere physikalisch unterschiedliche Komponenten an eine und gleiche Bohneneigenschaft binden. Auch die <f:attribute> Argumente zu bestehen, ist in JSF2 hacky und nicht mehr notwendig. Unter der Annahme, dass Sie einen Servlet 3.0 / EL 2.2 -Container verwenden (Ihr Fragenhistorium bestätigt, dass Sie Glassfish 3 verwenden), geben Sie das Argument eher direkt als Methodenargument weiter:

<h:commandLink id="Link1" value="Up" action="#{accountController.moveUserUp(user)}" />
<h:commandLink id="Link2" value="Down" action="#{accountController.moveUserDown(user)}" />
<h:commandLink id="Link3" value="Delete" action="#{accountController.deleteUser(user)}" />

mit

public void moveUserUp(User user) {
    // ...
}

public void moveUserDown(User user) {
    // ...
}

public void deleteUser(User user) {
    // ...
}

Siehe auch:

Andere Tipps

Das onclick Das Attribut wird verwendet, um die JavaScript-Funktion (clientseitig) aufzurufen. Es wird verwendet, wenn Sie ein JavaScript -Klick -Ereignis Hander anhängen möchten.

"#{accountController.moveDown}" ist eine Methodexpression. Und wie der Name schon sagt, sieht es aus accountController ist eine verwaltete Bohne.

Als die h:link Dokument sagt:

Javax.el.ValueExpression (muss an Java.lang.String bewerten)

Kann ein Wertausdruck sein, der letztendlich an eine Zeichenfolge bewertet werden muss.

JavaScript -Code, der ausgeführt wird, wenn eine Zeigerschaltfläche über dieses Element geklickt wird.

Aktualisieren:

Kann das sein, was Sie suchen, ist h:commandLink. Du kannst den ... benutzen action Attribut zum Aufrufen der Backing Bean -Methode.

I have modified your code, let me know if this is what you are looking at achive

    <h:form>
        <a4j:outputPanel id="userList" ajaxRendered="false">
            <ui:repeat  value="#{manageUser.userList}" var="user">
                <div class="user">
                    <h:panelGrid columns="3">
                    <h:outputText value="#{user.userId} ---- #{user.userName} ---- " />

                    <a4j:commandLink id="LinkUp" value="Up" execute="@this" 
                        action="#{manageUser.moveUserUp}" limitRender="true" render="userList" >
                        <f:setPropertyActionListener value="#{user}" target="#{manageUser.user}" />
                    </a4j:commandLink>

                    <a4j:commandLink id="LinkDown" value="down"
                        action="#{manageUser.moveUserDown}" execute="@this" limitRender="true" render="userList" >
                        <f:setPropertyActionListener value="#{user}" target="#{manageUser.user}" />
                    </a4j:commandLink>
                    </h:panelGrid>
                </div>
            </ui:repeat>
        </a4j:outputPanel>      
        </h:form>

Managed Beans (ManageUser)


import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean(name="manageUser")
@ViewScoped
public class ManageUser  implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -5338764155023244249L;

    private List<UserBean> userList;

    private UserBean user;

    /**
     * @return the user
     */
    public UserBean getUser() {

        return user;
    }

    /**
     * @param user the user to set
     */
    public void setUser(UserBean user) {
        this.user = user;
    }


    /**
     * @return the userList
     */
    public List<UserBean> getUserList() {
        return userList;
    }

    /**
     * @param userList the userList to set
     */
    public void setUserList(List<UserBean> userList) {
        this.userList = userList;
    }

    public ManageUser() {
        UserBean user1= new UserBean();
        user1.setUserId("1");
        user1.setUserName("userName1");

        UserBean user2= new UserBean();
        user2.setUserId("2");
        user2.setUserName("userName2");

        UserBean user3= new UserBean();
        user3.setUserId("3");
        user3.setUserName("userName3");

        userList = new ArrayList<UserBean>();
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
    }

    public void moveUserDown(){

        if(user !=null){
            int indexObj= userList.indexOf(user);

            if(indexObj < userList.size()-1){
                UserBean tempUser=userList.get(indexObj+1);
                userList.set(indexObj+1, user);
                userList.set(indexObj, tempUser);

            }
        }
    }

    public void moveUserUp(){

        if(user !=null){
            int indexObj= userList.indexOf(user);

            if(indexObj > 0){
                UserBean tempUser=userList.get(indexObj-1);
                userList.set(indexObj-1, user);
                userList.set(indexObj, tempUser);

            }
        }
    }

}

UserBean
import java.io.Serializable;

public class UserBean  implements Serializable {



    /**
     * 
     */
    private static final long serialVersionUID = 3820279264217591645L;

    private String userName;

    private String userId;

    /**
     * @return the userName
     */
    public String getUserName() {
        return userName;
    }

    /**
     * @param userName the userName to set
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }

    /**
     * @return the userId
     */
    public String getUserId() {
        return userId;
    }

    /**
     * @param userId the userId to set
     */
    public void setUserId(String userId) {
        this.userId = userId;
    }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top