1

でパスワードを確認してパスワードを検証しlogin.jsp、等しい場合にのみ、success.jspどの表示にリダイレクトすることができますかWelcome #{beans.username}

4

3 に答える 3

3

Validator通常の方法で実装するだけです。他の人が示唆/暗示するように、検証は確かにアクションメソッドで行われるべきではありません。検証が失敗した場合、デフォルトではアクションメソッドは呼び出されず、同じページが検証エラーとともに再表示されます。<f:attribute>バリデーターがテストのためにその値を取得できるように、パスワードの確認フィールドの時点でパスワードフィールドを渡すことができます。

ビューのキックオフの例を次に示します。

<h:inputSecret id="password" binding="#{passwordComponent}" value="#{bean.password}" required="true" />
<h:message for="password" />

<h:inputSecret id="confirm" required="#{not empty password.value}">
    <f:validator validatorId="confirmPasswordValidator" />
    <f:attribute name="passwordComponent" value="#{passwordComponent}" />
</h:inputText>
<h:message for="confirm" />

およびバリデーター:

@FacesValidator("confirmPasswordValidator")
public class ConfirmPasswordValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        UIInput passwordComponent = (UIInput) component.getAttributes().get("passwordComponent");
        String password = (String) passwordComponent.getValue();
        String confirmPassword = (String) value;

        if (confirmPassword != null && !confirmPassword.equals(password)) {
            throw new ValidatorException(new FacesMessage(
                FacesMessage.SEVERITY_ERROR, "Confirm password is not the same as password", null));
        }
    }

}

メッセージはに表示され<h:message for="confirm">ます。

パスワードは、確認パスワードではなく、バッキングBeanのプロパティとしてのみ必要であることに注意してください。

private String password;

// Getter+setter.

actionメソッドでは、通常の方法でナビゲーションケースの結果を返すことができます。

public String login() {
    User user = userService.find(username, password); 

    if (user != null) {
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("user", user);
        return "success?faces-redirect=true";
    } else {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
            FacesMessage.SEVERITY_WARN, "Unknown login, please try again.", null));
        return null;
    }
}

JSF 2.0以降、他の回答が示唆しているように、冗長なナビゲーションの場合はfaces-config.xmlもう必要ありません。


具体的な問題とは関係なく、なぜ従来のJSPビューテクノロジに固執しているのですか?これはJSF2.0以降廃止され、Faceletsが採用されました。JSPをFaceletsに移行することを検討してください。そうすれば、とりわけ、新しい<f:ajax>JSF2.0の素晴らしさと強力なFaceletsテンプレート機能を使用できるようになります。

于 2012-10-03T12:49:05.577 に答える
1

管理対象Beanでログイン関数を定義する必要があります。この関数は、 faces-config.xmlに記述されているナビゲーションルールを適用する値の文字列を返す必要があります。

あなたのfaces-config.xmlには以下が含まれます:

<navigation-rule>
    <description>
       Login
    </description>
    <from-view-id>/Login.jsp</from-view-id>
    <navigation-case>
        <from-outcome>login_success</from-outcome>
        <to-view-id>/Success.jsp</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>login_failed</from-outcome>
        <to-view-id>/Login_failed.jsp</to-view-id>
    </navigation-case>
</navigation-rule>

Beans.javaマネージドBeanには、ログイン機能が含まれます。

public String login(){
    //Compare login and password against a DB, file, etc.

    if(entered_password.equals(stored_passwd){
        return "login_success";
    }else{
        return "login_failed";
    }
}

最後に、Login.jspフォームで、次のようなログインボタン(およびログインとパスワードの値のh:inputText)を定義します。

<h:commandbutton value="LOGIN" action="#{Beans.login}" />

そのため、ユーザーがログインボタンを押すと、login()関数が実行され、戻り値に応じてリダイレクトが決定されます。

于 2012-10-03T07:46:33.177 に答える
0

パスワードはString型であるため。String.equals()メソッドを使用して、両方が等しいかどうかを確認できます。

   String pass1 ="#s27zaiyt0";
   String pass2 ="#s27zaiyt0";
   sysout(pass1.equals(pass2));
于 2012-10-03T07:32:58.263 に答える