Ссылка на файл в сервлете


Когда я ссылаюсь на файл DTD в своем коде, я не знаю, как ссылаться на него в папке моего проекта. например: если мой проект называется Moo, я хотел бы сослаться на DTD в /Moo/WEB-INF/courses.dtd.

TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = null;  

try { trans = transfac.newTransformer();   }
catch (TransformerConfigurationException e) { }

trans.setOutputProperty(OutputKeys.INDENT, "yes");  
trans.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "/Moo/WEB-INF/courses.dtd");
Но она его не находит. Как я могу ссылаться на него?

Мне было предложено решение с помощью getRealPath проблемы, так как мой проект будет прочитан как a .война файл это не хорошо. Что же мне делать?

3 3

3 ответа:

Прежде всего, не включайте "му". Для сервлета root находится на один уровень выше WEB-INF. Не уверен, что OutputKeys.DOCTYPE_SYSTEM хочет относительный путь. Абсолютный путь:

String path = getServletContext().getRealPath("/WEB-INF/courses.dtd");

Итак, вы находитесь в процессе создания XML-документа с помощью XSLT. Вы хотите, чтобы документ был с отступом (OutputKeys.INDENT, "yes"), и вы хотите, чтобы он содержал DOCTYPE с системной ссылкой (OutputKeys.DOCTYPE_SYSTEM, "...").

Теперь маловероятно, что вам нужен реальный путь $WebAppRoot/Moo/WEB-INF/courses.dtd в качестве ссылки на систему. Не будет ли это скорее URL, как http://www.example.com/some/dir/courses.dtd? И тогда DTD должен быть доступен с этого URL, конечно. То, что находится в WEB-INF, не может быть доступно через HTTP, по крайней мере, не через контейнер сервлета.

Если, на с другой стороны, вы хотите сделать документ и DTD доступными только на сервере, который создает документ, а затем действуйте, как предлагает Nulldevice, с оговорками, добавленными в комментариях.

Обеспечить URIResolver к Transformer.