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

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

我在JSF的web.xml已经有了下面的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> 

对于泽西岛,我觉得我必须在web.xml使用下面的servlet:

 <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> 

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

这个担心是不必要的。 只要他们的URL模式不相互冲突,您可以安全地在一个Web应用程序中拥有多个servlet。 通常情况下,如果是这样的话,一个理智的servlet容器就会在webapp启动的时候抛出一个exception。 在你的情况下,你已经注册了JSF servlet on /test/* (这很奇怪,顺便说一下,你通常使用*.xhtml ),并且你已经在/api/* 。 所以你需要使用匹配这些URL模式的URL来调用它们。

而且,为了清除一个概念性的误解,你根本不能也不能“在JSF中实现REST”。 他们完全独立于对方。 他们可以在相同的networking应用程序中轻松地运行,而不用彼此了解。 他们可能分享的唯一东西就是服务层 。 但通常是这样。 服务层的devise又与谁在使用它无关。

这个特定的问题与JSF和JAX-RS无关。 这只是基本的servlet 。 基本上每个Java EE Web应用程序的构build都可能花费一点时间来了解更多有关基础结构的信息。

你不能直接拥有同一个java类或图层。 我像下面这样实现它

  |---> JSF Managed Beans(Inject logic here) Database --> Daos --> Logic --| |---> JAX-RS (Inject logic here) 

对于任何试图在XPage中执行此操作的人来说,可以从组件库中将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