【发布时间】:2011-01-21 07:28:09
【问题描述】:
我刚刚开始使用 JavaServer Faces,它看起来很有吸引力。不过,我想在与 JSF 相同的 Web 应用程序中使用我自己的 servlet。
这可能很明显,但是将 JSF 与“普通”基于 servlet 的应用程序集成的最佳实践是什么?这将包括从 servlet 访问 JSF 数据(读取和写入)。
【问题讨论】:
标签: java jsf servlets jakarta-ee
我刚刚开始使用 JavaServer Faces,它看起来很有吸引力。不过,我想在与 JSF 相同的 Web 应用程序中使用我自己的 servlet。
这可能很明显,但是将 JSF 与“普通”基于 servlet 的应用程序集成的最佳实践是什么?这将包括从 servlet 访问 JSF 数据(读取和写入)。
【问题讨论】:
标签: java jsf servlets jakarta-ee
如果您的 servlet 编写得很好,它们应该已经没有内部有任何业务逻辑,而只是纯粹的请求/响应控制/预处理/后处理逻辑。业务逻辑应该已经放置在独立的类似 javabean 的域/模型类中。数据库逻辑应该已经放置在独立的 DAO 类中。等等。您可以在 JSF 中重用它们。
也就是说,最好知道 JSF(在 Servlet API 之上运行时——常见情况)将请求范围的 bean 管理为 HttpServletRequest 的属性,将会话范围的 bean 管理为 HttpSession 的属性,应用程序范围的bean作为ServletContext的属性。还可以知道ExternalContext#getRequestMap()、#getSessionMap() 和#getApplicationMap() 可以访问所有这些请求、会话和应用程序属性。您现在应该意识到您可以从 servlet 内部以通常的方式访问它们。
无论如何,当有技术需要访问Servlet或Filter内的FacesContext时,请立即停止编码并根据上述事实重新考虑您的方法.在新的托管 bean 中完成不是更好吗?或者可能是PhaseListener?
【讨论】:
您不必将 servlet 与 JSF 集成。这与 JSF 的本质相反,JSF 是“基于组件”而不是“基于动作”。
JSF 具有托管 bean,当您按下按钮时会调用其方法。您有可用的请求和响应(使用FacesContext.getCurrentContext().getExternalContext()),但实际上并不需要它们 - 所有数据都由 JSF 在托管 bean 的字段中自动填充。
如果您想要不与 JSF 集成但在同一应用程序中工作的 servlet,那么您只需将它们映射到不与 JSF servlet 的 url 冲突的 url。
【讨论】: