Простая проблема чтения файла с использованием тегов JSP

Я создал класс обработчика тегов 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/..

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 в конечном итоге

"/Эпсилон/данные/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.


person Michael M. Adkins    schedule 08.06.2011    source источник
comment
не должно быть никакой разницы при написании обработчика тегов или сервлета, все, наконец, является кодом Java... опубликуйте код   -  person Ramesh PVK    schedule 08.06.2011
comment
Ваш комментарий не дал того, что вы ожидали, мы не можем увидеть каталог файлов, о котором вы говорите. Лучшим вариантом было бы отредактировать свой вопрос с дополнительной информацией.   -  person Jesse Webb    schedule 08.06.2011


Ответы (1)


Вы не должны включать контекстный путь в вызов getRealPath(). Контекстный путь представлен только в URL-адресах, а не в файловой системе локального диска. getRealPath() ожидает относительный путь файловой системы локального диска относительно корня веб-контента.

context.getRealPath(path);

Что касается того, почему он находится в папке метаданных Eclipse, это просто потому, что вы развернули и запустили его из Eclipse. Это не должно навредить, именно об этом должен позаботиться getRealPath().

person BalusC    schedule 08.06.2011
comment
Спасибо. Я уже понял это сам, но именно поэтому у меня были проблемы с этим в первую очередь. Вся причина, по которой я использовал контекстный путь, заключалась в том, что мой файл JSP находился в подкаталоге моего сайта. Сначала я попытался поместить ../ перед путем к файлу, чтобы указать, что он находится в другом каталоге. Когда это вызвало ошибку, я подумал, что добавление контекстного пути поможет, но это все равно вызывало ошибки. Оказывается, мне даже не нужно было об этом беспокоиться - я могу написать путь к файлу, как если бы я смотрел из корня. - person Michael M. Adkins; 08.06.2011