【问题标题】:Execute some code only when the user navigates to a view from a different view仅当用户从不同视图导航到视图时才执行某些代码
【发布时间】:2012-09-05 06:38:29
【问题描述】:

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

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
我的应用程序的一部分管理帐户和组。用户使用菜单在应用程序的不同部分之间导航。 Spring Web Flow 用于将导航从菜单项链接到某个视图。帐户视图包含一个数据表、一些用于 CRUD 操作的按钮和一个用于选择帐户类型的选择框。根据其类型显示不同的帐户。数据表列是动态的。用户可以激活或停用某种类型。现在用户必须注销才能看到帐户类型的修改。我需要让它在不需要注销的情况下工作。

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 beans,但 BalusC 提出的解决方案更好。

【问题讨论】:

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

标签: java jsf el spring-webflow spring-el


【解决方案1】:

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

http://cagataycivici.wordpress.com/2010/02/17/port-jsf-2-0s-viewscope-to-spring-3-0/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多