微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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>做同样的操作,只需执行相同的操作即可通过“消息”(组件系列,渲染器类型和类名称)替换“消息”.

原文地址:https://www.jb51.cc/html/230940.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐