Jsf setPropertyActionListener不设置任何内容
我正在使用JSF技术。我有两个视图和两个bean。first View homepage.xhtml在第一个Bean UserBean中设置一个文本参数,如下所示:Jsf setPropertyActionListener不设置任何内容,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,我正在使用JSF技术。我有两个视图和两个bean。first View homepage.xhtml在第一个Bean UserBean中设置一个文本参数,如下所示: @ManagedBean @SessionScoped public class UserBean implements Serializable{ private String searchText; public UserBean(){} public String search() { return "
@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的一个简单数据列表组件,显示用户列表:
<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;
}
它可以正常工作并正确显示搜索结果,但当它打开结果页面时,我注意到以下输出:
Informazioni:打印搜索文本:Mario
Informazioni:所选用户的获取者
所以我想知道为什么不选择任何用户就调用getSelectedUser。此外,当我选择一个用户时,它会显示一个空对话框,结果如下:
Informazioni:所选用户的获取者
Informazioni:所选用户的获取者
Informazioni:所选用户的获取者
Informazioni:打印搜索文本:Mario
Informazioni:所选用户的获取者
所以它回忆起init函数为什么?
最糟糕的是,如果我们关闭对话框并重新打开它,结果是类似的,但是
Informazioni:打印搜索文本:空
它会因为NullPointerException而停止。
我花了几天的时间搜索这个setPropertyActionListener,但我无法理解系统的这种行为 将的进程属性设置为@this like,默认为@form。如果您使用的是JSF 2.2,那么请更改为并删除init方法后不必要悬挂的括号,例如。非常感谢您的评论,我删除了,并将其替换为,不再需要每次调用init以及NullPointerException问题。但是对话框仍然是空的,我看到一个Informazioni:getter of selected user,当页面在commandlink中也使用该属性打开时,你的意思是setter方法public void setselecteduser selectedUser{…}从未被调用吗?当然,从本质上来说,获得者是。只是不要将关键业务逻辑放在getter方法中,也不要担心它们。是的,事实是getSelectedUser是在页面打开时调用的,没有我选择任何用户,而且setter从未调用过。现在我们试着让烘焙豆@SessionScope而不是@ViewScope,并调用目标selectedUser而不是searchView.selectedUser,这一切似乎都正常工作,但我仍然不明白为什么。我还没有提到任何关于它的事-只是把它放在一边,但为什么会出现以下错误?它应该会给你一个解析错误。