java - JSF : model, Action 、getters、导航、phaselisteners 中的最佳实践

标签 java jsf

我参与了一个重构 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 (返回 nullvoid,然后有条件地呈现/包含结果。对于页面到页面的导航,我不使用 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/

相关文章:

Java,计算两个日期之间的天数

java - TestNG 测试针对 JDK 9 模块的执行导致 InaccessibleObjectException

css - 从 panelgrid 动态传递 CSS 属性

java - Collection的reverseOrder方法的时间复杂度

java - 解析 map JSON 值并重新插入回 map

java - 如何删除自动 Axis 标签拉伸(stretch)?

jsf - Primefaces 单元格编辑在验证失败时留在编辑模式

java - 如何根据方法调用(返回 boolean 值)渲染或隐藏 jsf subview ?

css - 在 css 重写上失败甚至完整路径 css (Primefaces)

javascript - 在子窗口提交后如何在父窗口上重新加载文本