【问题标题】:How to integrate JSF with custom servlets?如何将 JSF 与自定义 servlet 集成?
【发布时间】:2011-01-21 07:28:09
【问题描述】:

我刚刚开始使用 JavaServer Faces,它看起来很有吸引力。不过,我想在与 JSF 相同的 Web 应用程序中使用我自己的 servlet。

这可能很明显,但是将 JSF 与“普通”基于 servlet 的应用程序集成的最佳实践是什么?这将包括从 servlet 访问 JSF 数据(读取和写入)。

【问题讨论】:

    标签: java jsf servlets jakarta-ee


    【解决方案1】:

    如果您的 servlet 编写得很好,它们应该已经没有内部有任何业务逻辑,而只是纯粹的请求/响应控制/预处理/后处理逻辑。业务逻辑应该已经放置在独立的类似 javabean 的域/模型类中。数据库逻辑应该已经放置在独立的 DAO 类中。等等。您可以在 JSF 中重用它们。

    也就是说,最好知道 JSF(在 Servlet API 之上运行时——常见情况)将请求范围的 bean 管理为 HttpServletRequest 的属性,将会话范围的 bean 管理为 HttpSession 的属性,应用程序范围的bean作为ServletContext的属性。还可以知道ExternalContext#getRequestMap()#getSessionMap()#getApplicationMap() 可以访问所有这些请求、会话和应用程序属性。您现在应该意识到您可以从 servlet 内部以通常的方式访问它们。

    无论如何,当有技术需要访问ServletFilter内的FacesContext时,请立即停止编码并根据上述事实重新考虑您的方法.在新的托管 bean 中完成不是更好吗?或者可能是PhaseListener

    【讨论】:

    • 同意bean中的业务逻辑。我的场景更多是关于如何将用户发送到 servlet 并为该 servlet 提供(可能有很多)参数。我想将它们放在请求中并转发给 servlet 是有意义的。我有点害怕 JSF 可能会使用一些奇怪的命名约定或其他东西(你知道,“_id0:_id0”的东西),所以我期待不得不四处寻找“用户”bean 的真实名称。您的回答澄清了这一点。谢谢!
    【解决方案2】:

    您不必将 servlet 与 JSF 集成。这与 JSF 的本质相反,JSF 是“基于组件”而不是“基于动作”。

    JSF 具有托管 bean,当您按下按钮时会调用其方法。您有可用的请求和响应(使用FacesContext.getCurrentContext().getExternalContext()),但实际上并不需要它们 - 所有数据都由 JSF 在托管 bean 的字段中自动填充。

    如果您想要不与 JSF 集成但在同一应用程序中工作的 servlet,那么您只需将它们映射到不与 JSF servlet 的 url 冲突的 url。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 2021-05-16
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 2011-02-05
      相关资源
      最近更新 更多