JSF,writeAttribute(“value”,str,null)失败,并通过ValueExpression.getValue()获取字符串

时间:2009-10-03 05:28:30

标签: java jsf

我在自定义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会区分两个字符串?

其他信息:

  • 该组件扩展了UIComponentBase
  • 我正在使用facelets

1 个答案:

答案 0 :(得分:1)

HTML textarea元素没有“value”属性。实际上,元素的主体就是价值。你最终应该

<textarea name="j_id2:j_id12:j_id19">new string</textarea>

查看原始JSF TextAreaRenderer源代码以获取更多提示。