在我的应用程序中,我有这个托管bean:
@ManagedBean(name = "mrBean")
@RequestScoped
public class MrBean {
@ManagedProperty(value = "#{param.id}")
private Long commentableID;
private String comment;
@PostConstruct
public void init() {
System.out.println("INIT " + commentableID);
}
public void postComment() {
System.out.println("POST COMMENT " + commentableID);
}
public void like(boolean like) {
System.out.println("LIKE " + commentableID);
}
// Getters and Setters
}
问题1:
在查看文章的页面上,我有以下方框进行评论。
<h:panelGrid columns="1">
<p:inputTextarea id="comment" value="#{mrBean.comment}" />
<p:commandButton actionListener="#{mrBean.postComment}" value="Post">
<f:param name="id" value="#{viewCommentable.commentableID}" />
</p:commandButton>
</h:panelGrid>
使用上面的代码,一切正常。但是,由于postComment()
函数只需要comment
属性,因此我尝试将process='comment'
放入上面的p:commandButton
。此时,每当我单击Post
按钮时,我总是在控制台上看到INIT [commentableID]
。但是,我从未见过POST COMMENT [commentableID]
。换句话说,即使正确创建了bean,也从未调用过侦听器方法postComment()
。
问题2:
在同一页面上,我有以下切换按钮,用于喜欢/不喜欢文章。
<h:inputHidden id="commentableID" value="#{mrBean.commentableID}" />
<p:selectBooleanButton id="like" value="#{viewCommentable.commentable.liked}" onLabel="Liked" offLabel="Like" >
<p:ajax process="like dislike commentableID" listener="#{mrBean.like(viewCommentable.commentable.liked)}" />
</p:selectBooleanButton>
<p:selectBooleanButton id="dislike" value="#{viewCommentable.commentable.disliked}" onLabel="Liked" offLabel="Like" >
<p:ajax process="like dislike commentableID" listener="#{mrBean.dislike(viewCommentable.commentable.disliked)}" />
</p:selectBooleanButton>
这些按钮工作正常。但是,我观察到的很奇怪。当我单击Like按钮时,在控制台上我看到了这些行:
INIT null
LIKE [commentableID]
不知何故,属性commentableID
在init()
函数中不可用,但稍后在like()
函数中。
如果你能解释一下上述两个问题,我将非常感激。
致以最诚挚的问候,
答案 0 :(得分:1)
我终于意识到我没有正确使用process
属性。为了部分处理,在<p:commandButton>
中,我需要处理的组件的ID以及@this
来处理按钮本身。此外,另一个问题是我没有使用process
属性的正确语法。 ID应以comma
而不是space
分隔。以下代码段应该有效:
<p:commandButton process="@this, comment" actionListener="#{mrBean.postComment}" value="Post">
<f:param name="id" value="#{viewCommentable.commentableID}" />
</p:commandButton>
<p:selectBooleanButton id="like" value="#{viewCommentable.commentable.liked}" onLabel="Liked" offLabel="Like" >
<p:ajax process="like, dislike, commentableID" listener="#{mrBean.like(viewCommentable.commentable.liked)}" />
</p:selectBooleanButton>
答案 1 :(得分:0)
在p中添加进程和更新属性:commandButton喜欢这个,
<h:panelGrid columns="1">
<p:inputTextarea id="comment" value="#{mrBean.comment}" />
<p:commandButton actionListener="#{mrBean.postComment}" value="Post" process="@this" update="grid">
<f:param name="id" value="#{viewCommentable.commentableID}" />
</p:commandButton>
</h:panelGrid>
但是,process属性有许多关键字,如@ this,@ form,@ all等。在here
中显示详细信息