Java JSF Flash参数未转入下一个视图(浏览器URL中无?faces redirect=true)
我们有一个包含命令链接的页面: 这应该重定向到结果管理器视图,秘密地传递一个包含表示TODO和DONE的两个状态标志的列表,以便将过滤器设置为所有状态 ResultManagerDashboardHelper.java: 调用searchInitialize方法,该方法应该从ResultManagerFilterHandler bean中提取存储的状态标志。然而,闪光的争论并不存在:Java JSF Flash参数未转入下一个视图(浏览器URL中无?faces redirect=true),java,jsf,jsf-2,post-redirect-get,view-scope,Java,Jsf,Jsf 2,Post Redirect Get,View Scope,我们有一个包含命令链接的页面: 这应该重定向到结果管理器视图,秘密地传递一个包含表示TODO和DONE的两个状态标志的列表,以便将过滤器设置为所有状态 ResultManagerDashboardHelper.java: 调用searchInitialize方法,该方法应该从ResultManagerFilterHandler bean中提取存储的状态标志。然而,闪光的争论并不存在: 18:58:42,840 INFO [] (134) Setting flash secret args
18:58:42,840 INFO [] (134) Setting flash secret args to [TODO, DONE]
18:58:42,840 INFO [] (134) Redirecting from '/view/dashboard' to '/view/resultmgmt/resultManager?faces-redirect=true'
18:58:43,039 INFO [] (135) ResultManagerFilterHandler: NO secret arguments have arrived via JSF Flash!
18:58:44,350 INFO [] (135) ResultManager statusFlags = []
18:58:44,350 INFO [] (135) Non-flash search!
问:
我做错了什么?我如何让它工作
请注意?faces redirect=true URL参数未附加到URL。。。我想知道为什么??这可能是空闪光的原因吗?还是正常的行为
我们使用的是Mojarra 2.1.22,众所周知它在延长Flash实例的使用时间方面存在一些问题,但这是我稍后要解决的问题
PS:很抱歉这个复杂的例子,实际上它更复杂…:-/
PPS:噢,不要介意@Named和@ViewScoped的组合,我们使用的是Seam 3,它用一个兼容CDI的JSF@ViewScoped替换了它。首先,我建议您不要对同一个视图使用两个@ViewScoped bean。您可以通过将ResultManager FilterHandler的功能性携带到ResultManager来实现此功能。但是,如果您想在其他bean中重用ResultManagerFilterHandler方法,只需使用一个不由JSF管理的普通类,并使托管bean从中扩展即可 另一方面,使用2.1.22已经没有意义了。只需使用最新的2.1.x branch版本,它将与您拥有的代码完全兼容,并带来许多错误修复,特别是与flash scope相关的修复 与faces redirect=true相关,请记住,faces Servlet在将重定向url发送到浏览器之前会对其进行处理。此参数仅告诉您要执行重定向,servlet将在评估后将其删除 另见:
@Named
@ViewScoped
public class ResultManagerFilterHandler
{
...
// status flags secretly coming in via Flash from dashboard
private List<String> secretStatusFlags;
@Override
@PostConstruct
public void init()
{
...
@SuppressWarnings( "unchecked" )
List<String> secretStatusFlags = ( List<String> ) FacesContext.getCurrentInstance().getExternalContext().getFlash().get( ResultManagerDashboardHelper.SECRET_ARGS_KEY );
if ( secretStatusFlags != null )
{
System.out.println( "ResultManagerFilterHandler secret arguments have arrived via JSF Flash! Size = " + secretStatusFlags.size() );
}
else
{
System.out.println( "ResultManagerFilterHandler: NO secret arguments have arrived via JSF Flash!" );
}
// sits in view scope waiting to be picked up by search routine in ResultManager (also view-scoped)
this.secretStatusFlags = secretStatusFlags;
}
}
@Named
@ViewScoped
public class ResultManager
{
...
@Inject
private ResultManagerFilterHandler filterHandler;
@Override
public void searchInitially()
{
// get Flash object from filter handler
List<String> statusFlags = this.getFilterHandler().getSecretStatusFlags();
System.out.println( "ResultManager statusFlags = " + statusFlags );
// if flash args have been passed, prefer that view over the standard one
if ( statusFlags != null && !statusFlags.isEmpty() )
{
System.out.println( "Flash search!" );
// set to today and decrypt the passed status flags (this is supposed to override the default search filter!)
this.filterHandler.setSelectedPeriod( EPeriod.TODAY );
this.filterHandler.calculateBeginEndDates( this.filterHandler.getSelectedPeriod() );
this.filterHandler.setTodoOnly( statusFlags.size() == 1 && statusFlags.get( 0 ).equals( "TODO" ) );
this.search();
}
else
{
System.out.println( "Non-flash search!" );
super.searchInitially();
}
}
}
18:58:42,840 INFO [] (134) Setting flash secret args to [TODO, DONE]
18:58:42,840 INFO [] (134) Redirecting from '/view/dashboard' to '/view/resultmgmt/resultManager?faces-redirect=true'
18:58:43,039 INFO [] (135) ResultManagerFilterHandler: NO secret arguments have arrived via JSF Flash!
18:58:44,350 INFO [] (135) ResultManager statusFlags = []
18:58:44,350 INFO [] (135) Non-flash search!