【发布时间】:2011-06-08 13:49:27
【问题描述】:
我在 Java 中创建了一个 JSP Tag Handler 类,并在 .tld 文件中的 XML 中定义了它。 在我的 .jsp 文件中,我声明了标签并定义了它的属性——其中之一是要读取的文件的路径。
当将虚拟路径传递给 ServletContext 的 getRealPath 方法时,它会返回这个奇怪的、不存在的文件路径。当我试图直接将真实文件路径直接传递给标签时,它给了我一些奇怪的“拒绝访问”消息。
让我更困惑的是,我设法完成了同样的事情没有标签,但让 HttpServlet 自己处理所有工作。 HttpServlet执行这个任务没有问题,但是jsp标签类不行,不知道为什么。
在 IO 任务和编写自定义 java 标签方面有任何经验的人可以帮我解决这个问题吗?
更新:
这是我网站的文件目录的样子(其中“..”表示该目录中还有其他未显示的文件和文件夹)。另请注意,使用“”会导致该论坛上的文本消失,因此我无法使用它们为目录指定通用标签,但所有大写字母实际上并不是目录:
ROOT/Accounts/..(位置 登录.jsp)
ROOT/data/..(位置 要读取的数据文件)
ROOT/..(其他 文件夹)
由于该项目在 Eclipse 中被命名为“Epsilon”,因此这些目录中任一目录的生成 URL 为:
http://localhost:8080/Epsilon/Accounts/..
在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 标记的类却遇到了。
【问题讨论】:
-
写成标签处理程序或servlet应该没有任何区别,最后一切都是java代码......发布代码
-
您的评论没有达到您的预期,我们看不到您所说的文件目录。最好的选择是使用更多信息编辑您的问题。