标签: flash-scope

理解JSF2中的Flash Scope

根据我的理解,面部请求生命周期中放置在Flash作用域内的对象将可用于下一个面部请求生命周期,然后清除.

假设我有两页:

page01.xhtml:

<h:form>
    <h:commandButton  action="#{page01Bean.action}" />
</h:form>
Run Code Online (Sandbox Code Playgroud)

Page01Bean:

@ManagedBean
@RequestScoped
public class Page01Bean {

        public void action(){
            FacesContext.getCurrentInstance().getExternalContext().getFlash().put("fooKey", "fooValue");
        }

}
Run Code Online (Sandbox Code Playgroud)

page02.xhtml:

<h:outputText value="#{flash.fooKey}"/> 
Run Code Online (Sandbox Code Playgroud)

因此,当page01.xhtml单击按钮时,面部请求生命周期(比如生命周期A)开始并将值设置为所调用的键下的闪存fooKey

然后我打开另一个浏览器选项卡并浏览 page02.xhtml.另一个面临请求生命周期(比如生命周期B)开始呈现此页面.我预计生命周期B可以访问其上一个生命周期的闪存范围(即生命周期A)并显示fooValue在其中 page02.xhtml.但是,它什么也没显示.

请纠正我在这个例子中对闪存范围的误解.非常感谢

jsf jsf-2 flash-scope

30
推荐指数
2
解决办法
4万
查看次数

从JSF获取警告:当我们尝试为闪存设置传出cookie时,响应已经提交

我有一个page1.jsf,在这个页面中我有一个commandButton,它将一个对象放在ELFlash中,并重定向到page2.jsf.在这个页面中,我通过ELFlash恢复对象.一切正常.但是当用户保留在page2.jsf中时,对于每个ajax请求,tomcat都会显示以下警告消息:

20/07/2013 09:43:37 com.sun.faces.context.flash.ELFlash setCookie
WARNING: JSF1095: The response was already committed by the time we tried to set the outgoing cookie for the flash.  Any values stored to the flash will not be available on the next request.
Run Code Online (Sandbox Code Playgroud)

它到底意味着什么?

cookies jsf jsf-2 flash-scope

15
推荐指数
2
解决办法
1万
查看次数

如何在过滤器中检索FacesContext

如何在过滤器中检索FacesContext?

我跟着就如何检索下面的文章FacesContextFilter:

http://ocpsoft.org/java/jsf-java/jsf-20-extension-development-accessing-facescontext-in-a-filter/

但问题是它无法使用Flash作用域.关注NPE:

java.lang.NullPointerException
at com.sun.faces.context.flash.ELFlash.loggingGetPhaseMapForWriting(ELFlash.java:751)
at com.sun.faces.context.flash.ELFlash.getPhaseMapForWriting(ELFlash.java:785)
at com.sun.faces.context.flash.ELFlash.put(ELFlash.java:392)
at com.sun.faces.context.flash.ELFlash.put(ELFlash.java:112)
Run Code Online (Sandbox Code Playgroud)

我想在我的过滤器中添加重定向并使用闪存范围来保存一些数据以及消息,这是无效的.

jsf facescontext servlet-filters flash-scope

12
推荐指数
1
解决办法
8147
查看次数

重定向后,Flash范围中的对象不可用

我对jsf 2中闪存范围的使用存在误解.我想在操作过程中将对象放在flash地图中,并在下一页显示该对象.这是我的动作(由h:commandLink调用):

public String showDetail(PersonneDTO personne) {
    MessageFlashBean message = new MessageFlashBean();
    message.addMessage("test");
    FacesContext.getCurrentInstance().getExternalContext().getFlash()
        .put("test", message);
    return "showDetail";
}
Run Code Online (Sandbox Code Playgroud)

这只是一个测试,但我想要使用的真实对象更复杂.

这是闪存使用的第二页:

<ui:fragment rendered="#{flash.test != null and flash.test.hasMessage()}" >
    <ui:repeat var="message" value="#{flash.test.messages}">
        #{message}
    </ui:repeat>
</ui:fragment>
Run Code Online (Sandbox Code Playgroud)

这是导航(这是我的问题:)):

<navigation-rule>
    <from-view-id>/index.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>showDetail</from-outcome>
        <to-view-id>/private/showDetail.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,闪存范围工作正常,我的消息出现.

但是如果我在导航的情况下添加一个重定向,我在Flash地图中的对象就消失了.

我不明白为什么我不能在导航规则中使用重定向(我相信这是flash范围的目标).

我的代码可能有问题.

有人可以帮帮我吗?

谢谢

navigation jsf-2 flash-scope

11
推荐指数
1
解决办法
7679
查看次数

关于Mojarra JSF中闪存的例外情况

我升级到Mojarra JSF 2.2.1(从2.1.22开始),从那时起我的每个请求都在控制台中出现异常:

GRAVE: JSF1094: Could not decode flash data from incoming cookie value /?.  
Processing will continue, but the flash is unavailable for this request.
com.sun.faces.lifecycle.InvokeApplicationPhase execute
Run Code Online (Sandbox Code Playgroud)

当我没有使用闪存范围时,请求成功完成.但是,因为我正在使用此范围FacesMessages,如果我在此处输入消息,我有一个NullPointerException并且导航流程被中断:

GRAVE: El Servlet.service() para servlet Faces Servlet lanzó una excepción
java.lang.NullPointerException
    at com.sun.faces.context.flash.ELFlash.loggingGetPhaseMapForWriting(ELFlash.java:803)
    at com.sun.faces.context.flash.ELFlash.setKeepMessages(ELFlash.java:323)
    at org.omnifaces.util.Messages.addFlash(Messages.java:460)
    at org.omnifaces.util.Messages.addFlashInfo(Messages.java:488)
    at com.company.view.utils.FacesUtils.addInfoMessage(FacesUtils.java:91)
    at com.company.view.utils.FacesUtils.addInfoMessage(FacesUtils.java:79)
    at com.company.view.beans.navegable.detectables.generic.NavegableDetectableAddGeneric.save(NavegableDetectableAddGeneric.java:92)
    at com.company.view.beans.navegable.detectables.generic.NavegableDetectableAddGeneric.actionSave(NavegableDetectableAddGeneric.java:55)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    at …
Run Code Online (Sandbox Code Playgroud)

firefox tomcat6 jsf-2 mojarra flash-scope

11
推荐指数
1
解决办法
1万
查看次数

从闪存中删除JSF消息

我有一个页面可以执行某些操作,当用户单击按钮时,用户将被重定向到另一个页面并显示一条消息.这是我的代码:

 public String confirm() {
    FacesContext context = FacesContext.getCurrentInstance();
    Flash flash = context.getExternalContext().getFlash();
    flash.setKeepMessages(true);
    FacesMessage msg = new FacesMessage("Succesful", "Release is confirmed!");
    context.addMessage(null, msg);
    return "/prot/expert/releases?faces-redirect=true";
 }
Run Code Online (Sandbox Code Playgroud)

我使用ap:growl组件在"发布"页面上显示我的消息.到现在为止还挺好.

但是然后在任何后续页面上有p:growl(或者如果我转到另一个页面并返回),消息会一次又一次地显示,我无法杀死它.

我尝试过类似的东西:

<c:set target="#{flash}" property="keepMessages" value="false" />
Run Code Online (Sandbox Code Playgroud)

在具有p:growl的页面上,我尝试从支持bean等清除闪存.

该消息将被保留并重新显示.如果我删除flash.setKeepMessages(true); 从上面的代码,然后没有显示任何内容.

我究竟做错了什么?

jsf primefaces jsf-2 flash-scope

9
推荐指数
1
解决办法
7442
查看次数

Flash范围是否没有竞争条件?

我发现JSF 2.0 Flash范围是通过cookie在Mojarra 2.x中实现的.似乎发生的情况是,当使用Flash从视图A导航到视图B时,JSF会发送重定向响应.这是包含set-cookie标头的相同响应.

由于cookie是浏览器的全局,我想知道这会导致竞争条件的可能性.由于在重定向响应期间设置了cookie,我试图找出HTTP规范是否以某种方式保证浏览器响应的请求始终是第一个使用此cookie的请求.

但是,一般情况下,如果第一个请求以某种方式停止(因为Internet决定将该特定请求路由到世界各地),则可能仍然存在问题,然后来自另一个选项卡的第二个请求首先到达服务器.

对于两页之间的闪存范围而言,使用cookie不是一个可怕的想法,或者我是否忽略了某些东西并且它是否非常安全?

java cookies redirect jsf-2 flash-scope

8
推荐指数
1
解决办法
585
查看次数

如何在页面重新加载时保持JSF flash范围参数?

我使用flash scope在@viewscoped控制器之间传递一个设置对象.但是如果我在其中一个页面上重新加载页面,则flash地图为空,并且设置对象未初始化.是否可以在页面重新加载时保持闪存范围?

我的源代码存储/检索设置:

FistPage.xhtml

...
<p:commandButton value="next"
    action="#{firstPageController.transferConfig}"  
    process="@this" />
...
Run Code Online (Sandbox Code Playgroud)

FirstPageController.java

@ManagedBean(name = "firstPageController")
@ViewScoped
public class FirstPageController {
...
public String transferConfig() {
FacesContext.getCurrentInstance().getExternalContext().getFlash().put("searchConfig",   searchConfig);
return "/secondPage.xhtml?faces-redirect=true";
}
...
}
Run Code Online (Sandbox Code Playgroud)

SecondPage.xhtml

...
<h:outputLabel value="value">
    <f:event type="preRenderComponent" listener="#{secondPageController.onPageLoad()}"/>
</h:outputLabel>
...
Run Code Online (Sandbox Code Playgroud)

SecondPageController.java

@ManagedBean(name = "secondPageController")
@ViewScoped
public class SecondPageController {
    ...
    public void onPageLoad() 
    {
        flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();

        searchConfig = ((SearchFilterConfig) flash.get("searchConfig"));

        flash.putNow("searchConfig", searchConfig);

        flash.keep("searchConfig");
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我使用Mojarra 2.1.29

谢谢

jsf-2 flash-scope

8
推荐指数
1
解决办法
7958
查看次数

com.sun.faces.context.flash.ELFlash.loggingGetPhaseMapForReading中的java.lang.NullPointerException

我正在使用JSF-2.1.2在apache-tomcat-7.0.16中运行我的应用程序.在faces-config.xml中添加导航规则后,我收到了NullPointerException.此错误已在JSF论坛中提交.JSF和tomcat应用服务器之间是否有任何兼容版本或任何解决方案?错误堆栈跟踪如下:

java.lang.NullPointerException
    at com.sun.faces.context.flash.ELFlash.loggingGetPhaseMapForReading(ELFlash.java:793)
    at com.sun.faces.context.flash.ELFlash.getPhaseMapForReading(ELFlash.java:826)
    at com.sun.faces.context.flash.ELFlash.isEmpty(ELFlash.java:484)
    at com.sun.faces.facelets.util.DevTools.writeVariables(DevTools.java:325)
    at com.sun.faces.facelets.util.DevTools.writeVariables(DevTools.java:215)
    at com.sun.faces.facelets.util.DevTools.debugHtml(DevTools.java:130)
    at com.sun.faces.renderkit.RenderKitUtils.renderHtmlErrorPage(RenderKitUtils.java:1159)
    at com.sun.faces.context.ExceptionHandlerImpl.throwIt(ExceptionHandlerImpl.java:269)
    at com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:141)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
    at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:546)
    at com.sun.faces.application.view.JspViewHandlingStrategy.executePageToBuildView(JspViewHandlingStrategy.java:364)
    at com.sun.faces.application.view.JspViewHandlingStrategy.buildView(JspViewHandlingStrategy.java:154)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:662)
Run Code Online (Sandbox Code Playgroud)

jsf-2 tomcat7 flash-scope

7
推荐指数
1
解决办法
4781
查看次数

将Flash消息发送到重定向页面

我有一个页面,我在保存数据时添加新项目我转到其他页面,我想看到"数据已成功保存"的消息.我读到该消息属于请求范围,这就是我使用闪存范围的原因.

context.addMessage("calendarGameForm:growl", new FacesMessage("Data was saved successful");
context.getExternalContext().getFlash().setKeepMessages(true);
return outcome;
Run Code Online (Sandbox Code Playgroud)

这是由第一页上的保存按钮调用的addSeason.xhtml.

<p:commandButton id="save" action="#{controller.add}"
                 value="#{msg.save}" ajax="true"
                 type="submit" update="@form"/>
Run Code Online (Sandbox Code Playgroud)

导航规则定义如下.

<navigation-rule>
    <from-view-id>/competitions/addSeason.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/competitions/calendarGame.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
    <navigation-case>
        <from-outcome>fail</from-outcome>
        <to-view-id>/competitions/calendarGame.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>
Run Code Online (Sandbox Code Playgroud)

但是在目标页面中,calendarGame.xhtml我没有收到我的消息.

<p:growl id="growl" globalOnly="true" sticky="true"/>
Run Code Online (Sandbox Code Playgroud)

我也在服务器日志中收到此警告.

警告[javax.enterprise.resource.webcontainer.jsf.flash](ajp - 127.0.0.1-8009-1)JSF1095:当我们尝试为闪存设置传出cookie时,响应已经提交.存储在闪存中的任何值在下一个请求中都不可用.

我怎么能解决我的问题?

java redirect message jsf-2 flash-scope

6
推荐指数
1
解决办法
8457
查看次数