在JSF消息中嵌入链接(或其他html)

前端之家收集整理的这篇文章主要介绍了在JSF消息中嵌入链接(或其他html)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在JSF消息中嵌入一个链接,这是可能吗?

当我尝试它,h:messages标签的呈现的html转义html字符.我尝试将h:messages标签的escape属性设置为false,但这没有帮助.

解决方法

不幸的是,这在标准的JSF实现中是不可能的.组件和渲染器不正式支持属性.然而,您可以设置处理此操作的渲染器.

既然这是一个很常见的要求/愿望,我想看看什么是可能的.

首先一些背景信息:JSF默认使用ResponseWriter#writeText()标签体,默认情况下转义HTML.我们想让它使用ResponseWriter#write(),就像< h:outputText escape =“false”/&gt ;.我们想扩展标准JSF实现的MessagesRenderer并相应地覆盖encodeEnd()方法.但是由于MessagesRenderer#encodeEnd()包含了很多代码(〜180行),我们更希望不要使用copypaste来改变一行或两行,所以我发现更好地将ResponseWriter替换为自定义实现ResponseWriterWrapper其中writeText()被覆盖以处理转义.

所以我结束了这个:

  1. package com.example;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.faces.component.UIComponent;
  6. import javax.faces.context.FacesContext;
  7. import javax.faces.context.ResponseWriter;
  8. import javax.faces.context.ResponseWriterWrapper;
  9. import javax.faces.render.FacesRenderer;
  10.  
  11. import com.sun.faces.renderkit.html_basic.MessagesRenderer;
  12.  
  13. @FacesRenderer(componentFamily="javax.faces.Messages",rendererType="javax.faces.Messages")
  14. public class EscapableMessagesRenderer extends MessagesRenderer {
  15.  
  16. @Override
  17. public void encodeEnd(FacesContext context,UIComponent component) throws IOException {
  18. final ResponseWriter originalResponseWriter = context.getResponseWriter();
  19.  
  20. try {
  21. context.setResponseWriter(new ResponseWriterWrapper() {
  22.  
  23. @Override
  24. public ResponseWriter getWrapped() {
  25. return originalResponseWriter;
  26. }
  27.  
  28. @Override
  29. public void writeText(Object text,UIComponent component,String property) throws IOException {
  30. String string = String.valueOf(text);
  31. String escape = (String) component.getAttributes().get("escape");
  32. if (escape != null && !Boolean.valueOf(escape)) {
  33. super.write(string);
  34. } else {
  35. super.writeText(string,component,property);
  36. }
  37. }
  38. });
  39.  
  40. super.encodeEnd(context,component); // Now,render it!
  41. } finally {
  42. context.setResponseWriter(originalResponseWriter); // Restore original writer.
  43. }
  44. }
  45. }

尽管@FacesRenderer注释,它会被默认的MessagesRenderer实现覆盖.我怀疑这里有一个bug,所以我报了issue 1748.要让它工作,我们必须回到faces-config.xml:

  1. <render-kit>
  2. <renderer>
  3. <component-family>javax.faces.Messages</component-family>
  4. <renderer-type>javax.faces.Messages</renderer-type>
  5. <renderer-class>com.example.EscapableMessagesRenderer</renderer-class>
  6. </renderer>
  7. </render-kit>

然后,要触发它,只要做:

  1. <h:messages escape="false" />

它的工作原理:)

注意:以上影响< h:messages>只要.为了对< h:message>做同样的操作,只需执行相同的操作即可通过“消息”(组件系列,渲染器类型和类名称)替换“消息”.

猜你在找的HTML相关文章