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>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/06 03:13