我正在研究JSF 2.2的组件库,以便在也使用Twitter Bootstrap 3 CSS框架的应用程序中使用。由于Bootstrap 3在<div>
标签和其他容器的数量上可能有点冗长,你必须将表单和表单控件包装好以适应CSS样式,我正在创建自定义组件,可以使用单个标签。
到目前为止,我一直在努力扩展现有的JSF组件,并覆盖encodeBegin()
和encodeEnd()
方法,并添加必要的<div>
元素。 Bootstrap框架需要。我还在重写的方法中调用super.encodeBegin()
和super.encodeEnd()
来利用我正在增强的组件的现有渲染。除了我想通过<f:ajax>
标记的render
属性渲染我的一个自定义组件的情况之外,这一直运行良好。当我将自定义组件的ID指定为render
属性时,调试会显示调用整个组件的encodeBegin()
和encodeEnd()
方法,但只有实际的<input>
元素本身才是在页面上更新,而不是围绕它的所有标记。
这种行为很有意义,因为我在自定义标记上指定的id属性会传递给<input>
元素。如何为自定义组件指定单独的ID字段?我考虑过可能不应该通过调用HTMLInputText
和super.encodeBegin()
来扩展super.encodeEnd()
并利用它的渲染,但从逻辑上讲,我不想从头开始创建一个全新的组件,而只是增强现有的JSF。此外,我不想重新发明轮子以确保我支持所有<h:inputText>
的属性,因为我希望我的组件可以直接替换JSF组件。
我意识到复合组件可能更简单并且可能不会遇到此问题,但在渲染过程中,我需要访问FacesContext
来检查消息,因为我的自定义组件的渲染器将附加不同的Bootstrap类并且可能根据组件的验证状态插入整个新的<span>
元素。我不知道如何使用复合组件完成此操作(不从请求bean请求信息)。
我可以使用另一种方法来使用现有的JSF组件吗?