0

ページの読み込み時に f:event を実行しようとしています。f:eventバッキング Bean 関数に関連付けられていますinit()。は、関数で使用されるinit()セッション オブジェクトを作成します。しかし、私が直面している問題は、関数が最初に実行されるため、セッションオブジェクトが見つからず、null ポインター例外が発生することです。関数が呼び出されることはありません。はセッション スコープです。toIndexgetStatusList()getStatusList()toIndexinit()StatusBean

1)xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://java.sun.com/jsp/jstl/core">
<f:view>
    <f:event type="postAddToView" listener="#{statusBean.init}" ></f:event>
</f:view>
<h:head></h:head>
<h:body>
    <c:forEach var="p" items="#{statusBean.statusList}"
                        varStatus="loop">
     //content
    </c:forEach>

</h:body>
</html>

2) バッキングビーン

public class StatusBean  {

public List<Status> getStatusList() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext()
                .getSession(true);
        User user = (User) session.getAttribute("userdet");
        Query query = em.createQuery("SELECT s FROM Status s WHERE s.email='"
                + user.getEmail() + "' ORDER BY s.timeMillis desc",
                Status.class);
        List<Status> results = query.getResultList();

        Collections.sort(results);
        int toIndex = (int) session.getAttribute("toIndex");
        List<Status> subList = results.subList(0, toIndex);
        return subList;

    }
public void init(ComponentSystemEvent event) {
        System.out.println("inside init");
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
        int toIndex = 5;
        session.setAttribute("toIndex",toIndex);
    }


}
4

1 に答える 1

1

ここでの問題はc:forEach. ビューが構築されたとき (おそらくイベントがトリガーされる前) に実行されます。に置き換えてみてくださいui:repeat。一般に、c:forEach副作用があるため、JSF と一緒に使用する場合は注意して使用する必要があります。

于 2013-04-13T09:38:41.617 に答える