Я согласен с 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>
Этот файл просто должен присутствовать в classpath вашего приложения, и он будет автоматически загружаться 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"/>
...
<Ч />
Две ссылки, которые могут помочь вам в дополнение к тем, которые предоставлены пользователем423943:
http://www.jsftutorials.net/helpDesk/standardRenderKit_component-class_renderer-slass.html
http://www.jsftutorials.net/helpDesk/standardRenderKit_component-type_renderer-type.html
Для всех компонентов HTML JSF вы найдете их типы и классы.