f:setPropertyActionListener仅在视图中工作而不在辅助bean中

时间:2014-11-18 11:14:58

标签: jsf primefaces

我尝试在<p:datalist>中获取有关点击按钮的信息,但它不起作用。

我的观点:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"        
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui" template="/WEB-INF/template.xhtml">
    <ui:define name="head">
        <title>Hash Generator</title>
    </ui:define>
    <ui:define name="content">
        <h:form id="hashForm">
            <p:dataList id="hashList" value="#{hashGeneratorBean.hashList}" var="entry" rowIndexVar="idx" itemType="none">
            <p:column>
                    <h:outputText value="#{idx + 1}" />
                    <h:inputText value="#{entry.clearText}" />
                    <h:inputText value="#{entry.hashedText}" readonly="true" disabled="true" size="#{entry.hashedText.length() + 15}"/>
                    <p:commandButton id="addRow" actionListener="#{hashGeneratorBean.addRow}" icon="ui-icon-plus" title="Icon Only" update="hashList">
                        <f:setPropertyActionListener value="#{entry}" target="#{hashGeneratorBean.selectedRow}" />
                    </p:commandButton>
                    <p:commandButton id="debugBtn" icon="ui-icon-disc" title="Icon Only" update=":hashForm:display" oncomplete="PF('dlg').show()">
                        <f:setPropertyActionListener value="#{entry}" target="#{hashGeneratorBean.selectedRow}" />
                    </p:commandButton>
            </p:column>
            </p:dataList>
            <p:commandButton actionListener="#{hashGeneratorBean.hash}" value="Generate Hashes" update="hashList" />
            <p:dialog modal="true" widgetVar="dlg">
                <h:panelGrid id="display" columns="2">
                    <f:facet name="header">
                        <h:outputText value="#{hashGeneratorBean.selectedRow.clearText}" />
                    </f:facet>
                    <h:outputText value="#{hashGeneratorBean.selectedRow.hashedText}" />
                </h:panelGrid>
            </p:dialog>
        </h:form>
    </ui:define>
</ui:composition>

我的控制器:

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

import com.google.common.base.Charsets;
import com.google.common.hash.Hashing;

@ManagedBean
@ViewScoped
public class HashGeneratorBean {

    private List<HashDTO> hashList = new ArrayList<HashDTO>();
    private HashDTO selectedRow = new HashDTO();

    @PostConstruct
    public void init() {
        hashList.add(new HashDTO());
    }

    public void addRow(ActionEvent ae){
        hashList.add(new HashDTO());
    }

    public void hash(ActionEvent ae){
        for (HashDTO entry : hashList){
            entry.setHashedText(generateHash(entry.getClearText()));
        }
    }

    /**
     * Hashes the given password with SHA-256
     * @param password
     * @return passwordHash
     */
    public static String generateHash(String password) {
        return Hashing.sha256().hashString(password, Charsets.UTF_8).toString();
    }

    public List<HashDTO> getHashList() {
        return hashList;
    }

    public void setHashList(List<HashDTO> hashList) {
        this.hashList = hashList;
    }"

    public HashDTO getSelectedRow() {
        return selectedRow;
    }

    public void setSelectedRow(HashDTO selectedRow) {
        this.selectedRow = selectedRow;
    }

}

如果我单击&#34; debugBtn&#34; - 按钮弹出对话框并显示有关该行的正确信息。但是,如果我单击&#34; addRow&#34; - 按钮,则托管bean中的数据不能正确填充。 selectedRow-property始终存储hashList-property中最后添加的行。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

在ActionListener之后调用PropertyActionListener。

解决方案是使用“Action”或使用和扩展动作侦听器注册ActionListener