我正在使用带有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)。 转义序列由浏览器以某种方式解释,但不起作用。
我怎么能:
感谢您的帮助。
答案 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();
}
}