如何在JSF框架中实现JAX-RS RESTful服务

asd*_*fjk 15 jsf servlets jax-rs jersey

在我的实验室中,我被要求使用JSF框架创建一个简单的网站,并使用REST.我对这两个做了一些研究.事实证明,对于REST,我必须使用泽西的JAX-RS框架.我想知道如何整合这两个框架,JAX-RS和JSF?

我已经web.xml为JSF提供了以下servlet :

<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>
Run Code Online (Sandbox Code Playgroud)

对于Jersey,我认为我必须使用以下servlet 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>
Run Code Online (Sandbox Code Playgroud)

现在我担心的是,对我而言,这个Jersey servlet似乎将取代Faces servlet web.xml.这会将我的应用程序从JSF更改为JAX-RS.但我想保留JSF并使用JAX-RS.我怎样才能做到这一点?

Bal*_*usC 20

这种担忧是不必要的.您可以在一个Web应用程序中安全地拥有多个servlet,只要它们的URL模式不会相互冲突.通常情况下,如果是这种情况,在webapp启动期间,一个理智的servlet容器就会抛出异常.在你的情况下,你已经注册了JSF servlet /test/*(顺便说一句,你通常使用*.xhtml它),并且你已经注册了JAX-RS servlet /api/*.因此,您只需使用与这些URL模式匹配的URL来调用它们.

而且,为了清除概念上的误解,你根本不能也不能"在JSF中实现REST".它们完全相互独立.他们可以轻松地在同一个Web应用程序中相互紧密地运行,而无需彼此了解.他们可能共享的唯一内容是服务层或"共享"(CDI)托管bean.但通常是这样.服务层的设计又与谁使用它无关.

此特定问题与JSF和JAX-RS无关.它只是基本的servlet.回到基础知识并花一点时间来了解基本上每个Java EE Web应用程序的基石,这可能是值得的.