2013-08-23 25 views
0

创建了一个TagHandler并添加了一个facelet。 facelet内容仍未评估。该html代码包含ui:片段文本。面对包含jsf组件的组件内容未评估

@Override 
    public void encodeBegin(FacesContext context) throws IOException{ 
    ResponseWriter writer = context.getResponseWriter(); 
       content = benefits.getContent(type); 
    writer.write(content); 
} 

    <content type="short"> 
    <data><![CDATA[   
    <ui:fragment rendered="#{true}"> 
     <a id="" href="a.xhtml> 
    </ui:fragment> 
    <ui:fragment rendered="{false}"> 
     <a id="" href="b.xhtml"> 
    </ui:fragment> 
    <img src="a.png" alt="" /> 
    </a> ]]></data> 

    public class CardHolderBenefitsTagHandler extends TagHandler { 

private final TagAttribute src; 

public CardHolderBenefitsTagHandler(TagConfig config) { 
    super(config); 
    TagAttribute attr = null; 
    attr = this.getAttribute("src");    
    this.src = attr; 

} 

public void apply(FaceletContext ctx, UIComponent parent) 
     throws IOException { 
    String path = this.src.getValue(ctx); 

    VariableMapper orig = ctx.getVariableMapper(); 
    ctx.setVariableMapper(new VariableMapperWrapper(orig)); 
    try { 
     this.nextHandler.apply(ctx, null); 
     ctx.includeFacelet(parent, path); 
    } catch (IOException e) {   
     throw new TagAttributeException(this.tag, this.src, 
       "Invalid path : " + path); 
    } finally { 
     ctx.setVariableMapper(orig); 
    } 
} 
} 

回答

1

你正在做一个概念性的错误。 HTTP响应编写器是为了编写HTML代码而不是编写JSF代码。 webbrowser即只了解HTML,而不是JSF。所有常规的JSF组件和渲染器也只是将HTML代码写入响应写入器。在web浏览器中打开一个普通的JSF页面,然后点击右键,然后点击查看源代码。如果JSF完成了它的工作,你会发现它是一个和所有的HTML,完全没有任何JSF代码。

本质上,您需要创建Facelets标记处理程序而不是JSF UI组件,以便使用基于XML源的新JSF组件处理JSF组件树。

以下问题的答案包含Hello World标记处理程序。这必须让你开始:Custom Facelet component in JSF

+0

我们是否创建一个新的TagHandler并读取xml文件内容来评估内容? – user679526

+0

是的,这是正确的。考虑使用'FaceletContext#includeFacelet()'。另请参见'IncludeHandler'类的''的源代码。 – BalusC

+0

我改变了上述问题。添加了一个调用facelet的taghandler。这不能解决评估ui:片段代码的问题。 – user679526