我正在使用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,但我无法理解系统的这种行为。