Как реализовать пользовательский ViewProcessor (jax-rs)?

#java #jakarta-ee #jersey #el #jax-rs

#java #джакарта-ee #джерси #el #jax-rs

Вопрос:

Глядя на статью здесь, есть пример того, как использовать TemplateProcessor для разрешения представлений JSP с использованием Джерси. По-видимому, этот класс устарел и заменен ViewProcessor<T> . Я несколько смущен тем, как реализовать любой из них (предпочтительно более новый, поскольку он не устарел); что входит в качестве аргумента шаблона? Как я могу реализовать его, чтобы просто разрешать jsp в /WebContent/WEB-INF/views/*, а также оценивать язык выражения возвращаемого представления?

Другая статья ViewProcessor находится здесь .

Спасибо.

Ответ №1:

ViewProcessor должен быть реализован, если вы хотите подключить поддержку нового типа шаблонов. Если все, что вам нужно, это шаблоны JSP, то они уже встроены в Jersey, и вам не нужно внедрять свой собственный ViewProcessor.

Если ваши файлы JSP расположены в WEB-INF/views, то вы можете установить для параметра инициализации JSP_TEMPLATES_BASE_PATH значение WEB-INF/views . Затем вам просто нужно вернуть новый экземпляр Viewable из вашего метода ресурсов (как показано в блоге Пола, на который вы ссылаетесь) и передать имя шаблона в качестве первого параметра и данные (модель) в качестве второго параметра конструктору. Затем в JSP вы можете получить доступ к данным, используя атрибут с именем «it».

ОБНОВЛЕНИЕ: если ваш URL-шаблон «/*», это немного сложнее. Джерси не может разрешить шаблоны при делегировании в контейнер, поскольку сервлет Джерси маскирует JSP. Чтобы контейнер мог видеть JSP, вам нужно сделать еще две вещи:

  1. зарегистрируйте сервлет Джерси в качестве фильтра вместо сервлета (просто замените вхождения сервлета фильтром в вашем web.xml ) — смотрите внизу этой страницы javadoc: http://jersey.java.net/nonav/apidocs/latest/jersey/com/sun/jersey/spi/container/servlet/package-summary.html
  2. добавьте параметр инициализации PROPERTY_WEB_PAGE_CONTENT_REGEX в фильтр и установите для него регулярное выражение, которому соответствуют шаблоны jsp (например, «/WEB-INF/views/.*»)

Если вы все еще считаете, что по какой-то причине вам нужно реализовать пользовательский ViewProcessor, вы можете посмотреть, как реализован процессор просмотра freemarker, и вдохновиться этим — см. http://java.net/projects/jersey/sources/svn/content/trunk/jersey/contribs/jersey-freemarker/src/main/java/com/sun/jersey/freemarker/FreemarkerViewProcessor.java?rev=5453

Комментарии:

1. Я попытался добавить параметр инициализации и вызов для возврата viewable, но представление по-прежнему не может быть разрешено: <init-param> <param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name> <param-value>WEB-INF/views</param-value> </init-param> и return new Viewable("welcome",changeList); и файл welcome.jsp в WEB-INF/views/welcome.jsp

2. ОК. Это связано с тем, что, как говорится в статье, Jersey ищет шаблоны в следующем каталоге: <root>/<fullyQualifiedClassName>/ . То есть, если класс ресурсов, возвращающий Viewable, является com.acme.myproject . FooResource и вы ищете «добро пожаловать», тогда Jersey попытается найти его как WEB-INF/views/com/acme/myproject/FooResource/welcome.jsp. Если ваш шаблон находится в корне базового пути шаблонов, вам нужно добавить к имени шаблона косую черту, т.е. return new Viewable("/welcome", changeList);

3. Это имеет смысл, к сожалению, это тоже не работает для меня — я не получаю неразрешенное исключение, но я тоже не вижу представления (HTTP 404). Имеет ли значение, что мой URL-шаблон сервлета равен /* ? У вас есть какие-либо дополнительные идеи? Я действительно озадачен / разочарован.

4. Одна вещь, которую я заметил во время отладки, заключается в том, что класс разрешения viewable равен null — это звучит неправильно, верно?

5. Хорошо, проблема в шаблоне url. Я обновил свой ответ информацией о том, что делать, если ваш шаблон URL равен «/*».