facelets完全逃脱xml

时间:2009-09-28 08:24:58

标签: jsf facelets

我总是使用像这样的el表达式;

<h:outputText value="#{bean.value}" escape="true" />;

我无法从输入字段中的xml中逃脱:

<h:inputText value="#{bean.value}" />

有没有办法在facelets中完全转义xml。

例如上下文参数;

<context-param>
  <param-name>facelets.ESCAPE_XML</param-name>
  <param-value>false</param-value>
</context-param>

3 个答案:

答案 0 :(得分:0)

覆盖<h:outputText>渲染器,并注释掉它逃脱文本的部分。然后在faces.config.xml中注册您的渲染器。

当然,这只有在您使用该标签时才有效。如果只输出表达式#{bean.value},它将无法工作。

就个人而言,我宁愿不得不添加转义属性。

答案 1 :(得分:0)

没有尝试过,但您可以使用自定义转换器,如下图所示(将\n转换为<br/>

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;

import org.apache.commons.lang.StringUtils;

public class BreakLineConverter implements Converter {

    /**
     * No conversion required 
     */
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return value;
    }

    /**
     * Converts All \r  \n  \r\n  into break
     */
    public String getAsString(FacesContext context, UIComponent component, Object value) {      
        if (null==value || StringUtils.isEmpty((String)value))
            return "";      
        String val=value.toString();
        //This will take care of Windows and *nix based line separators
        return val.replaceAll("\r\n", "<br />").replaceAll("\r", "<br />").replaceAll("\n", "<br />");
    }

}

在faces-config.xml中注册转换器

<converter>
    <description>Converts data to be displayed in web format
    </description>
     <converter-id>BreakLineConverter</converter-id>
    <converter-class>comp.web.converter.BreakLineConverter</converter-class>
</converter>

答案 2 :(得分:0)

默认情况下,h:outputTexth:inputText 已经转义XML实体。您甚至无法在h:inputText中将其关闭,就像在h:outputText中一样。你的问题出在其他地方。也许你对“逃避XML”的理解/定义是错误的。此外,您的<context-param>示例表明您希望禁用 XML转义。您不能对h:inputText执行此操作,因为您的网络应用程序可能会出现XSS attacks。你不想拥有它。