Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 托管Bean-仅在页面加载时执行代码_Java_Jsf_Jsf 2_Primefaces_Javabeans - Fatal编程技术网

Java 托管Bean-仅在页面加载时执行代码

Java 托管Bean-仅在页面加载时执行代码,java,jsf,jsf-2,primefaces,javabeans,Java,Jsf,Jsf 2,Primefaces,Javabeans,我很好奇,当我单击按钮(ActionEvent)或执行AjaxBehaviorEvent时,如何让JSF只在页面加载上加载某些业务逻辑,而不运行此代码 我的bean位于@RequestScoped中,使用JSF2.1和Primefaces 因为ActionEvent和AjaxBehaviorEvent是在之后调用的,我不知道如何告诉@PostConstruct中的Bean它是因为这些事件而被调用的 是因为bean放在了错误的范围内吗 仅在页面加载GET请求上执行代码 如果返回false,只需签入

我很好奇,当我单击按钮(
ActionEvent
)或执行
AjaxBehaviorEvent
时,如何让JSF只在页面加载上加载某些业务逻辑,而不运行此代码

我的bean位于
@RequestScoped
中,使用JSF2.1和Primefaces

因为
ActionEvent
AjaxBehaviorEvent
是在之后调用的,我不知道如何告诉
@PostConstruct
中的Bean它是因为这些事件而被调用的

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

仅在页面加载GET请求上执行代码

如果返回
false
,只需签入(post)构造函数即可

@PostConstruct
public void init() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // ...
    }
}
在即将发布的JSF2.2中,您可以使用新的
来实现这一点



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

取决于具体的功能要求。另见



我的可视范围有严重问题。我发现它总是需要一个序列化的类;)-此外,它还会导致“java.sql”出现细长问题


这表明您自己的代码设计有问题,而不是视图范围有问题。JDBC代码不属于JSF管理的bean。JDBC资源,如
Connection
等,应该声明为实例变量。

在从客户端发送到服务器的每个请求上都会重新创建一个RequestScoped bean,这就是为什么每次单击按钮时都会执行@PostConstruct中的逻辑,我认为您应该使用ViewScoped bean,它是在每次页面加载时创建的


您可以在这个链接上找到由BalusC编写的关于这个主题的好教程:

将带有@PostConstruct代码的ViewScoped bean注入到您的RequestScoped bean中。还有更好的办法。等等…我的ViewScope有严重问题。我发现它总是需要一个序列化的类;)-此外,它还导致了“java.sql”的狭长问题。谢谢您的详细回答。我会仔细阅读,不过这需要一些时间。因此,我现在有了另一个问题:我应该在bean中使用JDBC和try finally块,还是使用一个单独的类并从bean中调用它(这会有什么不同吗?)?或者切换到JPA或类似的东西更好吗?第一步是停止将JDBC资源声明为实例变量。它们是不可序列化的,这应该已经足够说明您的做法是错误的。你以后做什么取决于你自己。记住可重用性、可测试性和可维护性。仔细阅读链接文章及其所有链接。