如何将字符串列表作为隐藏输入从jsf页面传递给请求范围的辅助bean

时间:2013-01-30 00:52:06

标签: string jsf

我想将一个字符串列表作为隐藏输入从jsf页面传递给辅助bean。

支持bean是请求作用域,需要它。

尝试这样做,但它似乎不起作用。任何想法如何以更好的方式做到这一点?

<ui:repeat value="#{bean.strings}" var="#{string}">
    <h:inputHidden value="#{string}"/>
</ui:repeat>

1 个答案:

答案 0 :(得分:3)

只需使用转换器作为列表值:

<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>