我参与了一个重构 JSF 实现的项目。现有代码未遵循正确的 JSF 标准。为了实现这一目标,我正在学习 JSF 中的所有概念(我已经亲 body 验了 JSF)。具体来说,我想问一下我的想法。
- 在MVC模式中,JSF中的模型组件是什么?是托管 Bean 吗?
- 在操作方法中编写业务逻辑是个好主意吗?我见过数百行写在 Action 方法中的行。
- 您认为我们可以在 getter 方法中编写任何逻辑吗?在 JSF 生命周期中调用了多少次 getter 或 setter。
- 编写faces-config.xml 的常规方法是什么。我在一份文档中读到,它说将托管 bean 声明和该 bean 的导航案例一起编写是一种很好的做法。它将更具可读性。
- 编写阶段监听器会影响响应时间。例如,我正在编写一个逻辑来解析 PhaseListener 中的请求参数并执行一些逻辑。对此有什么建议吗?
请回答以上问题。如果我对答案很清楚,那么我会提出更多问题。
最佳答案
请注意,即使您标记了 [icefaces]
,这个答案一般适用于 JSF,而不适用于 IceFaces。
In the MVC pattern, what is model component in the JSF? Is it the Managed Bean?
没错。 View 是 JSP/Facelets 页面。 Controller 是 FacesServlet
.有关它如何“在幕后”工作的更多详细信息,另请参阅 this answer .
Is it good idea to write the business logic in the action methods? I have seen hundreds of lines written in action methods.
您还可以将调用委托(delegate)给业务服务,例如 EJB。这样您就可以抽象出业务细节。在“简单”应用程序中,保留该部分并在托管 bean 中执行所有操作通常不会有什么坏处。但是,一旦您想要更改业务逻辑(例如,为了不同的客户或出于演示目的等),那么拥有服务会更方便,这样您就不需要更改托管beans,你只需要再写一个某个业务接口(interface)的实现类即可。
Do you think that we can write any logic in the getter methods?. How many times getter or setter called in the JSF lifecycle.
如果业务逻辑需要在每次 getter 调用时执行,那么就这样做(然而这在现实世界中是不太可能的,期望疯狂的日志记录或特殊的延迟(重新)加载情况)。但是,如果业务逻辑只需要在每个操作、事件、请求、 session 或应用程序范围内执行一次,那么它肯定必须在其他地方执行。另见 this answer .
调用 getter 的次数应该是您最不关心的。 getter 应该只返回有问题的属性。在输出值中调用时,每个请求可以调用一次。在输入值中调用时,每个请求可以调用两次。在数据表/重复组件内时,将调用乘以行数。在渲染属性中,将调用乘以 6~8 次。
What is the conventional way of writing the faces-config.xml. I have read in one document that it says good practice to write the managed bean declaration and navigation case for that bean together. It will be more readable.
我自己很少使用导航案例,我的faces-config.xml
中通常没有。 .我总是回发到相同的 View (返回 null
或 void
,然后有条件地呈现/包含结果。对于页面到页面的导航,我不使用 POST 请求(导航案例是强制性的)只是因为这对 UX(用户体验;浏览器后退按钮的行为不正常,浏览器地址栏中的 URL 总是落后一步,因为默认情况下是转发,而不是重定向)和 SEO(搜索引擎优化;搜索机器人不t 索引 POST 请求)。我只使用输出链接甚至纯 HTML <a>
元素进行页面到页面的导航。
此外,在 JSF 2.0 中,技术上不需要 faces-config.xml
中的托管 bean 定义和导航案例。 .另见 this answer .
Writng the phase listener would affect the response time. For example, I am writing a logic to parse the request parameter in the PhaseListener and doing some logic. Is there any advice on this?
这与过早优化类别中的 servlet 过滤器类似。担心他们的表现通常是没有意义的。这是每个 saldo 通常只有一两行额外的代码。真的没什么好担心的。当你在所有类上复制粘贴那段代码时,你会遇到更大的问题。如果您真的认为它会影响性能,请先对其进行概要分析,然后我们才能讨论。
关于java - JSF : model, Action 、getters、导航、phaselisteners 中的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4755304/