JSF сообщения: добавление ссылки - PullRequest
3 голосов
/ 05 мая 2009

В настоящее время в JSF весь HTML-код, содержащийся в сообщении (тег rich:messages), экранируется и отображается как разметка. Например, в моем бобе поддержки:

createMessage("Title created successfully with product number: <a href=\"http://www.example.com\">" + product.getProductNumber() + "</a>.");

где createMessage() - это просто вспомогательная функция, которая добавляет новое сообщение в контекст лиц и затем отображается в моем теге rich:messages.

Когда это сообщение создано, мое сообщение просто отображается с экранированным HTML:

Title created successfully with product number: <a href="http://www.example.com">1234</a>.

Есть ли способ избежать этого и вместо этого просто указать фактическую ссылку в сообщении?

Заранее спасибо

~ Zack

Ответы [ 3 ]

3 голосов
/ 06 мая 2009

Быстрое решение - создать новый рендер.

Я сделал это для h: messages , поскольку я хотел разделить сообщения разной степени важности на отдельные элементы div Если вы никогда не хотите использовать рендерер по умолчанию, тогда это хороший вариант.

Стандартный класс, который вы бы перезаписали / расширили:

public class MessagesRenderer extends HtmlBasicRenderer

Вы бы просто использовали ResponseWriter, который не экранирует текст. Конкретным классом является HtmlResponseWriter, который экранирует текст. Вы можете расширить это и переписать

public void writeText(Object text, String componentPropertyName)

чтобы он не использовал HtmlUtils.

Затем просто добавьте ваш новый рендерер в face-config.xml

<render-kit>
    <renderer>
        <component-family>javax.faces.Messages</component-family>
        <renderer-type>javax.faces.Messages</renderer-type>
        <renderer-class>com.mypackage.MessagesRenderer</renderer-class>
    </renderer>
</render-kit>
2 голосов
/ 06 мая 2009

Похоже, вам нужно создать собственную версию rich:messages с атрибутом escape, например h:outputText, чтобы вы могли отключить экранирование HTML.

0 голосов
/ 11 ноября 2009

Если вы используете jquery, вы можете удалить символы xml:

<script type="text/javascript">
         //<![CDATA[
        $(document).ready(function() {
            $(".esc").each(function(i) {
                var h = $(this).html();                
                h = h.replace(/&lt;/gi, "<");
                h = h.replace(/&gt;/gi, ">");
                $(this).html(h);
            });
        });
        //]]> 
     </script>
...