Java 仅当用户从其他视图导航到视图时才执行某些代码

Java 仅当用户从其他视图导航到视图时才执行某些代码,java,jsf,el,spring-webflow,spring-el,Java,Jsf,El,Spring Webflow,Spring El,我有一个JSF应用程序,它使用SpringWebFlow进行导航。每次用户从另一个视图导航到accounts视图时,都应该执行一段代码。对于accounts视图,我有一个名为accountsBean的托管bean。我想到在流条目上从bean调用initView方法。它抛出PropertyNotFoundException,因为Spring无法识别accountsBean WEB-INF/flows/accounts-flow/flow.xml <flow xmlns="http://www

我有一个JSF应用程序,它使用SpringWebFlow进行导航。每次用户从另一个视图导航到accounts视图时,都应该执行一段代码。对于accounts视图,我有一个名为accountsBean的托管bean。我想到在流条目上从bean调用initView方法。它抛出PropertyNotFoundException,因为Spring无法识别accountsBean

WEB-INF/flows/accounts-flow/flow.xml

<flow xmlns="http://www.springframework.org/schema/webflow"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">  

    <view-state id="accounts" view="accounts.xhtml">
        <on-entry>  
            <evaluate expression="accountsBean.initView()"></evaluate>  
        </on-entry>
    </view-state>

</flow>

EDIT1
我的应用程序的一部分管理帐户和组。用户使用菜单在应用程序的不同部分之间导航。SpringWebFlow用于将导航从菜单项链接到特定视图。accounts视图包含一个datatable、一些CRUD操作按钮和一个用于选择帐户类型的选择框。根据其类型显示不同的帐户。datatable列是动态的。用户可以激活或停用某一类型。现在,用户必须注销才能看到帐户类型的修改。我需要让它工作而不需要注销

EDIT2: 我已将流定义更改为:

<flow xmlns="http://www.springframework.org/schema/webflow"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">  

    <var name="accountsFlow" class="com.acme.accounts.AccountsFlow" /> 

    <view-state id="accounts" view="accounts.xhtml">
        <on-entry>  
            <evaluate expression="accountsFlow.initView()"></evaluate>  
        </on-entry>
    </view-state>

</flow>


AccountsFlow用
org.springframework.stereotype.Component
注释。在initView方法中,执行
accountsBean
中的一些代码。这适用于
SessionScoped
bean,但BalusC提出的解决方案更好。

BalusC的第一条评论是正确的,但是Spring不支持开箱即用的ViewScope。您必须实现自己的自定义ViewScope,并通过Spring applicationContext.xml文件声明它。网上有很多这样的例子:


我不确定Spring在这里是如何发挥作用的,但在标准JSF中,这将是一个使bean
@viewscope
成为一个问题,并在其
@PostConstruct
方法中执行所需的作业。在我的实现中,accountsBean是
@SessionScoped
。确保它是作业的正确范围?需要在每个视图上重新初始化的“accountsBean”似乎并不代表登录的用户或其首选项。您是否知道,同一会话中所有打开的浏览器选项卡/窗口将共享同一实例,并且一旦最终用户在其中一个选项卡/窗口中执行某些操作,数据将在所有其他选项卡/窗口中反映/更改?您是对的。
ViewScoped
bean更合适。