JSF1.1でログインページを作ってみる

感想おまちしてます!

BackingBeanとは、JSPと連動してくれるJavaBeansのこと。

以下、ログインページを作ってみながら説明。

  • ユーザIDとパスワードを入力して文字列が正しければ成功画面へ遷移する
  • 入力した内容に間違いがある場合は同じ画面に遷移する

Loginクラスの作成

JavaBeanには表示されるWEBページの

  • ユーザID入力欄
  • パスワード入力欄

に対応したアクセッサ(Getter、Setter)を作成する。
また、ログインボタンを押した時に実行するメソッドも作成する。

package com.daipresents.web.login;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import com.daipresents.web.session.SessionConst;

public class Login {

private static final String RETURN_OK = "OK";

private static final String RETURN_NG = "NG";


/** ユーザID */
private String userID;
/** パスワード */
private String password;


public String getPassword() {
return password;
}


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

public String getUserID() {
return userID;
}

public void setUserID(String userID) {
this.userID = userID;
}


public String login(){

FacesContext context = FacesContext.getCurrentInstance();
ExternalContext externalContext = context.getExternalContext();
HttpSession session = (HttpSession)externalContext.getSession(true);

if("test".equals(this.userID)){
if("aaaa".equals(this.password )){
session.setAttribute(SessionConst.IS_LOGIN, Boolean.TRUE);
return RETURN_OK;
}
}

session.setAttribute(SessionConst.IS_LOGIN, Boolean.FALSE);

return RETURN_NG;

}

}

loginメソッドでは、ユーザ名とパスワードの比較を実行し、マッチすればSessionオブジェクトに「IS_LOGIN」という名前の値に「True」を設定している。これによってユーザのログイン状態を確認できるようにする。

作られたJavaBeanはServletのようにRequestやResponseを引数で受け取っていないため使うことができない。なのでSessionオブジェクトは以下のようにして取得している。JSFを使う場合はこういう作法になるのかもかも。

  FacesContext context = FacesContext.getCurrentInstance();
ExternalContext externalContext = context.getExternalContext();
HttpSession session = (HttpSession)externalContext.getSession(true);

JSPの作成

今回作るのは「ログインページ」と「成功ページ」のみ。「成功ページ」はWEBAPのルートにある「index.jsp」を使うことにするので、実質1枚作成する。

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.*" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<f:view>
<h:form>
<h:panelGrid columns="2">

<h:outputText value="ユーザID" />
<h:inputText value="#{Login.userID}" />

<h:outputText value="パスワード" />
<h:inputSecret value="#{Login.password}" />

<h:commandButton action="#{Login.login}" value="ログイン" />

</h:panelGrid>
</h:form>
</f:view>

JSFのタグに作ったJavaBeanのアクセッサをひも付ける感じだ。Bottonのaction属性にメソッドを関連付けているのもわかる。loginメソッドの戻り値は「OK」か「NG」なので、その文字列がaction属性にわたされfaces-config.xmlに設定した動きをする。

faces-config.xml

<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd">

<faces-config>

<navigation-rule>
<from-view-id>/login/login.jsp</from-view-id>
<navigation-case>
<from-outcome>OK</from-outcome>
<to-view-id>/index.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>NG</from-outcome>
<to-view-id>/login/login.jsp</to-view-id>
</navigation-case>
</navigation-rule>

<managed-bean>
<managed-bean-name>Login</managed-bean-name>
<managed-bean-class>com.daipresents.web.login.Login</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>

</faces-config>

loginメソッドから帰ってきた「OK」、「NG」という文字に対しての遷移情報を記載する。「to-view-id」タグがそれにあたるが、ここにはWEBAPのコンテキストを除いたパスを入力しないといけないっぽい。