Как реализовать службу JAX-RS RESTful в системе JSF
В моей лаборатории меня попросили создать простой веб-сайт с использованием JSF-структуры и использовать REST. Я провел некоторое исследование этих двух. Оказывается, для REST я должен использовать JAX-RS с Джерси. Мне было интересно, как я могу интегрировать эти две структуры, JAX-RS и JSF?
У меня уже есть сервлет в web.xml
для JSF:
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/test/*</url-pattern>
</servlet-mapping>
Для Джерси я решил, что должен использовать ниже сервлет в web.xml
:
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.jbm.rest</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
Теперь я беспокоюсь, мне кажется, что этот сервлет Джерси заменит сервлет Faces в web.xml
. Это изменит мое приложение от JSF до JAX-RS. Но я хочу сохранить JSF и использовать JAX-RS. Как я могу это сделать?
Ответы
Ответ 1
Эта проблема не нужна. Вы можете безопасно иметь несколько сервлетов в одном веб-приложении, если их шаблоны URL не сталкиваются друг с другом. Обычно, если бы это было так, то биткарный контейнер сервлетов уже выдавал исключение во время запуска webapp. В вашем случае вы зарегистрировали сервлет JSF на /test/*
(что странно, кстати, вы обычно используете *.xhtml
для этого) и вы зарегистрировали сервлет JAX-RS на /api/*
. Поэтому вам просто нужно вызвать их, используя URL-адреса, соответствующие этим шаблонам URL.
И, чтобы устранить концептуальное недоразумение, вы не можете и не можете "реализовать REST в JSF" вообще. Они полностью независимы друг от друга. Они могут просто легко бегать друг за другом в одном и том же веб-приложении во всем мире, не зная друг о друге. Единственное, что они могут использовать, это уровень сервиса. Но это обычно так. Дизайн служебного слоя в свою очередь не зависит от того, кто его использует.
Эта конкретная проблема не связана с JSF и JAX-RS. Это просто основные сервлеты. Возможно, стоит также попытаться сделать шаг назад к основам и потратить немного времени на узнать больше о строительном камне в основном каждое веб-приложение Java EE.
Ответ 2
Вы не можете напрямую иметь как в одном классе или слое java.
Я реализовал его как ниже
|---> JSF Managed Beans(Inject logic here)
Database --> Daos --> Logic --|
|---> JAX-RS (Inject logic here)
Ответ 3
Проводя это для тех, кто пытается это сделать в XPages, есть элемент управления REST, который вы можете удалить на странице из библиотеки компонентов.
Как привязка ActionListener, вы привязываете Java-класс к компоненту и устанавливаете шаблон url.
Смотрите это примечание:
https://oliverbusse.notesx.net/hp.nsf/blogpost.xsp?documentId=2C4E
и пример приложения https://github.com/zeromancer1972/simplerest/blob/master/ODP/XPages/index.xsp