2011-08-03 9 views
3

これはこの美しいサイトの最初の質問です。私はたくさんのグーグルで検索しましたが、解決策は見つかりませんでした。JSFは@Named @RequestScoped Beanにサブミットされた入力値を設定しません

私はJSFを使い始めました。私はKent Ka Lok Tongの "JSF 2 APIs and JBoss Seam"でそれを学んでいます。

今、私は簡単なログイン実装に問題があります。私は自分のユーザー名とパスワードのプロパティがnullなるアプリケーションを実行すると

package app.controller; 

import app.model.beans.User; 
import javax.faces.bean.RequestScoped; 
import javax.inject.Named; 


@Named("loginRequest") 
@RequestScoped 
public class LoginRequest { 

    private String username; 
    private String password; 

    public String getUsername() { 
     return username; 
    } 

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

    public String getPassword() { 
     return password; 
    } 

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

    public LoginRequest(){ 
    System.out.println("created " + this.toString()); 
    } 

    public String doLogin(){ 

     if(this.username != null && this.password != null){ 

      if(this.username.equals("user") && this.password.equals("password")){ 
      //this.userHolder.setCurrentUser(username); 
      return "success"; 

      } 
     return "failure"; 

     } 
     return "failure"; 

    } 


} 

<?xml version='1.0' encoding='UTF-8' ?> 
<!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:h="http://java.sun.com/jsf/html"> 
    <h:head> 
     <title>Login</title> 
    </h:head> 
    <h:body> 
     <h1>Login</h1> 
     <h:messages for="loginForm" /> 
     <h:form id="loginForm"> 
      <h:inputText id="username" value="#{loginRequest.username}" required="true" /> 
      <h:inputSecret id="password" value="#{loginRequest.password}" required="true" /> 
      <h:commandButton value="Login" action="#{loginRequest.doLogin}"></h:commandButton> 
     </h:form> 

    </h:body> 
</html> 

とバッキングBean:私は、ログインページがあります。私は私のアプリケーションをデバッグし、私はsettersメソッドが正しく呼び出されていることを見た。問題は、setUsernameが呼び出され、LoginRequestのインスタンスが存在し、setPassword関数と呼ばれるときにインスタンスが異なることです。アプリケーションがこれを行うと思われます:

obj1 = new LoginRequest() //username and password = null; 
obj1.username = username; 

obj1 = new LoginRequest() //username and password = null; 
obj1.password = password; 

obj1 = new LoginRequest() //username and password = null; 
obj1.doLogin(); 

私は困っていますか?間違いはどこですか?

ありがとうございます!あなたの豆から

敬具

マルコ

+0

「アプリケーションを実行する」とはどういう意味ですか?ログインページを開いて、テキストボックスにあなたの名前とパスワードを入力し、ログインボタンをクリックしますか? – egbokul

+0

はい、グラスフィッシュにアプリを配備し、ブラウザでログインページを開き、ユーザーとパスワードを入力してボタンを押します。 – EmarJ

答えて

15

import javax.faces.bean.RequestScoped; 
import javax.inject.Named; 

@Named("loginRequest") 
@RequestScoped 
public class LoginRequest { 

あなたはCDIとJSF注釈を混合しています。あなたはでなく、でなければなりません。どちらか一方を使用してください。本の内容はわかりませんが、@RequestScoped注釈のインポート中に誤った自動補完候補を選択した可能性が最も高いです。 IDEがあなたに示唆していることがあれば、その本があなたに何を伝えても一致するかどうかに注意してください。

だから、あなたは CDI注釈のみ

import javax.enterprise.context.RequestScoped; 
import javax.inject.Named; 

@Named("loginRequest") 
@RequestScoped 
public class LoginRequest { 

または JSF注釈のみ

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 

@ManagedBean(name="loginRequest") 
@RequestScoped 
public class LoginRequest { 

のいずれかを使用する必要がありそうでない場合"none"へのスコープのデフォルトと一つ一つのEL式は、Beanを参照Beanのまったく新しいインスタンスを作成します。 #{loginRequest}を参照する3つのEL式では、3つのインスタンスになります。名前が設定されているもの、パスワードが設定されているもの、アクションが呼び出されているもの。具体的な問題とは無関係の


、小文字1文字目とクラス名にマネージドBean名がすでにデフォルトはJavaBeanの仕様に準拠しています。​​部分を省略することもできます。

+0

私は名前空間が同じであると信じていました。"Current"と "ManagedProperty"アノテーションの間に同じ違いがあります!あたりです?それから、CDIとJSFの注釈を混ぜ合わせません。大いに感謝する! – EmarJ