JSF
使OutputLink自动计算出ServletContext路径地址
By www.coolhou.com 灰石
( http://www.blogjava.net/coolhou )
( LimingMail1998@yahoo.com.cn )

文档描述:
JSF技术研究
文档经历:
1. [2005-11-9] 使OutputLink自动计算出ServletContext路径地址
|
1.1. 使OutputLink自动计算出ServletContext路径地址
1.1.1. outputLink标签说明
产生<a> HTML标签,例如:
<h:outputLink value="/pages/index.jsp">
首页
</h:outputLink> |
html代码
<a href="/pages/index.jsp"/>首页</a> |
1.1.2. 问题描述
index.jsp页面的全称地址是http://localhost:8080/jsftest/pages/index.jsp,http://localhost:8080是服务器地址,jsftest是项目根名称,/pages/index.jsp是页面所在位置。如果以<h:outputLink value="/pages/index.jsp"> ,那么html生成的访问页面应该指向的是http://localhost:8080/pages/index.jsp ,页面一定是链接不到指定页面的。
解决上面的解决方案有以下几种:
l 写全路径地址
<h:outputLink value="/jsftest/pages/index.jsp">
首页
</h:outputLink> |
缺点:不灵活。
l 用相对路径
<h:outputLink value="../pages/index.jsp">
首页
</h:outputLink> |
缺点:
u 一但路径有变化或目路很深的话维护起来麻烦
u 现在B/S结构的应用大多数采用虚拟路径的形式,所以<h:outputLink>生成的地址是找不到指定文件的
l 用JSTL的<c:url>来替换<h:outputLink>
<a href=”<c:url value=”/pages/index.jsp"/>”>
首页
</a> |
缺点:不在JSF的所用范围之内。
1.1.3. 我们的解决方案
在这种情况,我们可以去修改JSF的实现,直接让<h:outputLink>来支持我们的需求。
修改jsf-impl.jar包中的
com.sun.faces.renderkit.html_basic. OutputLinkRenderer.java
public void encodeBegin(FacesContext context, UIComponent component)
throws IOException {
…….
// 加入以下代码
/**
* [2005-11-08] 李明
* 将链接地址为"/"开头的网址,自动加上war的根名称
* 如:要访问的地址为"/pages/resume.jsp",根名称为"Tansun_JSF",
* 那么计算的结果为"/Tansun_JSF/pages/resume.jsp"
*/
if (!(hrefVal.equals(""))) {
if (hrefVal.substring(0, 1).equals("/")) {
hrefVal = context.getExternalContext().getRequestContextPath()
+ hrefVal;
}
}
……
} |
编译后更新jar包