<h:commandbutton>在Click上创建一个新的CDI @ViewScoped,而不是使用现有的

时间:2017-11-10 09:26:49

标签: jsf java-ee jsf-2 cdi jsf-2.2

在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。仍然没有希望。

产生什么问题?为什么会发生这种情况而不是仅仅调用命令按钮的方法?感谢。

0 个答案:

没有答案