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