我在Mojarra 2.1.1 / Glassfish 3.1上运行了一个应用程序,现在已经增长到150,000+ 代码行。该应用程序广泛使用ajax与ViewScoped托管bean和 page-redirect-get模式(即faces-redirect = true)。
令我不断烦恼的一件事是明显缺乏传球的便利性 从页面到页面的参数,以及bean到bean的参数(每个页面都有自己的支持bean)。
我无法让闪光灯工作。我通常需要访问我的数据 写入下一页的preRenderView事件监听器中的flash。事实并非如此 可靠地工作,特别是在应用程序重新部署之后。
我已阅读过CDI,并花了几天时间尝试从JSF托管bean迁移 到CDI bean,但无法让它工作。似乎存在很多兼容性问题 在Seam 3和Glassfish 3.1之间。我将Weld升级到1.1.1,但这没有用。从 我的观点目前它不起作用。例如,当我说不起作用时 我有一个页面试图将h:inputText转换为支持bean中的String,但事实并非如此 工作,非常简单。
由于我遇到的CDI问题,我无法使用其中的@RenderScoped缝合面 一个非常简单的测试应用程序(即使在g / f 3.1上)也能满足我的需求,但不是 复杂的主要应用。
我目前唯一可以找到使用的可靠机制是URL参数,即a 安全噩梦。尽管已尽一切努力确保对数据的访问 经过适当的认证,总会发现缺少某些东西的变化,并且看到了 ... xhtml?id = 51031或浏览器中的任何内容对于某些人来说太过分了 尝试其他ids。我写了一个混淆转换器来避免明文而不是 为名称/值对使用有意义的名称,但这不会到达的根 问题
我只是想知道我是否在这里遗漏了一些东西,其他人都得到了一个有效的解决方案 对于这个问题,即使是在玻璃鱼上?我担心太多,应该坚持使用URL PARAMS?还有其他建议吗?
感谢。
答案 0 :(得分:3)
我也看到了同样的情况。在我尝试的时候,Seam3非常多,并且很难将它部署到不同的服务器上。我切换到MyFaces CODI,从一开始就没有任何问题。在你的情况下,你应该看看@ViewAccessScoped。你可以摆脱所有那些烦人的解决方法。
答案 1 :(得分:2)
声明您要设置或传递到
中的下一个视图的参数<f:metadata>
<f:viewParam name="foo" value="#{bean.foo}" />
</f:metadata>
这在GET请求的更新模型值阶段基本上bean.setFoo(request.getParameter("foo"))
。
如果您将includeViewParams=true
参数添加到导航结果中,那么当前视图声明为<f:viewParam>
的参数将传递到下一个视图。
public String doSomething() {
// ...
return "next?faces-redirect=true&includeViewParams=true";
}
(注意:&
很重要!&
无效,因为它不符合XML格式
下一个视图应该具有相同的<f:viewParam>
,以便在bean中设置它们。等等。