JavaとJavaEEプログラマのブログ

JavaEEを中心にしたをソフトウェア開発についてのブログ

JavaEE6入門〜JSF2.0 カスタムコンバータとバリデータ〜

画面の入力値をStringから他の型へ変換するのがコンバータ。

    <h:inputText value="#{myBookController06.book.price}" >
        <!-- 文字列を数値に変換する。myBookController06.book.priceに応じてNetBeasnsが補完してくれる。 -->
        <f:convertNumber  /> 

        <!-- 文字数を検証するバリデータ -->
        <f:validateLength minimum="2" maximum="20" />
    </h:inputText>

    <td>
        <h:inputText value="#{myBookController06.book.title}"/>
        <!-- カスタムコンバータの例
        @FacesConverter(value="customTitleConvertor") が付加され、Converterインターフェースを実装したクラスに関連づけられる。
        
        -->        
        <f:convertNumber  converterId="customTitleConvertor" /> 

        <!-- カスタムバリデータの例
        @FacesValidator(value="customValidator") が付加され、Validatorインターフェースを実装したクラスに関連づけられる。
        
        -->        
        <f:validator  converterId="customValidator" /> 
        
    </td>

    <!-- コンバータとバリデータは以下のように属性で指定することも可能。 -->
    <h:inputText 
        value="#{myBookController06.book.title}" 
        converter="customTitleConvertor" 
        validator="customValidator"
    />

    
@FaceConverter(value="customTitleConvertor")
public class CustomTitleConvertor implements Converter{

    /**
     画面を構成しているUIコンポーネントに入力された文字列を、別のオブジェクトに変換する。
     変換が失敗した場合にはConverterExceptionを投げる。
    */
    @Override
    public Object getAsObject(){}

    /**
     getAsObjectとは逆にオブジェクトをUIコンポーネントに表示する文字列に変換する。
     変換が失敗した場合にはConverterExceptionを投げる。
    */
    @Override
    public String getAsString(){}

}

@FacesValidator(value="customValidator")
public class CustomValidator implements Validator{

    /**
     バリデートで検証エラーが発生した場合にはValidatorExceptionを投げる。
    */
    @Override
    public Object validate(){}

}

<||


*1350898525*[javaEE6][JSF2]JavaEE6入門〜JSF2.0 マネージドBean〜

最新の解説はこちらを参照。
[http://yoshio3.com/2012/08/24/detail-of-jsf20/:title=JSF 2.0 の詳細について]

JSF2.0は大きく分けると、クライアントに対する画面を作るコンポーネントとコンポーネントに必要なデータを渡したり、コンポーネント間のページ遷移を制御するマネージドBeanからなる。
マネージドBeanの作り方はPOJOに@ManaedBeanを付けるだけ。NetBeansでは右クリック→新規→JSF管理対象 Bean で作成できる。
マネージドBean内のpublicメソッドはコンポーネント内からEL式で使用することができる。

マネージドBeanの例↓
>|java|
// マネージドBeanであることを示すアノテーション
// eager=true はアプリケーション起動時にインスタンスを即時生成する設定。
@ManagedBean(eager=true)
/*
スコープ指定用のアノテーション。範囲が広い順にapplication、session、view、request、flash、noneがある。アノテーションが無い場合のデフォルトはrequest。
このうち、flushはアノテーションではなくJSFの暗黙オブジェクト:flushを使用して実現するスコープ。
noneはJSFページからアクセス不可で、他のマネージドBeanからアクセスできるスコープ。
*/
@ViewScoped
public class StartPageController{

	@EJB
	private BussinesssLogicEJB logicEJB;

	private Result result = new Result();

	// 任意の値を注入するアノテーション。ビューがレンダリングされる時に設定される。
	// ↓ではOtherクラスのotherDishを設定している。
	@ManagedProperty(value = "#{other.otherDish}")
	private Dish dish;

	// こういった文字列や数値の注入はfaces-config.xmlで設定できる。
	@ManagedProperty(value = "タイトル")
	private String title;
	

	// インスタンス生成時に実行したいメソッドに付けるアノテーション
	@PostContruct
	publi init(){
	}

	// インスタンス消滅時に実行したいメソッドに付けるアノテーション
	@PreDestroy
	public flush(){
	}

	public String doRegistBusiness(){
		result = logicEJB.doBusiness();

		/*
		  遷移先の画面を返している。拡張子は省略可。
		  nullを返すと現在のページをリロードする。
		  遷移先の設定はfaces-config.xmlでも可能。グローバルな遷移はfaces-config.xmlに設定するべき。faces-config.xmlではEL式を使った条件分岐も可能。
		*/
		return "endBusiness.xhtml";
	}

	public String (){

		/*
		 画面上で暗黙オブジェクトflashを使い、EL式 #{flash.flashKey} で"フラッシュ!"を取り出せる。
		*/
        Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
        flash.put("flashKey", "フラッシュ!");

        return "endBusiness";
    }


	public Result getResult(){

		// 画面にメッセージを表示するときはFacesContext.addmessage()を使う。
		// ctx.addMessage にDOM式を指定すると<h:form id="mainForm"><h:message for="title"/></h:form>タグで指定した場所にメッセージが表示される。
		// nullを指定するとグローバルメッセージとして<h:messages/>タグの場所に表示される。
		FacesContext ctx = FacesContext.getCurrentInstance();
		
		ctx.addMessage(
			"mainForm.title", // formのid:テキストフィールドのidのDOM式
			new FacesMessage(
				FacesMessage.SERVRTITY_INFO,
				"isbn number",
				"ISBNが表示されます。"
			
			)
		);
		return result;
	}
}