InplaceSelect for Objects not Strings

时间:2011-10-25 21:05:47

标签: java jsf richfaces

表格

 <h:inputText value="#{BackingBean.firstString}" />
 <h:inputText value="#{BackingBean.secondString}" />
 <rich:inplaceSelect value="#{BackingBean.myText}" defaultLabel="select">
  <f:selectItems value="#{???}" />
 </rich:inplaceSelect>

BackingBean

private List<MyText> myText;
private String firstString;
private String secondString;

MYTEXT

private String id
private String desc
private String text

我想在inplaceSelect中从列表中选择一个MyText我只想显示MyText的一个字段。什么是实现它的最佳方法?

3 个答案:

答案 0 :(得分:1)

首先,您需要ConverterMyTextString之间进行转换。根据您的问题历史记录,我了解您正在使用JSF 1.2,因此我将提供针对JSF 1.2的目标答案。

Converter应该基本看起来像这样(这只是一个例子,请阅读评论你应该如何实现它):

public class MyTextConverter implements Converter {

    public String getAsString(FacesContext context, UIComponent component, Object value) {
        // Write code here to convert MyText to its unique String representation.
        return String.valueOf(((MyText) value).getId());
    }

    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        // Write code here to convert unique String representation of MyText to MyText object.
        return myTextService.find(Long.valueOf(value));
    }

}

faces-config.xml

中注册如下
<converter>
    <converter-for-class>com.example.model.MyText</converter-for-class>
    <converter-class>com.example.converter.MyTextConverter</converter-class>
</converter>

然后您可以按如下方式使用输入:

<rich:inplaceSelect value="#{bean.myText}" defaultLabel="select">
    <f:selectItems value="#{bean.myTextItems}" />
</rich:inplaceSelect>

private MyText myText;
private List<SelectItem> myTextItems;

@PostConstruct
public void init() {
    myTextItems = new ArrayList<SelectItem>();

    for (MyText myText : myTextService.list()) {
        myTextItems.add(new SelectItem(myText, myText.getText()));
    }
}

// ...

答案 1 :(得分:0)

在你的支持bean中,因为你有<rich:inplaceSelect value="#{backingBean.myText}",所以改变

private List<MyText> myText;

private MyText myText;

并在backing-bean中添加SelectItem的列表:

private List<SelectItem> selItems;

然后您可以在构造函数中使用SelectItem填充该列表,也可以使用(@PostConstruct)填充方法。

您可以使用构造函数SelectItem(Object value, String label)

selItems.add(new SelectItem(myTextObj, myTextObj.text)); //or id or desc instead of text
//...

然后在视图中:

<f:selectItems value="#{backingBean.selItems}" />

答案 2 :(得分:0)

<f:selectItems
    value="#{BackingBean.myTextID}"
    var="value"
    itemLabel="#{value.desc}"
    itemValue="#{item.id}"
    />

或您需要作为项目标签/值的任何属性。需要JSF 2。