- 阐述
- 解决方案
- 新出现的问题
- 最终方案
在完成第五个第六个war包时,发现第5个包中的is得到的是空指针
public void init() throws ServletException{
//count = 0;
System.out.println("在init中完成计数器的初始化begin");
sc = this.getServletContext();
path = sc.getRealPath("WEB-INF/count.txt");
System.out.println("读路径是:"+path);
//说明path没问题
try {
System.out.println("进入try catch");
InputStream is = LifeServlet.class.getResourceAsStream("count.txt");
System.out.println("is="+is);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String string = br.readLine();
System.out.println("读到的字符串是:"+string);
count = Integer.parseInt(string);
br.close();
is.close();
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
System.out.println("在init中完成计数器的初始化end");
}
而第六个war包正常显示
public void init() throws ServletException{
count = 0;
System.out.println("在init中完成计数器的初始化");
sc = this.getServletContext();
path = sc.getRealPath("WEB-INF/count.txt");
try {
System.out.println("进入try catsh");
InputStream is = LifeServlet.class.getResourceAsStream("countinpackage.txt");
System.out.println("is的值是:"+is);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String string;
string = br.readLine();
System.out.println("读到的字符串为:"+string);
count = Integer.parseInt(string); //计数器完成初始化
br.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("1");
}
}
经对比,未发现两段代码代码有出入,在仔细排查过后,发现:
InputStream is = LifeServlet.class.getResourceAsStream(“count.txt”);
InputStream is = LifeServlet.class.getResourceAsStream(“countinpackage.txt”);
count.txt和countinpackage.txt所在的路径不同:
对此,我认为有两种解决方案:
- 将count.txt放入与该java文件同一包下
- 修改路径为正确的相对路径格式
当我认为修改过后能够解决问题,却发现is得到的值依旧是空指针
InputStream is = LifeServlet.class.getResourceAsStream("../../../WebContent/WEB-INF/count.txt");
当时考虑,是否自己对相对路径的理解存在偏差。在自己的多次实 *** 过后发现没有问题。
经老师的提醒,发现问题是web项目运行的时候所在的路径和本地路径不相同
使用插旗的方式,我们找到了该工作目录下的路径
String Path= this.getClass().getResource("").getPath();
得出的结果是:
path=
C:\Users\sch\Documents\workspace-spring-tool-suite-4-4.6.0.RELEASE.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\j2019001001_05_showServletLifeCyclePlusDemo\count.txt
通过打开该路径,我们可以发现,任何WEB-INF里的文件,均映射到了以该包为根目录下的位置,如这里的j2019001001_05_showServletLifeCyclePlusDemo/
注意,运行的.java文件编译之后生成的会在WEB-INF下生成的classes的servlet里
/WEB-INF/classes/servlet/
故上图的LifeServlet.class会出现在该目录下。
因此对于该问题来说,只需要修改路径为
path = sc.getRealPath("count.txt");
就可以找到此路径了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)