2014-07-14 25 views
0

我正在使用GlassFish 4.0的JSF。代码h:输出链接值溢出

<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的值网址转义

感谢所有帮助

  • 泰尔浏览器。

  • +0

    我不认为,浏览器确实是---)。当我在地址字符串中输入可怕的(UTF-8编码,国家符号和空格)URL时,它会回复我想要的文档。无论如何,我有我的问题选项2:告诉浏览器该网址已被转义。 –

    +0

    网址有效。如果它被输入到浏览器的addr行中,并且所需的资源被GETted,我认为它被认为是有效的。事实是,这个URL是通过连接http:// server/app + path_part + filename_part由bean构建的。 server_part和path_part始终是ascii。但filename_part是从用户上传文件的名称派生的。该文件的名称是一个有效的unix文件名(允许使用国家代码)。因此,我认为,URL本身是有效的。遵循规范的文字,它的非转义表示是无效的。 –

    +0

    这个问题可能是我在html源代码中正确地看到了像这样的“server_path_part /%D0%A1%D1%87%D0%B5%D1%82%20%D1%82%D1%80%D1%83% D0%B1%D1%8B.jpg“但链接悬停时链接就像”server_path_part /!G5B B%40C1K.jpg“。而且我必须明白我怎么能... –

    回答

    1

    如果我不会误解你只是想告诉JSF不能逃避h:outputLink值。

    使用HTML <一个/ >标记,而不是< H:outputLink的/ >

    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 --> 
    

    的js fUrlHelper.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(); 
        } 
    } 
    
    +0

    非常感谢。很好的解决方法。顺便说一句,正如我从您的(以及我的)样本中看到的那样,JSF对h:outputLink值进行编码以使“8位转义”失效。有没有办法告诉它编码为“7bit转义”还是根本不编码? –