我用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/ ..
在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标签的类没有。
答案 0 :(得分:1)
您不应在getRealPath()
调用中包含上下文路径。上下文路径仅在URL中表示,而不在本地磁盘文件系统中表示。期望getRealPath()
相对于webcontent根目录的相对本地磁盘文件系统路径。
context.getRealPath(path);
至于为什么它位于Eclipse的元数据文件夹中,这只是因为你从Eclipse内部部署并运行它。这不应该受到伤害,这正是getRealPath()
应该照顾的。