lshboo 发表于 2017-2-18 08:49:50

在weblogic 11g上 this.getServletContext().getRealPath("/")为null的原因及解决方法

程序中的很多地方需要用到request.getRealPath()或者getServletContext.getRealPath()。这个方法受到war 和non-war的影响,以及不同app server实现的影响,返回的结果往往不一样,在weblogic中会返回null。
 一般的应用都会有一个或几个配置文件放在web-inf下面,getRealPaht返回null是读配置文件有很大困难。
/**
* 通过上下文来取工程路径
*
* @return
* @throws Exception
*/
private String getAbsolutePathByContext() throws Exception {
String webPath = this.getServletContext().getRealPath("/");
webPath = webPath.replaceAll("[\\\\\\/]WEB-INF[\\\\\\/]classes[\\\\\\/]?", "/");
webPath = webPath.replaceAll("[\\\\\\/]+", "/");
webPath = webPath.replaceAll("%20", " ");
if (webPath.matches("^:.*?$")) {
} else {
webPath = "/" + webPath;
}
webPath += "/";
webPath = webPath.replaceAll("[\\\\\\/]+", "/");
return webPath;
}
/**
* 通过类路径来取工程路径
*
* @return
* @throws Exception
*/
private String getAbsolutePathByClass() throws Exception {
String webPath = this.getClass().getResource("/").getPath().replaceAll("^\\/", "");
webPath = webPath.replaceAll("[\\\\\\/]WEB-INF[\\\\\\/]classes[\\\\\\/]?", "/");
webPath = webPath.replaceAll("[\\\\\\/]+", "/");
webPath = webPath.replaceAll("%20", " ");
if (webPath.matches("^:.*?$")) {
} else {
webPath = "/" + webPath;
}
webPath += "/";
webPath = webPath.replaceAll("[\\\\\\/]+", "/");
return webPath;
}
private String getAbsolutePathByResource() throws Exception {
URL url = this.getServletContext().getResource("/");
String path = new File(url.toURI()).getAbsolutePath();
if (!path.endsWith("\\") && !path.endsWith("/")) {
path += File.separator;
}
return path;
}
public String init() throws ServletException {
String webPath = null;
try {
webPath = getAbsolutePathByContext();
} catch (Exception e) {
}
// 在weblogic 11g 上可能无法从上下文取到工程物理路径,所以改为下面的
if (webPath == null) {
try {
webPath = getAbsolutePathByClass();
} catch (Exception e) {
}
}
if (webPath == null) {
try {
webPath = getAbsolutePathByResource();
} catch (Exception e) {
}
}
System.out.println(webPath);
return webPath;
}
  在weblogic里面war通过getAbsolutePathByContext()方法获取路径为空 ,是很正常的
  对一个打包的应用来说,是没有RealPath的概念的,调用getRealPath只会简单地返回null
  所以可以通过上面的通过类路径来取工程路径
页: [1]
查看完整版本: 在weblogic 11g上 this.getServletContext().getRealPath("/")为null的原因及解决方法