setPropertyActionListener没有设置任何内容

时间:2014-12-19 13:09:30

标签: jsf jsf-2 primefaces

我正在使用JSF技术。我有2个视图和2个bean。第一个View(homepage.xhtml)在第一个Bean(UserBean)中设置一个文本参数,如下所示:

@ManagedBean   
@SessionScoped  
public class UserBean implements Serializable{

private String searchText;

public UserBean(){}

public String search() {
    return "searching?faces-redirect=true&text="+searchText;
}

视图中的commandButton提交搜索,并调用UserBean.search()。 我在search.xhtml中有这个视图,它是PrimeFaces的一个简单的DataList组件,显示了一个用户列表:

<f:metadata>
    <f:viewParam name="text" value="#{searchView.searchText}"/>
    <f:event type="preRenderView" listener="#{searchView.init()}"></f:event>
</f:metadata>

<h:head>
    <title>Search Results</title>
</h:head>

<h:body>        
    <h:form id="resultsForm">
        <p:dataList var="user" value="#{searchView.results}" type="unordered" itemType="none" paginator="true" rows="10" styleClass="paginated">
            <f:facet name="header">
                Results for #{searchView.searchText}:
            </f:facet>

            <p:panel>
                <p:commandLink update=":resultsForm:userDetail" oncomplete="PF('userDialog').show()" title="user dettagli" styleClass="ui-icon ui-icon-search" style="float:right;margin-right:50px">
                    <f:setPropertyActionListener value = "#{user}" target="#{searchView.selectedUser}"/>
                    <h:outputText value="#{user.firstName}, #{user.lastName}" />
                </p:commandLink>
                <h:outputText value="#{user.firstName} #{user.lastName} (#{user.email})" style="display:inline-block" />
            </p:panel>
        </p:dataList>


    <p:dialog header="User Info" widgetVar="userDialog" modal="true" showEffect="blind" hideEffect="explode" resizable="false">
            <p:outputPanel id="userDetail" style="text-align:center;">
                <p:panelGrid  columns="2" rendered="#{not empty searchView.selectedUser}" columnClasses="label,value">
                    <h:outputText value="First name:" />
                    <h:outputText value="#{searchView.selectedUser.firstName}" />

                    <h:outputText value="Last Name" />
                    <h:outputText value="#{searchView.selectedUser.lastName}" />  

                    <h:outputText value="Calendar" />
                    <h:outputText value="#{searchView.selectedUser.visibility}" />

                </p:panelGrid>
            </p:outputPanel>
        </p:dialog>
    </h:form>
    <br/>
</h:body>

最后,我有这个支持bean:

@ManagedBean
@ViewScoped
public class SearchView implements Serializable {

private List<User> results;
private User selectedUser;
private String searchText;
@EJB
private SearchingManager sm;

public void init() {
    System.out.println("print search text:" + searchText);
    results = sm.search(searchText);
}

public SearchView() {
}

public void setSelectedUser(User selectedUser) {
    System.out.println("setter of selected user");
    this.selectedUser = selectedUser;
}

public User getSelectedUser() {
    System.out.println("getter of selected user");
    return selectedUser;
}

它可以正常显示搜索结果,但是当它打开结果页面时,我会注意到这个输出:
信息:打印搜索文本:Mario
Informazioni:所选用户的吸气剂

所以我想知道为什么在没有选择任何用户的情况下调用 getSelectedUser()。此外,当我选择一个用户时,它会显示一个空对话框,这就是结果:
Informazioni:所选用户的吸气器 Informazioni:所选用户的吸气器 Informazioni:所选用户的吸气器 信息:打印搜索文本:Mario
Informazioni:所选用户的吸气剂

那么它回忆起 init()函数为什么? 最糟糕的是,如果我们关闭Dialog并重新打开它,结果就是这样,但是有了 信息:打印搜索文字:null
并且它因NullPointerException而停止。 我花了几天时间搜索这个setPropertyActionListener,但我无法理解系统的这种行为。

0 个答案:

没有答案