2011-01-21 18 views
7

我已经进入了一个项目,以重新实现JSF实现。现有的代码没有遵循正确的JSF标准。为了实现这一点,我正在学习JSF中的所有概念(我已经有了JSF的实验经验)。具体而言,我想问一些我脑子里想的问题。JSF中的最佳实践:模型,动作,获取者,导航,相位检测器

  • 在MVC模式中,JSF中的模型组件是什么?它是托管Bean吗?
  • 在行为方法中编写业务逻辑是否好主意?我已经看到数百行以行动方式编写的行。
  • 你认为我们可以在getter方法中编写任何逻辑吗?在JSF生命周期中调用getter或setter多少次。
  • 什么是编写faces-config.xml的传统方式。我已经在一篇文档中看过它说好的做法是将bean的托管bean声明和导航情况一起写入。它会更具可读性。
  • 写入相位监听器会影响响应时间。例如,我正在编写一个逻辑来解析PhaseListener中的请求参数并执行一些逻辑。有没有关于这方面的建议?

请回答上述问题。如果我对答案很清楚,那么我会想出更多的问题。

回答

15

请注意,即使您标记了[icefaces],此答案一般适用于JSF,而不适用于IceFaces。

在MVC模式,什么是模型组件在JSF?它是托管Bean吗?

这是正确的。 View是JSP/Facelets页面。控制器是FacesServlet。有关如何在“封面”下工作的更多详细信息,另请参阅this answer

在操作方法中编写业务逻辑是个好主意吗?我已经看到数百行以行动方式编写的行。

您也可以将调用委托给业务服务,如EJB。这样您就可以将业务详情抽象出来。在“简单”应用程序中,通常不会损害这部分内容,并且在托管bean中执行所有操作。然而,一旦你想要改变业务逻辑(例如,为了不同的客户或者为了演示的目的等),那么拥有一项服务将更加方便,这样你就不需要改变托管但你只需要编写一个特定业务接口的另一个实现类。

您是否认为我们可以在getter方法中编写任何逻辑?在JSF生命周期中调用getter或setter多少次。

如果需要的业务逻辑在每次吸气调用执行,那么这样做(这不过是在现实世界中不太可能,期待疯狂的记录或特殊懒惰(重新)加载的情况下)。但是,如果业务逻辑只需要在每个操作,事件,请求,会话或应用程序范围内执行一次,则必须在其他地方执行。另请参阅this answer

吸气剂被称为多少次应该是你最不关心的问题。吸气剂除了返回有问题的物质外不应该做其他事情。在输出值中调用时,它可以是每个请求一次。当在输入值中调用时,它可以是每个请求的两倍。在数据表/重复组件内部时,将调用与行数相乘。在渲染属性内部时,将呼叫乘以6〜8次。

什么是编写faces-config.xml的常规方法。我已经在一篇文档中看过它说好的做法是将bean的托管bean声明和导航情况一起写入。它会更具可读性。

我自己很少使用导航的情况下,通常我的faces-config.xml没有。我总是回发到相同的视图(返回nullvoid,然后有条件地渲染/包含结果。对于页面到页面导航,我不使用POST请求(对于哪些导航情况是必需的),因为这很简单UX(用户体验;浏览器后退按钮的行为并不像它应该那样,浏览器地址栏中的URL始终落后一步,因为它默认为转发,而不是重定向)和SEO(搜索引擎优化; searchbots不索引POST请求)。我只是用outputlinks甚至普通的HTML页面到页面导航<a>元素。

此外,在JSF 2.0有技术上没有必要在faces-config.xml管理的Bean定义和导航的情况下,也this answer见。

写入相位侦听器会影响响应时间。例如,我正在编写一个逻辑来解析PhaseListener中的请求参数并执行一些逻辑。有没有关于这方面的建议?

这就像在过早优化类别中的servlet过滤器一样。担心他们的表现通常没有意义。这通常只有一行或两行代码额外。真的没什么好担心的。当你在所有类上复制这段代码时,你会遇到更大的问题。如果您真的认为它会降低性能,请首先介绍它,然后我们可以谈论它。

4

在MVC模式中,JSF中的模型组件是什么?它是托管Bean吗?

我的建议是:

视图层(包括一个小型的MVC):

userForm.xhtml < - 视图。网页

UserController < - controller;托管bean

UserController.get/setUser < - model;其型号为视图

控制器层:

UserService < - 控制器;包含CRUD相关的业务逻辑

UserDAO的<控制器 - 持续对象数据库

用户< - 这被坚持域对象

模型层:

数据库

在行为方法中编写业务逻辑是个好主意吗?我已经看到数百行以行动方式编写的行。

在我的示例中,将业务逻辑放在UserService的方法中。 UserController的操作方法并不仅仅是在UserService中调用方法,捕获任何异常并为显示的下一个网页设置响应格式。

你认为我们可以在getter方法中编写任何逻辑吗?在JSF生命周期中调用getter或setter多少次。

对于getter/setters来说,只需进行get/setting即可。没有逻辑。

什么是编写faces-config.xml的常规方式。我已经在一篇文档中看过它说好的做法是将bean的托管bean声明和导航情况一起写入。它会更具可读性。

我将所有托管的bean声明在一起。并将所有的导航规则声明在一起。

写入相位侦听器会影响响应时间。例如,我正在编写一个逻辑来解析PhaseListener中的请求参数并执行一些逻辑。有没有关于这方面的建议?

不确定你在做什么,但你不应该手动分析请求参数。 JSF应该将表单的值直接注入到视图的模型中。也许我需要更多关于你想要做什么的信息。

希望这会有所帮助。

+0

寻找正确的答案。 – Krishna 2011-01-21 12:28:49

+0

有人可以提出一个使用这种方法的例子/教程吗? – Chris 2014-08-14 11:01:22