我创建了一个自定义组件。我为它添加了一个动态输入文本框(来自编码功能)。
组件正确呈现为HTML。
但是我想将文本框的值绑定到Managed Bean上的某个属性。所以其他一些开发人员可以在他的jsp上使用他的托管bean。
我想知道,我应该怎么做,以便在文本框中输入的值(我的组件动态创建)设置为某个Managed bean属性。
答案 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。显然,在添加元素之前,需要检查元素是否已经存在。