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; } }