1

これは私の断片です:

<ui:fragment rendered="#{}">
    <ui:include src="../includes/top.xhtml"/>
</ui:fragment>

LoginControllerは、ブールメソッドを持つMainControllerを拡張するhome.htmlページにリダイレクトされるため、これを呼び出そうとすると、Javaが最初にhtmlをロードして、Javaクラスを呼び出しているかどうかを確認します。アクセスしようとすると(HomeControllerから拡張され、まだ呼び出されていません)、このnullポインターを取得しますshowComponentmainController.showComponent()nullPointerExceptionmainController

。maisControllerが設定されている場合、フラグメント内を確認するにはどうすればよいですか?

これが私がこれまでに試したことです

<ui:fragment rendered="#{not empty mainController ? true : false}">

常にを返しますtrue

これが私のMainControllerクラスです:

package com.erp3.gui.controllers;

import java.io.IOException;
import javax.faces.bean.ManagedBean;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

@ManagedBean
public class MainController {

    public LoginController loginController;
    public ExternalContext ec;

    public void checkUserSession() throws IOException {
        ec = FacesContext.getCurrentInstance().getExternalContext();
        loginController = (LoginController) ec.getSessionMap().get("loginController");
        loginController = (LoginController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginController");
        if (loginController == null || !loginController.getIsLoggedIn()) {
            ec.redirect(ec.getRequestContextPath() + "/views/login.html");
        }
    }

    public Boolean showComponent() {
        return this.loginController.getIsLoggedIn();
    }
}

私のメソッドshowComponent()はからセッションオブジェクトプロパティを返していますloginController

4

2 に答える 2

2

どうやらですNullPointerExceptionので投げます。それが別の場合は、管理プロパティとして注入する必要があります。このように、セッションマップから手動で取得する必要はありません。また、有効なBeanスコープを指定する必要があります。スコープがないと、すべてのEL式に新しいスコープが作成されます。loginControllernull@ManagedBeanMainController#{mainController}

@ManagedBean
@RequestScoped
public class MainController {

    @ManagedProperty("#{loginController}") // +getter+setter
    public LoginController loginController;

    @PostConstruct // Will be invoked directly after construction and managed property injection.
    public void checkUserSession() throws IOException {
        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
        if (!loginController.getIsLoggedIn()) {
            ec.redirect(ec.getRequestContextPath() + "/views/login.html");
        }
    }

    public boolean isShowComponent() {
        return loginController.getIsLoggedIn();
    }

}

次に、それを使用できます。

<ui:fragment rendered="#{mainController.showComponent}">

#{loginController}しかし、直接アクセスしてみませんか?

<ui:fragment rendered="#{loginController.isLoggedIn}">

あなたの質問に関して、なぜ#{not empty mainController ? true : false}常に評価するのかというtrueと、JSF@ManagedBean決して null評価されないからです。ELスコープに存在しない場合、JSFはELスコープを自動作成します。

于 2012-04-26T19:42:40.277 に答える
1

loginControllerを呼び出すとnullのようですshowComponent。メソッドの作成getLoginController

public getLoginController() {
    (LoginController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginController");
}

public Boolean showComponent() {
    return getLoginController() != null && getLoginController().getIsLoggedIn();
}
于 2012-04-26T19:42:33.150 に答える