使用JSP标记的简单文件读取问题

时间:2011-06-08 13:49:28

标签: java jsp jsp-tags

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

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

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

有IO任务经验和编写自定义java标签的人能帮我解决这个问题吗?

更新

以下是我网站的文件目录(其中“..”表示该目录中有其他文件和文件夹未显示)。另请注意,使用“<”和“>”导致文本在此论坛上消失,因此我无法使用它们为目录指定一般标签,但是所有大写的内容实际上并不是目录的名称:

  

ROOT / Accounts / ..(位置   Login.jsp)

     

ROOT / data / ..(位置   要读取的数据文件)

     

ROOT / ..(其他   文件夹)

因为该项目在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变量最终都是

  

“/小量/数据/ header.markup”。

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

  

“Z:\收存箱\工作空间\ Sites.metadata.plugins \ org.eclipse.wst.server.core \ TMP1 \ wtpwebapps \小量\小量\数据\ header.markup”

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

1 个答案:

答案 0 :(得分:1)

您不应在getRealPath()调用中包含上下文路径。上下文路径仅在URL中表示,而不在本地磁盘文件系统中表示。期望getRealPath()相对于webcontent根目录的相对本地磁盘文件系统路径。

context.getRealPath(path);

至于为什么它位于Eclipse的元数据文件夹中,这只是因为你从Eclipse内部部署并运行它。这不应该受到伤害,这正是getRealPath()应该照顾的。