Java JSF,writeAttribute(";value";,str,null)使用通过ValueExpression.getValue()获得的字符串失败

Java JSF,writeAttribute(";value";,str,null)使用通过ValueExpression.getValue()获得的字符串失败,java,jsf,Java,Jsf,我在自定义JSF组件方面遇到了一些奇怪的问题 以下是我的渲染器代码: public class Test extends Renderer { public void encodeBegin(final FacesContext context, final UIComponent component) throws IOException { ResponseWriter writer = context.getRespon

我在自定义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>
生成的html是:

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

控制台输出为“Value1:测试,Value2:新字符串”

这是怎么回事?这没有道理。为什么writeAttribute会区分这两个字符串

其他信息:

  • 该组件扩展了UIComponentBase
  • 我将它与facelets一起使用
元素没有“value”属性。实际上,元素的主体就是值。你应该以

<textarea name="j_id2:j_id12:j_id19">new string</textarea>
新字符串

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

然后我们测试@ccomet是否可以在一个非常旧的源代码上工作。
<textarea name="j_id2:j_id12:j_id19">new string</textarea>