我在自定义JSF组件方面遇到了一些奇怪的问题。
这是我的渲染器代码:
public class Test extends Renderer {
public void encodeBegin(final FacesContext context,
final UIComponent component) throws IOException {
ResponseWriter writer = context.getResponseWriter();
writer.startElement("textarea", component);
String clientId = component.getClientId(context);
if (clientId != null)
writer.writeAttribute("name", clientId, null);
ValueExpression exp = component.getValueExpression("value");
if (exp != null && exp.getValue(context.getELContext()) != null) {
String val = (String) exp.getValue(context.getELContext());
System.out.println("Value: " + val);
writer.writeAttribute("value", val, null);
}
writer.endElement("textarea");
writer.flush();
}
}
代码生成:
<textarea name="j_id2:j_id12:j_id19" value=""></textarea>
属性绑定包含“test”,应该是“Value:test”已成功打印到控制台。
现在,如果我将代码更改为:
public void encodeBegin(final FacesContext context,
final UIComponent component) throws IOException {
ResponseWriter writer = context.getResponseWriter();
writer.startElement("textarea", component);
String clientId = component.getClientId(context);
if (clientId != null)
writer.writeAttribute("name", clientId, null);
ValueExpression exp = component.getValueExpression("value");
if (exp != null && exp.getValue(context.getELContext()) != null) {
String val = (String) exp.getValue(context.getELContext());
String str = "new string";
System.out.println("Value1: " + val + ", Value2: " + str);
writer.writeAttribute("value", str, null);
}
writer.endElement("textarea");
writer.flush();
}
生成的html是:
<textarea name="j_id2:j_id12:j_id19" value="new string"></textarea>
和控制台输出是“Value1:test,Value2:new string”
这里发生了什么?这没有意义。为什么writeAttribute会区分两个字符串?
其他信息:
答案 0 :(得分:1)
HTML textarea元素没有“value”属性。实际上,元素的主体就是价值。你最终应该
<textarea name="j_id2:j_id12:j_id19">new string</textarea>
查看原始JSF TextAreaRenderer源代码以获取更多提示。