现在我们接着上面讨论来解决疑问1:如何获取资源文件的真实路径。
引入:
我们上文中已经说到,我们最开始是从请求URI来的,它的位置是 /html/portlet/login/css/main.css
接下来通过简单的字符串操作获取的requestPath也为 /html/portlet/login/css/main.css
现在我们来看看如何通过这个信息来获取这个文件的真实在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目录:
所以,它最终只要吧我们请求的requestPath拼接到absoluteBase后面就获得了真正的资源的绝对路径。
结论:
从请求文件URI到获取资源文件真实路径是Liferay容器完成的,它的主要操作是用absoluteBase和请求URI字符串拼接而成就可以得到最终资源文件位置了。如下大家可以对比下requestPath和realPath
转载于:https://blog.51cto.com/supercharles888/1282779