でパスワードを確認してパスワードを検証しlogin.jsp
、等しい場合にのみ、success.jsp
どの表示にリダイレクトすることができますかWelcome #{beans.username}
。
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テンプレート機能を使用できるようになります。
管理対象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()
関数が実行され、戻り値に応じてリダイレクトが決定されます。
パスワードはString型であるため。String.equals()メソッドを使用して、両方が等しいかどうかを確認できます。
String pass1 ="#s27zaiyt0";
String pass2 ="#s27zaiyt0";
sysout(pass1.equals(pass2));