質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JSF

JSF (JavaServer Faces)とは、JavaベースのWebアプリケーションフレームワークの一つです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

XHTML

XHTMLは、eXtensible HyperText Markup Languageの略であり、SGMLベースであるHTMLとは違って、有効なXMLドキュメントにもなるHTMLアプリケーションです。XMLベースのツールを用いて生成されるHTMLページのためによく使われるマークアップ言語です。

Q&A

解決済

1回答

4886閲覧

JSFカスタムコンポーネントを複数宣言して、それぞれをManagedBeanとデータ連携したい

mno

総合スコア35

JSF

JSF (JavaServer Faces)とは、JavaベースのWebアプリケーションフレームワークの一つです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

XHTML

XHTMLは、eXtensible HyperText Markup Languageの略であり、SGMLベースであるHTMLとは違って、有効なXMLドキュメントにもなるHTMLアプリケーションです。XMLベースのツールを用いて生成されるHTMLページのためによく使われるマークアップ言語です。

0グッド

0クリップ

投稿2016/10/03 15:46

JSF2.2で、カスタムコンポーネントを実装しています。
年月日をそれぞれプルダウンリストで表示/入力させ、エラーチェックを行います。
プルダウンリストの先頭にブランク行を入れる/入れないを、カスタムタグの
プロパティで指定します。
以下のような構成で実装しました。
(説明のため一部抜粋のみです)


postAddToViewイベントを使用して、ManagedBeanとプロパティを共有します。
また、postValidateイベントで、ManagedBean側でバリデーションを行います。

この構成の場合、カスタムタグが1行(個別画面.xhtmlのdateFromのみ)の場合、
正常にプロパティの共有とバリデーションが行なえます。

しかし、カスタムタグが2行(dateFromとdateTo)の場合、上記イベントが
1回ずつしか発生せず、dateTo側の処理が正常に行われません。


これの解決策として、個別画面側に、f:eventを複数回直接書いてやる方法があります。
しかし、これではカスタムタグの意味があまりありません。

どなたか、よい解決策などありませんでしょうか?

dateSelect.xhtml (カスタムコンポーネントのビュー実体)

xml

1<?xml version='1.0' encoding='UTF-8' ?> 2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3<html xmlns="http://www.w3.org/1999/xhtml" 4 xmlns:h="http://java.sun.com/jsf/html" 5 xmlns:c="http://java.sun.com/jsp/jstl/core"> 6 7<f:event listener="#{dateMBean.valid}" type="postValidate" /> 8<f:event listener="#{dateMBean.postAddToView}" type="postAddToView" /> 9<c:set target="#{dateMBean}" property="idvalue" value="#{id}" /> 10 11<h:selectOneMenu id="#{id}_year" value="#{dateMBean.year}"> 12 <f:selectItems 13 value="#{dateMBean.optionYear}"/> 14</h:selectOneMenu> 15<h:outputLabel id="#{id}_enableValidate" value="#{dateMBean.enableValidate}" style="display:none;" /> 16<h:outputLabel id="#{id}_blank" value="#{blank}" style="display:none;" /> 17</html> 18

カスタムコンポーネント用のManagedBean

java

1@ManagedBean 2@Named 3@ViewScoped 4@Getter 5@Setter 6public class DateMBean { 7 8 private String idvalue; 9 private String label; 10 private Boolean blankOption; 11 private Date value; 12 private Boolean enableValidate; 13 private String year; 14 15 @PostConstruct 16 public void init() { 17 property = ""; 18 value = null; 19 20 } 21 22 public void valid(ComponentSystemEvent e) { 23 // バリデータ 24 } 25 26 public void postAddToView(ComponentSystemEvent e) { 27 UIComponent component = e.getComponent(); 28 String id = getId(); 29 HtmlOutputLabel blankData = (HtmlOutputLabel)component.findComponent(id + "_blank"); 30 String blankVal = (String)blankData.getValue(); 31 if(!StringUtil.isNullOrEmpty(blankVal)) { 32 blankVal = blankVal.toUpperCase(); 33 if("ON".equals(blankVal)) { 34 blankOption = true; 35 }else{ 36 blankOption = false; 37 } 38 } 39 } 40 41 public List<String> getOptionYear() { 42 List<String> result = new ArrayList<String>(); 43 // 配列を返す 44 return result; 45 } 46}

個別画面.xhtml(カスタムタグを記載します)

xml

1<h:form rendered="false"> 2<h:commandButton action="#{inputMBean.move}" value="処理"></h:commandButton> 3 <htmlx:dateselect id="dateFrom" dateMBean="#{inputMBean.datebean}" blank="on" /> 4 <htmlx:dateselect id="dateTo" dateMBean="#{inputMBean.datebean2}" blank="on" /> 5</h:form>

その他、web.xmlにtaglib.xmlの記載を追記、taglib.xmlにdateSelect.xmlの記載を追記しています。


解決案 個別画面.xhtml(カスタムタグを記載します)

xml

1<h:form rendered="false"> 2<h:commandButton action="#{inputMBean.move}" value="処理"></h:commandButton> 3 4<f:event listener="#{inputMBean.datebean.postAddToView}" type="postAddToView"><c:set target="#{inputMBean.datebean}" property="idvalue" value="#{id}" /></f:event> 5<f:event listener="#{inputMBean.datebean2.postAddToView}" type="postAddToView"><c:set target="#{inputMBean.datebean2}" property="idvalue" value="#{id}" /></f:event> 6 7 <htmlx:dateselect id="dateFrom" dateMBean="#{inputMBean.datebean}" blank="on" /> 8 <htmlx:dateselect id="dateTo" dateMBean="#{inputMBean.datebean2}" blank="on" /> 9</h:form>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

カスタムタグを作ったことを有りませんので確信は無いのですが、恐らく特定のBeanとマップさせるのは無理ではないかと思います。Beanがないと動かないタグとなりますよね?

対案としては共有ページとして作成し、ui:includeタグを使って読み込む方法ではどうでしょうか。

また、手前みそになりますが別ページをダイアログとして表示させて入力値を引き継ぐ方法です。
JSF PrimeFaces Dialogの入力結果をFormに反映する

ご参考までに。

投稿2016/10/04 07:45

BlueMoon

総合スコア1339

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mno

2016/10/06 03:13

ありがとうございます。 ご提案いただいた方法を試してもうまく動かなかったのですが、 解決案 個別画面.xhtmlで良いことになったためクローズします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問