gpt4 book ai didi

html - 向 JSF 2.0 UIInput 组件添加自定义属性 (HTML5) 支持

转载 作者:技术小花猫 更新时间:2023-10-29 12:46:43 24 4
gpt4 key购买 nike

我正在尝试编写一个渲染器来处理 placeholder <h:inputText> 上的属性零件。阅读完JSF 2.0 strips out needed HTML5 attributes后,我走上了这条路这似乎是正确的。这是我的自定义渲染器

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属性,插入它,然后将处理委托(delegate)给super。我上面的代码不起作用,因为我在错误的地方插入了属性。必须插在writer.startElement('input')之后已执行。但是,startElement 必须发生在 super 的 encodeBegin() 中的某处。方法。那么如何插入自定义属性(在本例中为“占位符”)然后继续执行流程?

注意:上面的代码确实添加了一个 placeholder属性而不是我想要的输入组件,它将它写入输入的父级(因为我试图在组件本身实际写入流之前写入一个属性,它将属性应用于当前组件)

最佳答案

这是我的方式。我添加了占位符和数据主题属性。如果要添加更多属性,只需将其名称添加到属性数组即可。

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>

关于html - 向 JSF 2.0 UIInput 组件添加自定义属性 (HTML5) 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6859520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com