「カスタム軽量」JSFコンポーネントバインディングを実行しようとしています。私のBean(一部のJSFページを制御する)では、HahsMapを宣言しています。ここで、h:inputText
ID(ページに表示される)にまたがるキーがこれらのIDをカスタムHInputText<T>
オブジェクトにマップします(T
以下の例ではLongです)。次に、HInputText<T>
オブジェクトを使用して、対応するh:inputText属性のサブセットを保持しています。value
タイプは、、、などであると想定されていT
ますrendered
。required
この方向では、HInputText<T>
オブジェクトのフィールドがh:inputText
属性に値を与えます。
私の問題は、このようなh:inputText
内部を使用するh:form
と、JSF検証が行われないことです。(Long値を保持すると想定される)英数字を入力できh:inputText
、フォームはエラーを表示せずに送信されます。属性は正しく管理されていることrequired
に注意してください( trueに設定されているため、フィールドを空のままにするとエラーが発生します)。また、英数字を使用してページのの値を表示しようとすると、表示されます。rendered
required
h:inputText
h:inputText
h:outputText
それぞれにカスタムバリデーターを明示的に定義することなく、JSF検証を機能させるためのトリックはありますh:inputText
か?
HInputText.class:
public class HInputText<T>
{
private String id;
private boolean rendered;
private boolean required;
private T value;
private Class<T> myClass;
// getters and setters for all fields
public HInputText(Class<T> myClass, String id)
{
this.myClass = myClass;
this.id = id;
this.rendered = true;
this.required = true;
}
}
マネージドBeanのコードスニペット:
@ManagedBean(name="saisieController")
@SessionScoped
public class SaisieController
{
...
private HashMap<String,HInputText<Long>> htagLongInputTexts;
public HashMap<String, HInputText<Long>> getHtagLongInputTexts()
{
return htagLongInputTexts;
}
public void setHtagLongInputTexts(HashMap<String, HInputText<Long>> hLongInputTexts)
{
this.htagLongInputTexts = hLongInputTexts;
}
public void addHtagLongInputText(HInputText<Long> hLongInputText)
{
getHtagLongInputTexts().put(hLongInputText.getId(), hLongInputText);
}
public HInputText<Long> getHtagLongInputText(String hLongInputTextId)
{
return(getHtagLongInputTexts().get(hLongInputTextId));
}
@PostConstruct
public void init()
{
setHtagLongInputTexts(new HashMap<String, HInputText<Long>>());
addHtagLongInputText(new HInputText<Long>(Long.class, "HIT_LongTestHIT"));
}
public String doNothing()
{
return null;
}
}
そして最後に私のjsfページからのスニペット:
<h:form>
<h:inputText
id = "HIT_LongTestHIT"
value = "#{saisieController.htagLongInputTexts['HIT_LongTestHIT'].value}"
rendered = "#{saisieController.htagLongInputTexts['HIT_LongTestHIT'].rendered}"
required = "#{saisieController.htagLongInputTexts['HIT_LongTestHIT'].required}"
/>
<h:message for = "HIT_LongTestHIT" styleClass = "error-text" />
<h:commandButton value = "submit" action = "#{saisieController.doNothing()}" />
<h:outputText value = "#{saisieController.htagLongInputTexts['HIT_LongTestHIT'].value}" />
</h:form>