All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jakarta.faces.context.Flash Maven / Gradle / Ivy

/*
 * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package jakarta.faces.context;

import java.util.Map;

import jakarta.faces.event.PostKeepFlashValueEvent;
import jakarta.faces.event.PostPutFlashValueEvent;

/**
 * 

* The Flash concept is taken from Ruby on Rails and provides * a way to pass temporary objects between the user views generated by the faces lifecycle. As in Rails, anything one * places in the flash will be exposed to the next view encountered by the same user session and then cleared out. It is * important to note that “next view” may have the same view id as the previous view. *

* *
* *

* Implementation Requirements *

* *

* The flash is a session scoped object that must be thread safe. *

* *

* The implementation requirements will be described in terms of the runtime traversing the Jakarta Server Faces * lifecycle. The flash exposes a Map interface over two logical maps. The choice of which logical map is * accessed depends on the current faces lifecycle phase. One logical map is for the current traversal and the other is * for the next traversal. During the execute portion of the lifecycle, all flash accesses are sent to the current * traversal map. During the render portion of the lifecycle, all flash accesses are sent to the next traversal map. On * the next traversal through the lifecycle, the implementation must ensure that the current traversal map is the next * traversal map of the previous traversal. Here is an example for illustration purposes only. *

* *
* *

* Consider an initial request to the faces lifecycle *

* *

* Traversal N, execute phase: skipped on initial request. *

* *

* Traversal N, render phase: flash access goes to flash[N]. *

* *

* Traversal N+1, execute phase: flash access goes to flash[N]. *

* *

* Traversal N+1, render phase: flash access goes to flash[N+1]. *

* *
* *

* The implementation must ensure the proper behaviour of the flash is preserved even in the case of a * <navigation-case> that contains a <redirect />. The implementation must ensure * the proper behavior of the flash is preserved even in the case of adjacent GET requests on the same session. This * allows Faces applications to fully utilize the “Post/Redirect/Get” design pattern. *

* *

* The implementation must allow the user to access the flash via the Jakarta Expression Language implicit object * flash and also via {@link jakarta.faces.context.ExternalContext#getFlash}. The implementation must * ensure that the flash is usable from both Jakarta Server Pages and from Facelets for Jakarta Server Faces 2. In * addition to exposing the Map interface, there are several features exposed as methods on the * Flash itself. Each of these features may be accessed via Jakarta Expression Language as well, as * described in the javadocs. *

* *

* Jakarta Expression Language Usage Example *

* *
* *

* First page *

* *
 * 
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
<!-- extra code removed -->
  <c:set target="#{flash}" property="foo" value="fooValue" />


 * 
* *

* Next page *

* *
 * 
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
<!-- extra code removed -->
  <h:outputText value="#{flash.foo}" /> will be "fooValue"
  without the quotes.


 * 
* *
* *

* The same usage syntax must be available in Jakarta Server Pages. *

* *

* Note that extra action must be taken when using the flash in concert with output components that cause the browser to * issue a GET request when clicked, such as h:button and h:link. The following example * illustrates one way to use the flash in such circumstances. *

* *
* *

* First page *

* *
 * 
<h:button id="nextButton" value="Next (button)" outcome="next.xhtml">
  <f:param name="foo" value="bar"/>
</h:button>

 * 
* *

* Next page *

* *
 * 
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
<f:metadata>
  <f:viewParam name="foo" id="foo" value="#{flash.now.foo}" />
</f:metadata>
<head /><body>
foo = #{flash.foo}
</body>
</html>

 * 
* *
* *

* Note that this example uses #{flash.now} on the second page. This is because the value doesn't actuall * enter the flash until the server is processing the GET request sent by the browser due to the button being clicked. *

* *
* * @since 2.0 * */ public abstract class Flash implements Map { /** *

* Because null values are not allowed as the source for subclasses of EventObject, such as * {@link PostKeepFlashValueEvent} and {@link PostPutFlashValueEvent}, this value is substituted for null * as the source in the case when a null value is put to or kept in the flash. */ public static final String NULL_VALUE = "jakarta.faces.context.Flash.NULL_VALUE"; /** *

* Return the value of this JavaBeans property for the flash for this session. This value determines whether or not any * {@link jakarta.faces.application.FacesMessage} instances queued in the current * {@link jakarta.faces.context.FacesContext} must be preserved so they are accessible on the next traversal of the * lifecycle on this session, regardless of the request being a redirect after post, or a normal postback. * Map accesses for the special key “keepMessages” must return the value of this * JavaBeans property. *

* *
* * *

* Jakarta Expression Language Usage Example *

* *
* *

* First page *

* *
     * 
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
    <!-- extra code removed -->
      <c:set target="#{flash}" property="keepMessages" value="true" />

    
     * 
* *

* Next page *

* *
     * 
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://xmlns.jcp.org/jsf/html">
    <!-- extra code removed -->
      <h:messages /> Any messages present on the first page must be displayed on
      this page.

    
     * 
* *
* *
* * @return the boolean flag whether keeping messages or not. * * @since 2.0 * */ public abstract boolean isKeepMessages(); /** *

* Setter for keepMessages JavaBeans property. See {@link #isKeepMessages}. *

* * @param newValue the new value for this property on this session. * * @since 2.0 */ public abstract void setKeepMessages(boolean newValue); /** *

* Return the value of this property for the flash for this session. This must be false unless: *

* *
* * *
    * *
  • *

    * {@link #setRedirect} was called for the current lifecycle traversal with true as the argument. *

    *
  • * *
  • *

    * The current lifecycle traversal for this session is in the “execute” phase and the previous traversal had * {@link #setRedirect} called with true as the argument. *

    *
  • *
*
* * @return the value of this property for the flash for this session. * */ public abstract boolean isRedirect(); /** *

* Setting this property to true indicates that the next request on this session will be a redirect. Recall * that on a redirect, the server sends a special response to the client instructing it to issue a new request to a * specific URI. The implementation must insure that reading the value of this property on that request will return * true. *

* *
* *

* Jakarta Expression Language Usage Example *

* *
* *
     * 
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
    <!-- extra code removed -->
      <c:set target="#{flash}" property="redirect" value="true" />

    
     * 
* *
* *
* * * @param newValue the new value for this property on this session. * * @since 2.0 * */ public abstract void setRedirect(boolean newValue); /** *

* Puts a value in the flash so that it can be accessed on this traversal of the lifecycle, rather than on the next * traversal. This is simply an alias for putting a value in the request map. *

* *
* *

* Jakarta Expression Language Usage Example *

* *
* *
     * 
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
    <!-- extra code removed -->
      <c:set target="#{flash.now}" property="bar" value="barValue" />

      <p>Value of \#{flash.now.bar}, should be barValue.</p>

      <h:outputText value="#{flash.now.bar}" />

    
     * 
* *
* *
* * @param key the key for this entry * * @param value the value for this entry * * @since 2.0 * */ public abstract void putNow(String key, Object value); /** *

* Causes a value stored with a previous call to {@link #putNow}, its Jakarta Expression Language equivalent, or to the * request Map, to be promoted to the flash so that is available on the next traversal through the * lifecycle on this session. *

* * @param key if argument key is the name of an entry previously stored to the flash on this traversal * through the lifecycle via a call to {@link #putNow}, or to a set to the EL expression * #{flash.now.<key>}, or to the request Map, to be promoted to the flash as if a * call to put() or a set to the expression #{flash.<key>} was being called. */ public abstract void keep(String key); /** *

* Called before the execution of every lifecycle phase, this method allows implementations to take the necessary * actions to provide the Flash scope contract as it applies to the request procesing lifecycle. *

* * @param ctx the FacesContext for this request. */ public abstract void doPrePhaseActions(FacesContext ctx); /** *

* Called after the execution of every lifecycle phase, this method allows implementations to take the necessary actions * to provide the Flash scope contract as it applies to the request procesing lifecycle. *

* * @param ctx the FacesContext for this request. */ public abstract void doPostPhaseActions(FacesContext ctx); }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy