绝对路径转相对路径(Eclipse,JSP)

6

我正在使用Eclipse(JSP)制作一个Web应用程序,并使用Tomcat作为服务器(集成到Eclipse中)。 我需要创建下面的对象并指定配置文件的路径。这个绝对路径非常好用:

Store store = StoreFactory.create("file:///C:/Users/Aliens/workspace/myProject/WebContent/config/sdb.ttl");

然而,我想知道为什么我不能使用相对路径。如果项目名称是根目录,应该是"config/sdb.ttl",对吗?但是这种方式无法找到它(NotFoundException)。
2个回答

6
相对磁盘文件系统路径是相对于当前工作目录的,这取决于应用程序的启动方式(在 Eclipse 中它将是项目文件夹,在命令控制台中它将是当前打开的文件夹,在 Tomcat 管理器/服务中它将是 Tomcat/bin 文件夹等)。您无法从 Java 代码内部控制它,所以请忘记它。
在 JSP/Servlet 中,您可以使用 ServletContext#getRealPath() 将相对的 Web 内容路径(它的根在公共 WebContent 中,在您的情况下是 /WebContent 文件夹)转换为绝对磁盘文件系统路径。因此:
String relativeWebPath = "/config/sdb.ttl";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
Store store = StoreFactory.create(absoluteDiskPath);
// ...
< p > ServletContext 可以通过继承的 getServletContext() 方法在 servlet 中使用。


我正在创建一个存储对象,该对象位于src文件夹中的类中。由于这不是JSP / Servlet,因此我无法使用getServletContext()方法。在JSP中,我实例化这个类,并在其构造函数中生成Store对象。还有其他解决方案吗? - Aliens
一个JSP文件在语义上是错误的位置。尽管如此,由于JSP文件被编译为servlet,因此可以通过getServletContext()访问ServletContext。您还可以使用隐式变量application,它指的是相同的内容。即 application.getRealPath(relativeWebPath)。顺便说一下,在说“我无法使用该方法”之前,您是否真正尝试过它? - BalusC
嘿。当然我试过了,但还是不起作用。我不知道你是否明白我的意思。我不是在JSP中调用getServletContext()。我想在/src目录下的.java文件中调用它,但我无法做到这一点。这个.java文件是一个类。而且这个类是在JSP中实例化的。 - Aliens
我解决了这个问题。在JSP中,我按照您的建议得到了正确的路径。我将absoluteDiskPath作为参数传递给我的Java类,在那里我使用它来确定路径。 感谢您的帮助。顺便说一句,您的文章“如何避免在JSP文件中使用Java代码”非常好。 - Aliens
哦,你说你是在 JSP 中做这个?嗯,根据功能需求,Filter(基于请求)、HttpSessionListener(基于会话)或 ServletContextListener(基于 Web 应用程序)更适合这项工作。无论如何,不客气 :) - BalusC

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接