文字列のリストをjsfページからバッキングBeanに非表示の入力として渡したい。
バッキングBeanはリクエストスコープであり、それである必要があります。
このようにしようとしていますが、うまくいかないようです。これをより良い方法で行う方法について何かアイデアはありますか?
<ui:repeat value="#{bean.strings}" var="#{string}">
<h:inputHidden value="#{string}"/>
</ui:repeat>
リスト値のコンバーターを使用するだけです。
<h:inputHidden value="#{bean.strings}" converter="myStringListConverter" />
@@@をセパレータとして使用して String との間で変換を行うコンバータを次に示します。
@FacesConverter("myStringListConverter")
public class StringListConverter implements Converter {
// this is used as a regex, so choose other separator carefully
private static final String MY_SEPARATOR = "@@@";
@Override
public Object getAsObject(FacesContext context, UIComponent component,
String value) {
if (value == null) {
return new ArrayList<String>();
}
return new ArrayList<String>(Arrays.asList(value.split(MY_SEPARATOR)));
}
@Override
public String getAsString(FacesContext context, UIComponent component,
Object value) {
if (value == null) {
return "";
}
return join((List<String>) value, MY_SEPARATOR);
}
/**
* Joins a String list, src: http://stackoverflow.com/q/1751844/149872
*
* @param list
* @param conjunction
* @return
*/
public static String join(List<String> list, String conjunction) {
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String item : list) {
if (first) {
first = false;
} else {
sb.append(conjunction);
}
sb.append(item);
}
return sb.toString();
}
}
JSF 2 を使用している場合、これはそのままで機能するはずです。
JSF 1.2 を使用している場合は、@FacesConverter
アノテーションをドロップして、コンバーターを次のfaces-config.xml
ように登録するだけです。
<converter>
<description>Simple String List Converer</description>
<converter-id>myStringListConverter</converter-id>
<converter-class>com.your.package.StringListConverter</converter-class>
</converter>