2010-02-26 30 views
3

我刚刚开始使用JavaServer Faces,它看起来非常有吸引力。不过,我想在JSF的同一个Web应用程序中使用自己的servlet。如何将JSF与自定义servlet集成?

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

回答

8

如果你的servlet的写得很好,他们应该已经有任何业务逻辑里面,但只是单纯的请求/响应控制/预处理/后处理逻辑。业务逻辑应该已经放置在独立的类似于javabean的域/模型类中。数据库逻辑应该已经放置在独立的DAO类中。等等。你可以只用重用他们都在JSF中。也就是说,最好知道JSF(当在Servlet API之上运行时 - 通常情况下)管理请求范围的bean作为属性HttpServletRequest,会话范围的bean作为属性HttpSession,应用程序作为ServletContext的属性。通过ExternalContext#getRequestMap(),#getSessionMap()#getApplicationMap()可以获得所有这些请求,会话和应用程序属性也是很好的。您现在应该意识到,您可以从servlet内部以通常的方式访问它们。

在任何情况下,当有技术需要访问ServletFilterFacesContext,然后立即基于上述事实,停止编码,并重新考虑你的方法。难道不应该在新的托管bean中完成吗?或者可能是PhaseListener

+0

同意bean中的业务逻辑。我的方案更多地涉及到如何将用户发送给servlet并向该servlet提供(可能有很多)参数。我认为把它们放在请求中并转发到servlet是有意义的。 我有些害怕JSF可能会使用一些奇怪的命名约定或某些东西(你知道,“_id0:_id0”),所以我期望不得不绕过来找到“user”bean的真实名称。你的回答澄清了这一点。谢谢! – 2010-02-26 15:36:06

1

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

JSF已经管理了当您按下按钮时调用其方法的bean。您同时具有请求和响应(使用FacesContext.getCurrentContext().getExternalContext()),但它们不是真的需要 - 所有数据都由JSF自动填充到托管bean的字段中。

如果你想不与JSF,但在相同的应用集成工作的servlet,那么你就必须将它们映射到不与JSF Servlet的URL冲突的URL。