Я создал класс JSP Tag Handler в Java и определил его в XML в файле .tld.В моем файле .jsp я объявил тег и определил его атрибуты, одним из которых является путь к файлу, который нужно прочитать.
При передаче виртуального пути в метод getRealPath
ServletContext онвозвращает этот странный, несуществующий путь к файлу.Когда я пытался просто передать реальный путь к файлу прямо в тег, это выдает мне странное сообщение «Отказано в доступе».
Что меня смущает, так это то, что мне удалось выполнить то же самое без тегов, но с HttpServlet обрабатывать работу самостоятельно.HttpServlet не имеет проблем с выполнением этой задачи, но класс тегов jsp не может, и я не знаю почему.
Может ли кто-нибудь с любым опытом в задачах ввода-вывода и написания пользовательских тегов Java, помочь мне в этомone?
Обновление:
Вот как выглядит каталог файлов моего веб-сайта (где ".." обозначает наличие дополнительных файлови папки в этом каталоге, которые не отображаются).Также обратите внимание, что использование «<» и «>» приводит к исчезновению текста на этом форуме, поэтому я не мог использовать их для указания общей метки для каталога, но то, что в заглавных буквах, на самом деле не является названиемкаталог:
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>
* Обратите внимание на атрибут «путь», потому что он действительно важен!
В классе 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метод ct getRealPath.В результате получается строка realPath String:
"Z: \ Dropbox \ workspaces \ Sites.metadata.plugins \ org.eclipse.wst.server.core \ tmp1 \ wtpwebapps \ Epsilon \ Epsilon\ data \ header.markup "
Я действительно не знаю, почему он вернул папку метаданных, но это не то место, где на самом деле находится файл.И, как я уже упоминал ранее, HttpServlet не сталкивался с такой же проблемой, как класс JSP-тега.