あなたの答えは明確ではありませんが、答えは間違いなくYESです。JSF にはジェネリックを使用できます。
ただし、それはジェネリックをどれだけ賢く使用しているか、そして最終的にはジェネリックをまったく理解しているかどうかにかかっています。
あなたの例からわかる限り、実装されたクラスに含まれるオブジェクトへのラッパーとしてジェネリック インターフェイスを使用します。
ゲッター/セッターがラップされたクラスを使用する
このアプローチでは、MyInterface
実装を直接処理するのではなく、インターフェイス メソッドで定義されているように、その内容を処理します。
基本インターフェース:
public interface MyInterface<T> {
void setMyValue(T value);
T getMyValue();
}
実装クラス:
public class MyString implements MyInterface<String> {
private String myValue;
public MyString(String myValue) {
this.myValue = myValue;
}
public void setMyValue(String value) {
this.myValue = value;
}
public String getMyValue() {
return myValue;
}
@Override
public String toString() {
return myValue;
}
}
と
public class MyInteger implements MyInterface<Integer> {
private Integer myValue;
public MyInteger(Integer myValue) {
this.myValue = myValue;
}
public void setMyValue(Integer value) {
this.myValue = value;
}
public Integer getMyValue() {
return myValue;
}
@Override
public String toString() {
return Integer.toString(myValue);
}
}
マネージド Bean (無名クラスを使用):
@ManagedBean
@RequestScoped
public class MyInterfaceBean {
private MyString myString;
private MyInteger myInteger;
private MyInterface<Float> myFloat;
public MyInterfaceBean() {
myString = new MyString("String");
myInteger = new MyInteger(1);
myFloat = new MyInterface<Float>() {
private Float myValue;
public void setMyValue(Float value) {
this.myValue = value;
}
public Float getMyValue() {
return myValue;
}
@Override
public String toString() {
return Float.toString(myValue);
}
};
myFloat.setMyValue(3.1f);
}
public String getMyString() {
return myString.getMyValue();
}
public void setMyString(String myString) {
this.myString.setMyValue(myString);
}
public Integer getMyInteger() {
return myInteger.getMyValue();
}
public void setMyInteger(Integer myInteger) {
this.myInteger.setMyValue(myInteger);
}
public Float getMyFloat() {
return myFloat.getMyValue();
}
public void setMyFloat(Float myFloat) {
this.myFloat.setMyValue(myFloat);
}
public String action() {
return null;
}
}
景色:
<h:outputText value="String: #{myInterfaceBean.myString}"/>
<br/>
<h:outputText value="Integer: #{myInterfaceBean.myInteger}"/>
<br/>
<h:outputText value="Float: #{myInterfaceBean.myFloat}"/>
<br/>
<h:form>
<h:outputText value="String: "/><h:inputText value="#{myInterfaceBean.myString}"/>
<br/>
<h:outputText value="Integer: "/><h:inputText value="#{myInterfaceBean.myInteger}"/>
<br/>
<h:outputText value="Float: "/><h:inputText value="#{myInterfaceBean.myFloat}"/>
<br/>
<h:commandButton value="Submit" action="#{myInterfaceBean.action}"/>
</h:form>
@FacesConverterでクラスを使用する
もう 1 つの方法は、 を使用し@FacesConverter
て、JSF が入力フィールドの文字列を を実装するオブジェクトに変換する方法を認識できるようにすることMyInterface
です。
マネージド Bean (無名クラスを使用):
@ManagedBean
@RequestScoped
public class MyInterfaceBean {
private MyString myString;
private MyInteger myInteger;
private MyInterface<Float> myFloat;
public MyInterfaceBean() {
myString = new MyString("String");
myInteger = new MyInteger(1);
myFloat = new MyInterface<Float>() {
private Float myValue;
public void setMyValue(Float value) {
this.myValue = value;
}
public Float getMyValue() {
return myValue;
}
@Override
public String toString() {
return Float.toString(myValue);
}
};
myFloat.setMyValue(3.1f);
}
public MyString getMyString() {
return myString;
}
public void setMyString(MyString myString) {
this.myString = myString;
}
public MyInteger getMyInteger() {
return myInteger;
}
public void setMyInteger(MyInteger myInteger) {
this.myInteger = myInteger;
}
public MyInterface<Float> getMyFloat() {
return myFloat;
}
public void setMyFloat(MyInterface<Float> myFloat) {
this.myFloat.setMyValue(myFloat.getMyValue());//not to lose this anonymous class, can substitute for other implementation directly
}
public String action() {
return null;
}
}
コンバーター:
@FacesConverter(value = "myStringConverter")
public class MyStringConverter implements Converter {
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if(value == null || value.equals("")) {
return null;
}
MyString obj = new MyString(value);
return obj;
}
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (!(value instanceof MyString) || (value == null)) {
return null;
}
return ((MyString)value).getMyValue();
}
}
と
@FacesConverter(value = "myIntegerConverter")
public class MyIntegerConverter implements Converter {
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if(value == null || value.equals("")) {
return null;
}
MyInteger obj = null;
try {
Integer integer = Integer.valueOf(value);
obj = new MyInteger(integer);
} catch(NumberFormatException nfe) {
throw new ConverterException(new FacesMessage("Integer could not be parsed from string: " + value));
}
return obj;
}
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (!(value instanceof MyInteger) || (value == null)) {
return null;
}
return ((MyInteger)value).getMyValue().toString();
}
}
と
@FacesConverter(value = "myFloatConverter")
public class MyFloatConverter implements Converter {
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if(value == null || value.equals("")) {
return null;
}
MyInterface<Float> obj = null;
try {
Float floatValue = Float.valueOf(value);
obj = new MyInterface<Float>() {
private Float myValue;
public void setMyValue(Float value) {
this.myValue = value;
}
public Float getMyValue() {
return myValue;
}
@Override
public String toString() {
return Float.toString(myValue);
}
};
obj.setMyValue(floatValue);
} catch(NumberFormatException nfe) {
throw new ConverterException(new FacesMessage("Float could not be parsed from string: " + value));
}
return obj;
}
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (!(value instanceof MyInterface) || (value == null)) {
if(!(((MyInterface)value).getMyValue() instanceof Float)) {
return null;
}
}
return ((MyInterface)value).getMyValue().toString();
}
}
景色:
<h:outputText value="String: #{myInterfaceBean.myString}"/>
<br/>
<h:outputText value="Integer: #{myInterfaceBean.myInteger}"/>
<br/>
<h:outputText value="Float: #{myInterfaceBean.myFloat}"/>
<br/>
<h:form>
<h:outputText value="String: "/><h:inputText value="#{myInterfaceBean.myString}" converter="myStringConverter"/>
<br/>
<h:outputText value="Integer: "/><h:inputText value="#{myInterfaceBean.myInteger}" converter="myIntegerConverter"/>
<br/>
<h:outputText value="Float: "/><h:inputText value="#{myInterfaceBean.myFloat}" converter="myFloatConverter"/>
<br/>
<h:commandButton value="Submit" action="#{myInterfaceBean.action}"/>
</h:form>