当前位置:  开发笔记 > 前端 > 正文

为什么在任何其他托管bean之前创建JSF转换器?

如何解决《为什么在任何其他托管bean之前创建JSF转换器?》经验,为你挑选了1个好方法。



1> BalusC..:

为什么在任何其他bean之前调用转换器?

这里没有完全"调用"转换器,即在那一刻既不调用getAsObject()也不getAsString()调用.它只是在构建视图时实例化,然后被指定为父ValueHolder组件的属性.JSF为组件上声明的每个转换器,验证器和(ajax)行为执行此操作.

转换器实际上是一个托管bean在这方面没有区别.这只是一个技巧,以便能够在其中注入EJB.JSF检查值是文字字符串还是EL表达式.如果是文字字符串,则将其视为转换器ID以创建转换器实例,否则如果EL表达式返回具体Converter实例,则直接使用它.或者如果没有,那么JSF将通过匹配value类型的目标类创建转换器(如果有的话).


为什么转换器是用创建的rendered=false

因为该rendered属性仅在视图渲染时评估,而不是在视图构建时.


我可以以某种方式使转换器在这3个bean之后创建自己(按照它出现在xhtml页面上)吗?

不,但如果你担心转换器的"不必要"实例化,那么你可以使用JSTL有条件地添加转换器.


    
    ...

您只需要记住,并且不会在同一时间进行评估.将在视图生成时进行评估,在视图中进行评估的渲染时间.因此,如果由于某种原因条件恰好在这些时刻之间发生变化,那么您基本上需要重建视图(即显式导航到同一视图而不是返回void/ null).如果在重新创建bean时条件绑定到视图范围的bean属性,这可能会变得很糟糕.你基本上需要在其中保留条件@PostConstruct.

尽管如此,无论如何要实例化的转换器(以及验证器和行为)应该是您最不关心的问题.如果在实例化方面遇到性能损失,或者在实例化排序方面存在技术问题,那么根据具体的功能要求,您最好寻找不同的解决方案.

也可以看看:

JSF2 Facelets中的JSTL有意义吗?

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有