2013-04-09 112 views
3

我很好奇如何让JSF只在页面加载加载一定的业务逻辑当我点击一个按钮(ActionEvent)未运行这段代码或执行AjaxBehaviorEventManaged Bean的 - 仅在页面加载执行代码

我的bean在@RequestScoped中,使用JSF 2.1和Primefaces。

由于ActionEventAjaxBehaviorEvent后来被调用,我不知道如何告诉Bean在@PostConstruct它是因为事件而被调用。

是因为bean放在了错误的范围内?

+0

注入ViewScoped Bean上有@PostConstruct代码到你RequestScoped豆。可能有更好的方法。所以请稍等... – 757071 2013-04-09 12:20:22

+0

我的ViewScoped出现严重问题。它总是需要一个序列化的类,我觉得anoying;) - 另外它会导致sligth问题,'java.sql' – ctekk 2013-04-09 12:22:04

回答

7

只有在 页面加载 GET请求执行代码

查一下(后)构造函数,如果FacesContext#isPostback()回报false

@PostConstruct 
public void init() { 
    if (!FacesContext.getCurrentInstance().isPostback()) { 
     // ... 
    } 
} 

在即将到来的JSF 2.2,你可以通过该方式使用这个新的<f:viewAction>代替。

<f:viewAction action="#{bean.init}" onPostback="false" /> 

是因为放置在错误的范围bean的?

取决于具体的功能要求。另请参见How to choose the right bean scope?


我有严重的问题ViewScoped。它总是需要一个序列化类我觉得这是烦人;) - 此外,它会导致“java.sql中的”

sligth问题,这说明一个问题用自己的代码设计,而不是与视图范围。 JDBC代码不属于JSF托管bean。像Connection等JDBC资源应该被never, never声明为实例变量。

+0

感谢您的详细解答。我会读到,但现在需要一段时间。因此,我现在又得到了另一个问题:我应该使用JDBC内部的try-finally块还是一个单独的类,并从bean中调用它(这是否会有所不同?)?或者更好地切换到JPA或类似的东西? – ctekk 2013-04-09 12:38:25

+0

第一步是停止将JDBC资源声明为实例变量。他们不可序列化应该已经足以暗示你以错误的方式做了事情。以后你做什么取决于你。牢记可重用性,可测试性和可维护性。仔细阅读链接的文章及其所有链接。 – BalusC 2013-04-09 12:40:06

1

一个RequestScoped bean是从客户端发送到服务器的每个请求重新创建,这就是为什么在执行中@PostConstruct逻辑每次你点击一个按钮,我想你应该使用一个ViewScoped豆,这是对每个创建页面加载。

您可以找到有关此主题的这个环节上写的BalusC一个很好的教程:http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ManagedBeanScopes

相关问题