3

JSFとPrimeFacesを使用してアプリケーションを開発しています。私は、ユーザー名、パスワード、およびisUserLoggedInを持つ、セッションスコープの管理対象を持っています。ログインコンポーネントを処理すると、それが機能し、それに応じてページが変更されます。別のページに移動するとすぐに、ユーザー名データのデータが失われます。アプリケーション全体でユーザー名にアクセスする必要があります。ebセッションスコープが必要なデータを失う理由を誰かが知っていますか?なぜ私はそれを他のページではなく1つのページから保持するのですか?ありがとう

import authentication.AuthenticatorManagerLocal;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@SessionScoped
public class UserMB {
    @EJB
    private AuthenticatorManagerLocal authenticatorManager;

    /** Creates a new instance of UserMB */
    public UserMB() {
    }

    Boolean isUserLoggedIn;
    String username;
    String password;
    String nickName;

    public String getNickName() {
        nickName="vanessa";
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public Boolean getIsUserLoggedIn() {
        return isUserLoggedIn;
    }

    public void setIsUserLoggedIn(Boolean isUserLoggedIn) {
        this.isUserLoggedIn = isUserLoggedIn;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String authenticateUser(){
       isUserLoggedIn= authenticatorManager.authenticateUser(username, password);
       if(isUserLoggedIn)return "Home";
       else
           return null;
    }

    public void logout(){
        isUserLoggedIn=false;
        username="";
        password="";
    }

    public String goToIndex(){
        return "Index";
    }

}

HOMEは持っています

<p:commandButton value="SearchCB" action="#{expSearchResultsMB.search()}" ajax="false" />  

カスタムコンポーネント内

expSearchResultsMB.search()は、ユーザー名を表示したいSearchResultsに送信します

 <h:outputLabel value="#{userMB.username}" /> 

アプリケーションのすべてのページでusernameとisUSerLoggedinにアクセスする必要があります。ユーザーがログインしているかどうかを確認すると、ログインしている場合はホームを起動します。ホームにはユーザー名が正しく表示されますが、ホームからsearchCBを使用すると、ランディングのSearchResultsページにユーザー名が表示されません。

誰か助けてもらえますか?

4

1 に答える 1

4
import javax.enterprise.context.SessionScoped;

セッションスコープに間違ったアノテーションをインポートしました。JSFを使用している場合は、パッケージ@ManagedBeanからスコープをインポートする必要があります。javax.faces.bean上記はCDI@Named専用です。

したがって、それに応じて修正します。

import javax.faces.bean.SessionScoped;

@ManagedBean適切なスコープがない場合は、として動作します@NoneScoped。つまり、すべてのEL評価で新しいインスタンスが作成されます。これは、まさに問題のある動作です。

于 2012-01-12T12:26:02.567 に答える