Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将JSF自定义组件的提交值传递给托管bean?_Jsf_Custom Component - Fatal编程技术网

如何将JSF自定义组件的提交值传递给托管bean?

如何将JSF自定义组件的提交值传递给托管bean?,jsf,custom-component,Jsf,Custom Component,我已经创建了一个自定义组件。我向它添加了一个动态输入文本框(来自encode函数) 组件被正确地呈现为HTML 但是我想将文本框的值绑定到托管Bean上的某个属性。因此,其他一些开发人员可以将jsp上的组件与托管bean一起使用 我想知道,我应该怎么做,以便在文本框中输入的值(我的组件动态创建)设置为某个托管bean属性。您需要确保您的自定义组件类扩展,并且您使用的方法是渲染器将组件的客户端ID作为HTML输入元素的name属性写入。然后,在渲染器的重写方法中,您只需从请求参数映射中获取提交的值

我已经创建了一个自定义组件。我向它添加了一个动态输入文本框(来自encode函数)

组件被正确地呈现为HTML

但是我想将文本框的值绑定到托管Bean上的某个属性。因此,其他一些开发人员可以将jsp上的组件与托管bean一起使用


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

您需要确保您的自定义组件类扩展,并且您使用的方法是渲染器将组件的客户端ID作为HTML输入元素的
name
属性写入。然后,在渲染器的重写方法中,您只需从请求参数映射中获取提交的值,并将组件的客户机ID设置为参数名,然后让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中新的复合组件支持吗?我的印象是,您不一定需要为此目的定制组件。或者,尽管您已经使用JSF2.x,但您真的只限于使用传统的JSP作为视图技术吗?另请参见

好了,问题解决了

在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();解决了我的问题


注意:显然,在添加元素之前,需要检查元素是否已经存在。

非常感谢,但我已经编写了上述代码。我甚至检查了上面代码的'submittedValue'变量,它是用户输入的变量。但它仍然没有到达托管Bean。您能帮助我使用encode方法中所需的代码将动态控件与一些托管bean属性绑定吗?用户将自定义组件的一些“selectedValue”属性值作为selectedValue=“#{TestBean.testProperty}”提供。现在,用户在动态文本框中输入的值应设置为“testPoperty”。