gpt4 book ai didi

java - 使用JSP标签的简单文件读取问题

转载 作者:行者123 更新时间:2023-12-01 15:50:02 24 4
gpt4 key购买 nike

我用 Java 创建了一个 JSP 标记处理程序类,并在 .tld 文件中的 XML 中定义了它。在我的 .jsp 文件中,我声明了该标记并定义了其属性 - 其中之一是要读取的文件的路径。

将虚拟路径传递给ServletContext的getRealPath时方法,它返回这个奇怪的、不存在的文件路径。当我尝试简单地将真实文件路径直接传递给标签时,它给了我一些奇怪的“访问被拒绝”消息。

让我更困惑的是,我成功地在没有标签的情况下完成了同样的事情,但让 HttpServlet 自己处理所有工作。 HttpServlet 执行此任务没有问题,但 jsp 标记类不能,我不知道为什么。

在 IO 任务和编写自定义 java 标签方面有经验的人可以帮助我解决这个问题吗?

更新:

这是我网站的文件目录的样子(其中“..”表示该目录中还有未显示的其他文件和文件夹)。另请注意,使用“<”和“>”会导致文本在该论坛上消失,因此我无法使用它们来指定目录的通用标签,但全部大写的内容实际上并不是目录:

ROOT/Accounts/.. (location of Login.jsp)

ROOT/data/.. (location of datafile to be read)

ROOT/.. (other folders)

由于该项目在 Eclipse 中名为“Epsilon”,因此这些目录中任一目录的最终 URL 为:

http://localhost:8080/Epsilon/Accounts/..

http://localhost:8080/Epsilon/data/..

http://localhost:8080/Epsilon/..

在jsp文件中,我定义如下:

<tags:HeaderContent path="/data/header.markup" id="topMenu"></tags:HeaderContent>

*注意属性“path”,因为它非常重要!

在Java类中,在doStartTag()中方法,我有以下内容:

        ServletContext context = pageContext.getServletContext();
JspWriter out = pageContext.getOut();
String realPath = context.getRealPath(context.getContextPath()
+ path);
out.println(getHeaderContent(realPath).toString());

context.getContextPath()path变量最终都是

"/Epsilon/data/header.markup".

我将这两个连接的字符串作为参数传递给 ServletContext 对象的 getRealPath 方法。 realPath 字符串的结果如下:

"Z:\Dropbox\workspaces\Sites.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\Epsilon\Epsilon\data\header.markup"

我真的不知道为什么它返回元数据文件夹,但这不是文件实际所在的位置。而且,正如我之前提到的,HttpServlet 没有遇到同样的问题,但 JSP 标记的类却遇到了。

最佳答案

您不应在 getRealPath() 调用中包含上下文路径。上下文路径仅以 URL 形式表示,而不以本地磁盘文件系统形式表示。 getRealPath() 需要相对于 Web 内容根目录的相对本地磁盘文件系统路径。

context.getRealPath(path);

至于为什么它位于 Eclipse 的元数据文件夹中,那只是因为您是从 Eclipse 内部部署并运行它的。这应该不会造成伤害,这正是 getRealPath() 应该处理的事情。

关于java - 使用JSP标签的简单文件读取问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6279753/

24 4 0