h:输出链接值已转义

时间:2014-07-14 10:01:55

标签: jsf utf-8 glassfish-4

我正在使用带有glassfish 4.0的JSF。以下代码片段

    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    ...skipped...
    </h:head>
    ...skipped...
    <h:outputLink value="#{item.lastInstance.url}" escape="false">
        #{item.lastInstance.refName}
    </h:outputLink>

预计将被翻译为:

    <a href="https://url-unescaped>refname-unescaped</a>

但它被翻译为:

    <a href="https://url-escaped>refname-unescaped</a>

Bean的url和refName都包含UTF-8中的俄语文本,其中url中不允许使用空格和其他符号。但是这些非转义链接在浏览器中进行了测试(Firefox 24.0)。 转义序列由浏览器以某种方式解释,但不起作用。

我怎么能:

  1. 告诉JSF不要逃避h:outputLink值
  2. 告诉浏览器该网址已转义
  3. 感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果我没有误解你只是想告诉JSF不要逃避h:outputLink值&#34;。

使用html&lt; a /&gt;标记而不是&lt; h:outputLink /&gt;

<强> XHTML:

<h:outputLink value="русский.doc">русский.doc</h:outputLink>
<a href="#{jsfUrlHelper.getViewUrl('/русский.doc')}">русский.doc</a>

生成的输出:

<a href="%40%43%41%41%3A%38%39.doc">русский.doc</a> <!-- h:outputLink -->
<a href="http://localhost:8080/MyApp/русский.doc">русский.doc</a> <!-- a tag -->

<强> JsfUrlHelper.java

import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

@ManagedBean
public class JsfUrlHelper {

    public String getViewUrl(String viewId) {
        return getViewUrl(viewId, null);
    }

    public String getViewUrl(String viewId, String urlParams) {
        FacesContext ctx = FacesContext.getCurrentInstance();
        String contextPath = ctx.getExternalContext().getRequestContextPath();

        StringBuilder url = new StringBuilder(100);

        url.append(getRootUrl(ctx));
        url.append(contextPath);
        url.append(viewId);

        if (urlParams != null && urlParams.length() > 0) {
            url.append("?");
            url.append(urlParams);
        }

        return url.toString();
    }

    public String getRootUrl(FacesContext ctx) {
        HttpServletRequest request = (HttpServletRequest) ctx.getExternalContext().getRequest();

        StringBuilder url = new StringBuilder(100);
        String scheme = request.getScheme();

        int port = request.getServerPort();

        url.append(scheme);
        url.append("://");
        url.append(request.getServerName());

        if (port > 0 && ((scheme.equalsIgnoreCase("http") && port != 80) || (scheme.equalsIgnoreCase("https") && port != 443))) {
            url.append(':');
            url.append(port);
        }

        return url.toString();
    }
}