9

JSF と PrimeFaces を使用してログイン フォームを実装しました。この例は、PrimeFaces ショーケース Web サイトで使用しました。

dataTable を表示する Facelets ページがあります。ここで、上記のログイン フォームをこのテーブル ページに統合する必要があります。そのため、セッション属性を処理するために LoginBean.java に数行追加しました。

     if (username.equals(getUsername_db()) && password.equals(getPassword_db())) {//valid user and paward
        loggedIn = true;
        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome", getUsername_db());
        //new lines
        FacesContext context2 = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context2.getExternalContext().getSession(true);
        session.setAttribute("user", username);
        //end of new lines
        ...

ユーザーがログインしていない場合、dataTable から列を非表示にする必要があります。Facelets ページ内のセッション属性にアクセスするにはどうすればよいですか?

4

1 に答える 1

21

ログインしたユーザーを「user」という名前のセッション属性として保存しました。

したがって、次のようにELで利用できます。

#{user}

EL でキーワードを使用してempty存在するかどうか (つまり、ログインしているかどうか) を確認し、JSF コンポーネントのrendered属性を使用して HTML 出力を生成するかどうかを指示できます。

<h:panelGroup rendered="#{not empty user}">
    <p>Welcome #{user}, you have been logged in!</p>
</h:panelGroup>

テーブル列を非表示にする特定のケースでは、次のように使用してください。

<p:column rendered="#{not empty user}">
    ...
</p:column>

セッション属性を保存するより良い方法は、を使用することExternalContext#getSessionMap()です。このようにして、あなたのコードは臭いjavax.servlet.*インポートから解放されます。

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("user", username);

具体的な問題とは関係ありませんが、なぜ次のチェックを行うのでしょうか?

if (username.equals(getUsername_db()) && password.equals(getPassword_db())) {

SELECT ... FROM user WHERE username=? AND password=?SQLでaを実行してみませんか?または、DB が正しい行を返すことを信頼していませんか?

于 2012-10-24T10:57:09.290 に答える