【问题标题】:How to implement JAX-RS RESTful service in JSF framework如何在 JSF 框架中实现 JAX-RS RESTful 服务
【发布时间】:2015-05-01 06:37:47
【问题描述】:

在我的实验室中,我被要求使用 JSF 框架和 REST 创建一个简单的网站。我对这两个做了一些研究。事实证明,对于 REST,我必须使用带有 Jersey 的 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>

对于泽西岛,我认为我必须在 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 调用它们中的任何一个。
  • 你能告诉我如何相应地进行 url 调用吗?
  • http://host:port/yourapp/test/* 用于 JSF 和 http://host:port/yourapp/api/* 用于 REST

标签: jsf servlets jersey jax-rs


【解决方案1】:

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

而且,为了消除概念上的误解,您根本不能也不能“在 JSF 中实现 REST”。它们彼此完全独立。他们可以轻松地在同一个 Web 应用程序中彼此相邻运行,而无需彼此了解。他们唯一可能共享的是service layer 或“共享”(CDI) 托管bean。但通常就是这样。服务层的设计反过来又独立于使用它的人。

此特定问题与 JSF 或 JAX-RS 无关。只是basic servlets。回到基础并花一点时间来learn more 了解基本上每个 Java EE Web 应用程序的基石,这可能也是值得的。

【讨论】:

  • 根据上面的评论,如果我调用 host:port/yourapp/api* 休息,是否可以获得 JSF 功能。对不起我的愚蠢问题,我完全是新手。
【解决方案2】:

您不能直接将两者都放在同一个 java 类或层中。 我像下面这样实现它

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

【讨论】:

  • 这正是另一个答案中所说的:“他们唯一可能共享的是服务层。但通常就是这样。服务层的设计又是独立的来自谁在使用它。stackoverflow.com/questions/30639785/…中有一个很好的解释
【解决方案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

【讨论】:

    猜你喜欢
    • 2017-12-11
    • 2013-06-26
    • 2015-09-18
    • 1970-01-01
    • 2011-03-02
    • 2013-06-03
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    相关资源
    最近更新 更多