在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()被覆盖以处理转义.

所以我结束了这个:

package com.example;

import java.io.IOException;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.context.ResponseWriterWrapper;
import javax.faces.render.FacesRenderer;

import com.sun.faces.renderkit.html_basic.MessagesRenderer;

@FacesRenderer(componentFamily="javax.faces.Messages",rendererType="javax.faces.Messages")
public class EscapableMessagesRenderer extends MessagesRenderer {

    @Override
    public void encodeEnd(FacesContext context,UIComponent component) throws IOException {
        final ResponseWriter originalResponseWriter = context.getResponseWriter();

        try {
            context.setResponseWriter(new ResponseWriterWrapper() {

                @Override
                public ResponseWriter getWrapped() {
                    return originalResponseWriter;
                }

                @Override
                public void writeText(Object text,UIComponent component,String property) throws IOException {
                    String string = String.valueOf(text);
                    String escape = (String) component.getAttributes().get("escape");
                    if (escape != null && !Boolean.valueOf(escape)) {
                        super.write(string);
                    } else {
                        super.writeText(string,component,property);
                    }
                }
            });

            super.encodeEnd(context,component); // Now,render it!
        } finally {
            context.setResponseWriter(originalResponseWriter); // Restore original writer.
        }
    }
}

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

<render-kit>
    <renderer>
        <component-family>javax.faces.Messages</component-family>
        <renderer-type>javax.faces.Messages</renderer-type>
        <renderer-class>com.example.EscapableMessagesRenderer</renderer-class>
    </renderer>
</render-kit>

然后,要触发它,只要做

<h:messages escape="false" />

它的工作原理:)

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

相关文章

vue阻止冒泡事件 阻止点击事件的执行 &lt;div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些