2012-10-24 3 views
7

JSFとPrimeFacesを使用してログインフォームを実装しました。 私はPrimeFacesショーケースウェブサイトでthis exampleを使用しました。Faceletsページのセッション属性にアクセスするにはどうすればいいですか

私は、データテーブルを表示する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ページ内のセッション属性にアクセスすることができますか?

答えて

14

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

次のようにだから、ELで利用可能です:

#{user} 

あなただけの(それがログインしているのIE場合またはしない)、それは存在だかいないかどうかを確認するためにELでemptyキーワードを使用することができますし、JSFを使用することができますコンポーネントのrendered属性は、HTML出力を生成するかどうかを指示します。属性はExternalContext#getSessionMap()を使用しているセッションを保存するために

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

よりよい方法を次のようにテーブルの列を非表示にする特定の場合には

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

は、それを使用しています。あなたのコードは臭いのないようにこの方法で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で使用してみませんか?または、正しい行を返すDBを信頼しないでください。

+0

ありがとうございます。しかし、私はビュー内のオブジェクトとしてユーザーを取得します。このような何かが "User @ 1a8b71e"を示しました。とにかく、私は私の問題を解決するための答えの一部を得ました。セッション設定部分を削除し、LoginBeanクラスをSessionScopedとして設定しました。そして、私はpanelGroupタグ内で直接値を取得することができました。SQLのアドバイスをもう一度歓迎します。私は準備文を使ってそれを変更しました。 –

+0

あなたのコードに表示されている 'username'は明らかに' String'ではありません。おそらくあなたは質問のコードを単純化したでしょうか?ところで、SQLのコメントは、準備されたステートメントについてのヒントではありませんでした。ユーザー名とパスワード**を2回比較しています**(DBで1回、その後Javaで1回)。これは意味がありません。 DBが1つのレコードを返すかどうかをチェックするだけです。既に確認して返すようDBに依頼したユーザー名とパスワードをもう一度比較する必要はありません。 – BalusC

+0

私の最後のSQLクエリでは、Where句でユーザー名だけを使用しました。 like:String query = "SELECTユーザ名、パスワードからユーザ名= '" + uname + "';";だから私はusername.equals(getUsername_db()の部分を削除することができます。)この場合、パスワードを確認する必要があります...ありがとうご提案ありがとう –

関連する問題