3

我想先给你一些背景信息。

上下文

我目前正在使用 Spring 框架开发一个 Web 应用程序,我想在其中为用户提供在单独的选项卡中显示/编辑相同实体类型模型的不同实例。为了显示和检索这些实体的属性,我使用 Spring 托管 bean和匹配的数据传输对象实例以及服务层接口实现的@Autowired 注释实例来持久化数据。

因为我经历过,Spring 的会话范围 bean适合多选项卡编辑,并且请求范围 bean 不能保存提交的数据“足够长”以重新显示所以我实现了一个“自定义”范围视图 bean。这似乎适用于显示和编辑多个相同类型的页面(及其上的实体)以及只要 bean 的操作方法返回 void/null 就保存数据。

页面之间的导航目前是通过 bean 操作方法上目标页面的 String 类型返回值来完成的,该方法发送到 h:commandLink 和 h:commandButton 等组件,由 JSF 或使用简单的 html 链接解析。

问题

您如何使用一个 h:link/h:button 导航到另一个页面,并在页面登陆后将其参数传递给 Spring 视图范围 bean 显示?

有没有办法,首先如何重定向到另一个页面 - 例如从具有系统用户列表的页面,然后显示从启动页面传递的用户的详细信息?

需要回答的问题和可能的解决方案?

如果我已经正确理解并实现了它,它们已经被 Spring 管理和注入,所以它们不能像 JSF 的 ViewScoped bean 一样工作,所以我不能轻松地使用它们的属性注释为 JSF 管理并传递它们的参数值以在 a 上显示它们导航到它之后的详细信息/编辑页面。当我尝试它时,它会导致“CDI @ViewScoped bean 功能不可用”错误消息。我认为,出于同样的原因,使用 @ManagedBean 注释的 JSF bean 并且目标页面上的 f:viewParam 不起作用。那是对的吗?

我尝试使用目标页面的返回值将参数传递给 Spring 视图范围 bean 的函数,但显然(?) bean 在登陆它并清空参数后重新创建。尝试使用 void 返回类型和登录页面名称为 Spring 视图范围 bean 的操作定义导航规则也不起作用。似乎在 faces-config.xml 中无法识别 Spring bean。是这样吗?

我应该使用一些寿命更长的 Spring bean 的方法来调用具有正确参数的视图范围的构造函数吗?但是如何在重定向后阻止视图范围 bean 的重新创建?

从视图范围切换到会话范围可以解决我的问题,但它会导致糟糕的用户体验,正如我所看到的那样,我的应用程序应该如何处理同一用户的多个相同类型实例的选项卡。

在我看来,从 url 地址通过视图范围 bean 传递和检索安全参数可能不是最佳安全实践。但我也在 UI、服务层和 url 拦截中使用 Spring Security 角色,以及在我的服务方法上使用 AOP 来检查检索数据的所有者。在 url 中使用一些数据标识符是唯一可行的解​​决方案吗?从安全性的角度来看,它是比使用会话范围 bean 更差/更好的解决方案吗?

我欢迎并感谢您给我的每一个建议,因为这是我的第一个 Spring 宠物项目,我正在学习中。

4

0 回答 0