我同意为user423943创建一个组件的想法。但是,我会扩展<h:outputText>
。就你而言,你不会有很多工作要做。首先,创建一个my.taglib.xml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "facelet-taglib_1_0.dtd">
<facelet-taglib>
<namespace>http://my.components/jsf</namespace>
<tag>
<tag-name>myComponent</tag-name>
<component>
<component-type>my.component.myComponent</component-type>
<renderer-type>my.renderkit.myComponent</renderer-type>
</component>
</tag>
</facelet-taglib>
此文件只需要存在于应用程序的类路径,它会自动被Facelets的(因为它与.taglib.xml
结束)加载。
然后,在faces-config.xml
定义了Java类此组件:
<component>
<component-type>my.component.myComponent</component-type>
<component-class>my.package.component.MyHtmlComponent</component-class>
</component>
<render-kit>
<render-kit-id>HTML_BASIC</render-kit-id>
<renderer>
<component-family>javax.faces.Output</component-family>
<renderer-type>my.renderkit.myComponent</renderer-type>
<renderer-class>my.package.component.MyHtmlComponentRenderer</renderer-class>
</renderer>
然后,你必须创建两个类:
my.package.component.MyHtmlComponent
,将延长javax.faces.component.html.HtmlInputText
,什么也不做更多。
my.package.component.MyHtmlComponentRenderer
这将扩展com.sun.faces.renderkit.html_basic.TextRenderer
类。
您的渲染器类将完成所有工作,为您的组件的值生成HTML代码,与<h:outputText>
完全相同。你可以看看HtmlBasicRenderer.encodeEnd(FacesContext, UIComponent)
和TextRenderer.getEndTextToRender(FacesContext, UIComponent, String)
的方法,这个部分涉及到。 当然,当您在文本中面临{niceImage}
代码时,您只需生成一个HTML img
标记。对于这一点,你可以使用ResponseWriter
的适当方法,以建立一个HTML标签和属性:
writer.startElement("img", component);
writer.writeAttribute("src", urlToImage);
writer.endElement("img");
一旦一切都创建,你必须使用你的新组件在JSF页面:
<html xmlns:my="http://my.components/jsf">
...
<my:myComponent value="#{myBean.dynamicHTMLContent}" escape="false"/>
...
两个链接,可以帮助您除了通过user423943提供者:
http://www.jsftutorials.net/helpDesk/standardRenderKit_component-class_renderer-slass.html
http://www.jsftutorials.net/helpDesk/standardRenderKit_component-type_renderer-type.html
对于所有HTML JSF组件,您将找到它们的类型和类。
我在想创建一个自定义的JSF组件,但JSF内部的工作量不能被简单的工作的组件来真的是有道理的应该做。这是一样的 ,但一个动态的。所以我决定创建一个临时文件并使用 将它包含到facelet中。 –
theorm
2010-09-14 06:43:51
我同意创建组件是最好的解决方案(可能不是通过扩展'MediaOutput')。看到我的答案。 – romaintaz 2010-09-14 07:24:31