现在我们接着上面讨论来解决疑问1:如何获取资源文件的真实路径。


引入:

我们上文中已经说到,我们最开始是从请求URI来的,它的位置是 /html/portlet/login/css/main.css

接下来通过简单的字符串操作获取的requestPath也为 /html/portlet/login/css/main.css

Liferay Dynamic CSS Filter方法的研究 - 从请求文件URI到获取资源文件真实路径_第1张图片

现在我们来看看如何通过这个信息来获取这个文件的真实在Liferay服务器上的路径的。


分析:

对应的代码如下:

String realPath = ServletContextUtil.getRealPath(
        _servletContext, requestPath);


秘密就在ServletContextUtil的getRealPath()方法中:

public static String getRealPath(
        ServletContext servletContext, String path) {
        String realPath = servletContext.getRealPath(path);
        if ((realPath == null) && ServerDetector.isWebLogic()) {
            String rootDir = getRootDir(servletContext);
            if (path.startsWith(StringPool.SLASH)) {
                realPath = rootDir + path.substring(1);
            }
            else {
                realPath = rootDir + path;
            }
            if (!FileUtil.exists(realPath)) {
                realPath = null;
            }
        }
        return realPath;
    }


从这段代码看出它获取的方式很简单,就是在第3行问ServletContext索取这个信息

具体走了多个调用后,它最终是向catalina.jar中的FileDirContext调用doGetRealPath()来获取的。


而这个FileDirContext已经定义了absoluteBase为我们的Liferay tomcat的ROOT目录:

Liferay Dynamic CSS Filter方法的研究 - 从请求文件URI到获取资源文件真实路径_第2张图片


所以,它最终只要吧我们请求的requestPath拼接到absoluteBase后面就获得了真正的资源的绝对路径。



结论:

从请求文件URI到获取资源文件真实路径是Liferay容器完成的,它的主要操作是用absoluteBase和请求URI字符串拼接而成就可以得到最终资源文件位置了。如下大家可以对比下requestPath和realPath

Liferay Dynamic CSS Filter方法的研究 - 从请求文件URI到获取资源文件真实路径_第3张图片