3

我有一个在 Mojarra 2.1.1 / Glassfish 3.1 上运行的应用程序,现在已经增长到 150,000 多行代码。该应用程序将 ajax 与 ViewScoped 托管 bean 和 page-redirect-get 模式(即 faces-redirect=true)一起广泛使用。

一直让我烦恼的一件事是从页面到页面以及从 bean 到 bean(每个页面都有它自己的支持 bean)显然缺乏传递参数的便利性。

我一直无法让闪光灯工作。我通常需要在下一页的 preRenderView 事件侦听器中访问我已写入闪存的数据。这不能可靠地工作,尤其是在应用程序重新部署之后。

我已经阅读了 CDI 并花了几天时间尝试从 JSF 托管 bean 迁移到 CDI bean,但无法让它工作。Seam 3 和 Glassfish 3.1 之间似乎存在很多兼容性问题。我将 Weld 升级到 1.1.1,但这并没有帮助。从我的角度来看,它目前不起作用。当我说不起作用时,例如,我有一个页面试图将 h:inputText 转换为支持 bean 中的字符串,这不起作用,非常简单的东西。

由于我遇到的 CDI 问题,我无法在一个非常简单的测试应用程序(即使在 g/f 3.1 上)中使用缝面 @RenderScoped,它只是我想要的,但在复杂的主应用程序中却不行。

目前我能找到的唯一可靠的机制是 URL 参数,这是一个安全噩梦。尽管已尽一切努力确保对数据的访问得到正确的身份验证,但总是会丢失某些内容,并且在浏览器中看到 ...xhtml?id=51031 或其他任何内容对于某些人来说太多而无法抗拒尝试其他 ID。我编写了一个混淆转换器来避免使用明文并且不对名称/值对使用有意义的名称,但这并没有解决问题的根源。

我只是想知道我是否在这里遗漏了一些东西,其他人是否有解决这个问题的有效方法,即使是在 glassfish 上?我是否太担心并且应该坚持使用 URL 参数?还有其他建议吗?

谢谢。

4

2 回答 2

3

我也看到了。在我尝试的时候,Seam3 有很多 bug,很难将它部署到不同的服务器上。我切换到MyFaces CODI,它从一开始就没有任何问题。在你的情况下,你应该看看@ViewAccessScoped。您可以摆脱所有这些烦人的解决方法。

于 2011-08-21T19:26:57.603 回答
2

声明您想要设置或传递到下一个视图的参数

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
</f:metadata>

这基本上bean.setFoo(request.getParameter("foo"))在 GET 请求的更新模型值阶段进行。

如果将includeViewParams=true参数添加到导航结果,则声明为<f:viewParam>当前视图的参数将传递到下一个视图。

public String doSomething() {
    // ...
    return "next?faces-redirect=true&amp;includeViewParams=true";
}

(注意:这&amp;很重要!&因为它不是 XML 有效的,所以它不起作用)

下一个视图应该具有相同<f:viewParam>的设置,以便在 bean 中设置它们。等等。

于 2011-06-18T19:57:53.747 回答