如何将值Custom Component传递给Managed Bean?

时间:2011-09-23 09:30:54

标签: jsf-2 custom-component

我创建了一个自定义组件。我为它添加了一个动态输入文本框(来自编码功能)。

组件正确呈现为HTML。

但是我想将文本框的值绑定到Managed Bean上的某个属性。所以其他一些开发人员可以在他的jsp上使用他的托管bean。

我想知道,我应该怎么做,以便在文本框中输入的值(我的组件动态创建)设置为某个Managed bean属性。

2 个答案:

答案 0 :(得分:3)

您需要确保自定义组件类扩展UIInput并且您在渲染器的encodeEnd()方法中将组件的客户端ID写为HTML输入的name属性元件。然后,您可以在渲染器的覆盖decode()方法中从请求参数映射中获取提交的值,并将组件的客户端ID作为参数名称,并将其设置为UIInput#setSubmittedValue()并让JSF执行剩余的转换,验证和更新模型值的工作。

@Override
public void decode(FacesContext context, UIComponent component) {
    // Do if necessary first validation on disabled="true" or readonly="true", if any.

    // Then just get the submitted value by client ID as name.
    String clientId = component.getClientId(context);
    String submittedValue = context.getExternalContext().getRequestParameterMap().get(clientId);
    ((UIInput) component).setSubmittedValue(submittedValue);
}

对具体问题

无关,您是否了解JSP的后续Facelets中新的复合组件支持?我的印象是,您不一定需要为此目的使用自定义组件。或者您是否真的限制使用旧版JSP作为视图技术,尽管您已经使用JSF 2.x?另请参阅When to use <ui:include>, tag files, composite components and/or custom components?

答案 1 :(得分:2)

嗯,问题解决了。

在encodeEnd()方法中,我将元素添加为

HtmlInputHidden hidden = new HtmlInputHidden();
hidden.setParent(this);
hidden.setId("someId");
ValueExpression ve = getValueExpression("value");
hidden.setValueExpression("value", ve);
hidden.encodeBegin(context);
hidden.encodeEnd(context);

这似乎有些问题。

然后我把它改成了......

HtmlInputHidden hidden = new HtmlInputHidden();
hidden.setId("someId");
ValueExpression ve = getValueExpression("value");
hidden.setValueExpression("value", ve);
this.getChildren().add(hidden);
hidden.encodeBegin(context);
hidden.encodeEnd(context);

使用this.getChildren()。add();解决了我的问题

P.S。显然,在添加元素之前,需要检查元素是否已经存在。