JSF

使OutputLink自动计算出ServletContext路径地址

By www.coolhou.com 灰石

 ( http://www.blogjava.net/coolhou )

LimingMail1998@yahoo.com.cn

 

 

  title01.gif

文档描述:

    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.jsphttp://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