Простая проблема чтения файлов с использованием тегов JSP - PullRequest
0 голосов
/ 08 июня 2011

Я создал класс 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-тега.

1 Ответ

1 голос
/ 08 июня 2011

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

context.getRealPath(path);

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

...