我有一个在Mojarra 2.1.1/Glassfish 3.1上运行的应用程序,现在已经增长到150000+代码行。该应用程序在ViewScoped托管bean和页面重定向获取模式(即faces redirect=true)。
有一件事一直困扰着我,那就是明显的不易通过参数从一个页面到另一个页面,从bean到bean(每个页面都有自己的backingbean)。
我一直没能让闪光灯工作。我通常需要访问写入下一页的preRenderView事件侦听器中的flash。这不是工作可靠,尤其是在应用程序重新部署之后。
我已经阅读了CDI,并花了几天时间尝试从JSF管理的bean迁移到CDI bean,但无法使其工作。似乎有很多兼容性问题接缝3和Glassfish 3.1之间。我将Weld升级到1.1.1,但这无济于事。从…起从我的角度来看,它现在不起作用。例如,当我说不起作用时我有一个页面试图将h:inputText转换为backingbean中的String,但这并没有工作,非常简单的事情。
由于我遇到的CDI问题,我无法使用RenderScoped中的接缝面一个非常简单的测试应用程序(甚至在g/f3.1上)正是我想要的,但在复杂的主应用程序。
目前我能找到的唯一可靠的机制是URL参数,它是安全噩梦。尽管已尽一切努力确保对数据的访问经过适当身份验证后,总会有缺失和看到的变化…xhtml?id=51031或浏览器中的任何内容都让一些人难以抗拒尝试其他id。我写了一个模糊转换器来避免明文为名称/值对使用有意义的名称,但这不会到达问题
我只是想知道我是否遗漏了什么,其他人都有有效的解决方案吗甚至在玻璃鱼上?我是不是太担心了,应该坚持使用URLparams?还有其他建议吗?
谢谢。
我也看到了同样的情况。在我尝试的时候,Seam3非常有缺陷,很难将其部署到不同的服务器上。我切换到MyFaces CODI,它从一开始就没有任何问题。在您的情况下,您应该查看@ViewAccessScoped。你可以摆脱所有那些烦人的变通办法。
声明要设置或传递到中的下一个视图的参数
<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中设置它们。等等。