我正在尝试编写一个渲染器,该渲染器将处理组件placeholder上的属性<h:inputText>。在阅读了JSF2.0并去除了必需的HTML5属性之后,我走了这条路,这似乎是正确的。这是我的自定义渲染器
placeholder
<h:inputText>
public class InputRenderer extends com.sun.faces.renderkit.html_basic.TextRenderer{ @Override public void encodeBegin(FacesContext context, UIComponent component) throws IOException { System.out.println("Rendering :"+component.getClientId()); String placeholder = (String)component.getAttributes().get("placeholder"); if(placeholder != null) { ResponseWriter writer = context.getResponseWriter(); writer.writeAttribute("placeholder", placeholder, "placeholder"); } super.encodeBegin(context, component); } @Override public void decode(FacesContext context, UIComponent component) { super.decode(context, component); } @Override public void encodeEnd(FacesContext context, UIComponent component) throws IOException { super.encodeEnd(context, component); } }
并且此渲染器在faces config中注册为
<render-kit> <renderer> <component-family>javax.faces.Input</component-family> <renderer-type>javax.faces.Text</renderer-type> <renderer-class>com.example.renderer.InputRenderer</renderer-class> </renderer> </render-kit>
这被注册罚款,那里没有问题。
我的意图是处理该placeholder属性,将其插入,然后将处理委托给super。我上面的代码不起作用,因为我在错误的位置插入了属性。必须在writer.startElement('input')执行后将其插入。但是,startElement必须发生在super encodeBegin()方法中的某个地方。那么,如何插入自定义属性(在这种情况下为“占位符”),然后继续执行流程?
writer.startElement('input')
encodeBegin()
注意:上面的代码确实向placeholder我想要的输入组件添加了一个属性,但未添加属性,而是将其写入到Input的父级(因为我试图在将组件本身实际写入流中之前写一个属性,将该属性应用于当前组件)
这是我的方式。我添加了占位符和数据主题属性。如果要添加更多属性,则应仅将其名称添加到attribute数组。
import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import com.sun.faces.renderkit.html_basic.TextRenderer; public class InputRender extends TextRenderer { @Override protected void getEndTextToRender(FacesContext context, UIComponent component, String currentValue) throws java.io.IOException{ String [] attributes = {"placeholder","data-theme"}; ResponseWriter writer = context.getResponseWriter(); for(String attribute : attributes) { String value = (String)component.getAttributes().get(attribute); if(value != null) { writer.writeAttribute(attribute, value, attribute); } } super.getEndTextToRender(context, component, currentValue); } }
您应该将此添加到faces-config.xml文件。
<render-kit> <renderer> <component-family>javax.faces.Input</component-family> <renderer-type>javax.faces.Text</renderer-type> <renderer-class>your.package.InputRenderer</renderer-class> </renderer> </render-kit>