在JSF 2.2应用程序中,用户访问链接test.xhtml?id=324
,页面必须具有参数id。该页面由名为TestBean的 CDI @ViewScoped Bean支持。
使用 @postconstruct 方法
对字段进行初始化@PostConstruct
public void initialize() {…}
这个方法,根据id加载数据,如果id不存在或正确,则将用户引导到另一个页面
<f:metadata>
<f:viewAction action="#{testBean.redirectNoParameters}"></f:viewAction>
</f:metadata>
public String redirectNoParameters() {
//method load data based on id, if id is not present or correct, then direct the user to another page
test = testDao.find(id);
在此页面中有一个评论部分
<h:form role="form" prependId="false" >
<h:selectOneMenu value="#{testBean.sortComment}" valueChangeListener="#{testBean.orderComments}">
<f:ajax event="change" execute="@this" render="comment-listing" />
<f:selectItem itemLabel="Recent" itemValue="1"></f:selectItem>
<f:selectItem itemLabel="Oldest" itemValue="2"></f:selectItem>
<f:selectItem itemLabel="Popular" itemValue="3"></f:selectItem>
</h:selectOneMenu>
</h:form>
<div jsf:id="comment-listing">
<div >
<h:form role="form" prependId="false">
<ui:repeat var="comment" value="#{testBean.comments}" >
<div >
<div >
<div>
<h:commandButton value="#{comment.votes.size()}" action="#{testBean.upVote(comment)}" >
<f:ajax execute="@this" render="comment-listing" immediate="true"/>
</h:commandButton>
</div>
</div>
<div >
<h4 >
<h:link outcome="channel">
<f:param name="handle" value="#{comment.commentor.handle}"></f:param>
#{comment.commentor.handle}
</h:link>
on <span class="c-date">#{comment.creationDate}</span>
</h4>
#{comment.comment}
</div>
</div>
</ui:repeat>
</h:form>
</div>
</div>
正如您可以看到的每条评论都有一个<h:commandButton>
用户可以对评论进行投票(例如在youtube,stackoverflow ...中)。单击该方法时,它按照有意义工作。调用方法testBean.upVote(comment)
并更新ui。
然后我使用上面的第一个表单来重新排序评论,例如,更改来自热门 - &gt;最近。该方法也可以完成其工作并更新ui。
直到现在一切都很好。
然而,当我点击upvote btn /方法(另一条评论)重新时。调用 contsructor , @postconstruct 和redirectNoParameters()
。
我尝试删除所有ajax标记以查看它是否是ajax问题。问题仍然存在。所以这不是ajax问题。
我尝试从方法"#{testBean.upVote(comment)}"
中删除参数注释,看看是否是产生问题的原因。问题仍然存在。
我尝试使用<c:forEach
代替<ui:repeat
。仍然没有希望。
产生什么问题?为什么会发生这种情况而不是仅仅调用命令按钮的方法?感谢。