Ссылка на файл в сервлете
Когда я ссылаюсь на файл 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 ответа:
Прежде всего, не включайте "му". Для сервлета 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
.