Skip to content
This repository has been archived by the owner on Sep 5, 2023. It is now read-only.

f:view lifetime events #8

Closed
glassfishrobot opened this issue Aug 20, 2004 · 19 comments
Closed

f:view lifetime events #8

glassfishrobot opened this issue Aug 20, 2004 · 19 comments

Comments

@glassfishrobot
Copy link

On Thu, 19 Aug 2004 14:06:40 -0700, Adam Winer adam.winer@oracle.com said:

AW> Ed,
AW> One other thing I've seen a lot of users begging for
AW> is some sort of "onload" method that they can use for
AW> basic per-page initialization code (e.g., fire the
AW> database query now). Something as simple as:

AW> <f:view beginRender="#

{MethodBinding here}"
AW> endRender="#{MethodBinding here}

">

AW> ... or even (delivering PhaseEvents):

AW> <f:view beginPhase="#

{MethodBinding here}"
AW> endPhase="#{MethodBinding here}

">

AW> ... would be a huge plus to many.

AW> (Per-component init/cleanup methods would also
AW> be handy for some performance issues, but that's
AW> a lot less important.)

Environment

Operating System: All
Platform: Sun

Affected Versions

[1.2]

@glassfishrobot
Copy link
Author

Reported by @edburns

@glassfishrobot
Copy link
Author

@edburns said:
up to p2 feature

@glassfishrobot
Copy link
Author

@edburns said:
https://javaserverfaces.dev.java.net/issues/show_bug.cgi?id=39

Add to <f:view> some useful listeners. F.g. for preparing backin bean on this
page (init event), for releasing resorces after response was generated (finalize
event) etc.

There are some threads on forum about this problem for instance:
http://forum.java.sun.com/thread.jsp?forum=427&thread=541382

@glassfishrobot
Copy link
Author

rogerk said:
Taking ownership.

@glassfishrobot
Copy link
Author

@edburns said:
Take ownership

@glassfishrobot
Copy link
Author

@edburns said:
Issue: 8-ViewLifecycle phase II, the JSP layer

This change-bundle adds the jsp layer to the implementation of
8-ViewLifecycle.

A systest/src/com/sun/faces/jsptest/ViewRootPhaseListenerTestCase.java
A systest/src/com/sun/faces/systest/model/PrintEventToRequestMapPhaseListener.java
A systest/web/listenerTagListenersBinding.jsp
A systest/web/listenerTagListenersBindingType.jsp
A systest/web/listenerTagListenersType.jsp
A systest/web/viewTagListeners.jsp

  • new testcase that exercises all the ways phaseListeners can be added
    to a UIViewRoot from JSP.

M systest/web/WEB-INF/faces-config.xml

  • bean for testcase

A src/com/sun/faces/taglib/jsf_core/PhaseListenerTag.java

  • Tag implementation that creates a {@link PhaseListener}

    instance

  • and registers it on the {@link UIViewRoot} associated with our most

    • immediate surrounding instance of a tag whose component
    • is an instance of {@link UIViewRoot}

    . This tag creates no output to the

  • page currently being created.

M conf/share/jsf_core.tld

  • add phaseListener tag

  • add beforePhase and afterPhase attributes to viewTag

M src/com/sun/faces/taglib/jsf_core/ViewTag.java

  • add beforePhase and afterPhase String setters.

  • add supporting code to setProperties()

Index: conf/share/jsf_core.tld

RCS file: /cvs/javaserverfaces-sources/jsf-ri/conf/share/jsf_core.tld,v
retrieving revision 1.45
diff -u -r1.45 jsf_core.tld
— conf/share/jsf_core.tld 2 Dec 2004 18:42:22 -0000 1.45
+++ conf/share/jsf_core.tld 7 Dec 2004 22:41:57 -0000
@@ -522,6 +522,38 @@

  • phaseListener
  • com.sun.faces.taglib.jsf_core.PhaseListenerTag
  • com.sun.faces.taglib.FacesTagExtraInfo
  • empty
  • Register a PhaseListener instance on the UIViewRoot in which
  • this tag is nested.
  • type
  • false
  • false
  • Fully qualified Java class name of an PhaseListener to be
  • created and registered.
  • binding
  • false
  • false
  • Value binding expression that evaluates to an object that
  • implements javax.faces.event.PhaseListener.

@@ -951,6 +983,30 @@
Locale to use for localizing this page. Expressions
must evaluate to a java.util.Locale or to a String
that is converted to a Locale.

  • beforePhase
  • false
  • false
  • MethodBinding pointing to a method that takes a
  • javax.faces.event.PhaseEvent and returns void. This method
  • will be called before every phase except for restore view.
  • afterPhase
  • false
  • false
  • MethodBinding pointing to a method that takes a
  • javax.faces.event.PhaseEvent and returns void. This method
  • will be called after every phase except for restore view.

Index: src/com/sun/faces/taglib/jsf_core/ViewTag.java

RCS file:
/cvs/javaserverfaces-sources/jsf-ri/src/com/sun/faces/taglib/jsf_core/ViewTag.java,v
retrieving revision 1.28
diff -u -r1.28 ViewTag.java
— src/com/sun/faces/taglib/jsf_core/ViewTag.java 23 Nov 2004 19:26:53 -0000 1.28
+++ src/com/sun/faces/taglib/jsf_core/ViewTag.java 7 Dec 2004 22:41:58 -0000
@@ -22,6 +22,8 @@
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.el.ValueBinding;
+import javax.faces.el.MethodBinding;
+import javax.faces.event.PhaseEvent;
import javax.faces.webapp.UIComponentBodyTag;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
@@ -68,6 +70,19 @@
locale = newLocale;
}

  • protected String beforePhase = null;
  • public void setBeforePhase(String newBeforePhase)

{ + beforePhase = newBeforePhase; + }

  • protected String afterPhase = null;
  • public void setAfterPhase(String newAfterPhase)

{ + afterPhase = newAfterPhase; + }

// Relationship Instance Variables

//
@@ -258,10 +273,12 @@
super.setProperties(component);
Locale viewLocale = null;
ValueBinding vb = null;

  • MethodBinding mb = null;
  • UIViewRoot viewRoot = (UIViewRoot) component;
    if (null != locale) {
    if (isValueReference(locale)) {
  • component.setValueBinding("locale",

  • vb = Util.getValueBinding(locale));

    • viewRoot.setValueBinding("locale",
    • vb = Util.getValueBinding(locale));
      Object resultLocale =
      vb.getValue(FacesContext.getCurrentInstance());
      if (resultLocale instanceof Locale) { @@ -272,7 +289,7 @@ }

    else

    { viewLocale = getLocaleFromString(locale); }

  • ((UIViewRoot) component).setLocale(viewLocale);

    • viewRoot.setLocale(viewLocale);
      // update the JSTL locale attribute in request scope so that
      // JSTL picks up the locale from viewRoot. This attribute
      // must be updated before the JSTL setBundle tag is called
      @@ -280,7 +297,28 @@
      // is created based on the locale.
      Config.set(pageContext.getRequest(),Config.FMT_LOCALE, viewLocale);
      }
    • if (null != beforePhase) {
    • if (isValueReference(beforePhase))Unknown macro: {+ Class args[] = { PhaseEvent.class };
    • mb =
      FacesContext.getCurrentInstance().getApplication().createMethodBinding(beforePhase,
      args);
    • viewRoot.setBeforePhaseListener(mb);
    • } else {
    • Object params [] = {beforePhase};
    • throw new
      javax.faces.FacesException(Util.getExceptionMessageString(Util.INVALID_EXPRESSION_ID,
      params));
    • }
    • }
    • if (null != afterPhase) {
    • if (isValueReference(afterPhase)) {
    • Class args[] = { PhaseEvent.class };+ mb =FacesContext.getCurrentInstance().getApplication().createMethodBinding(afterPhase,args);+ viewRoot.setAfterPhaseListener(mb);+ + }

    else

    Unknown macro: {+ Object params [] = {afterPhase};+ throw newjavax.faces.FacesException(Util.getExceptionMessageString(Util.INVALID_EXPRESSION_ID,params));+ }

    • }
      }

Index: systest/web/WEB-INF/faces-config.xml

RCS file: /cvs/javaserverfaces-sources/jsf-ri/systest/web/WEB-INF/faces-config.xml,v
retrieving revision 1.35
diff -u -r1.35 faces-config.xml
— systest/web/WEB-INF/faces-config.xml 2 Dec 2004 18:42:28 -0000 1.35
+++ systest/web/WEB-INF/faces-config.xml 7 Dec 2004 22:41:59 -0000
@@ -134,6 +134,17 @@
session

  • phaseListener
  • com.sun.faces.systest.model.PrintEventToRequestMapPhaseListener
  • request
  • phaseIdString
  • ANY_PHASE

@glassfishrobot
Copy link
Author

@edburns said:
Created an attachment (id=6)
new classes for recently attached change-bundle

@glassfishrobot
Copy link
Author

File: 8-newclasses.tar.gz
Attached By: @edburns

@glassfishrobot
Copy link
Author

rogerk said:
r=rogerk

@glassfishrobot
Copy link
Author

@edburns said:
fixed in EDR

@glassfishrobot
Copy link
Author

@edburns said:
While working on an updated demo, I found a small bug with this issue.

We need to specify that the responseComplete or renderResponse flags must be
checked after each listener invocation to ensure that the proper skipping takes
place. Without doing this, it's not possible to write a phaseListener that, for
example, listens for the beforeRender event and skips rendering.

@glassfishrobot
Copy link
Author

@edburns said:
[8-UIViewRootPhaseListener] check for skipping

This change-bundle changes the spec and implements the change.

SECTION: jsf-api changes

M src/javax/faces/component/UIViewRoot.java

  • specify that the responseComplete and renderResponse flags must be
    checked after each listener, as they are for the regular lifecycle
    phase listeners. If either are set, don't do the normal processing,
    but do call the phase listeners.

M test/javax/faces/component/UIViewRootTestCase.java

  • exercise new code

SECTION: jsf-api diffs

Index: src/javax/faces/component/UIViewRoot.java

RCS file:
/cvs/javaserverfaces-sources/jsf-api/src/javax/faces/component/UIViewRoot.java,v
retrieving revision 1.33
diff -u -r1.33 UIViewRoot.java
— src/javax/faces/component/UIViewRoot.java 18 Mar 2005 14:52:07 -0000 1.33
+++ src/javax/faces/component/UIViewRoot.java 12 Apr 2005 21:39:24 -0000
@@ -60,17 +60,31 @@
*

    • * + *

      Initialize a state flag to false.

      + *
    • If {@link #getBeforePhaseListener}

      returns non-null,

    • invoke the listener, passing in the correct corresponding {@link * PhaseId}

      for this phase.


      *

        • Upon return from the listener, call

      {@link + * FacesContext#getResponseComplete} and {@link + * FacesContext#getRenderResponse}. If either return true

        • set the internal state flag to true.

      • If or one or more listeners have been added by a call to {@link * #addPhaseListener}, invoke the beforePhase method on

      • each one whose {@link PhaseListener#getPhaseId} matches the current
      • phaseId, passing in the same PhaseId as in the previous
      • step.

        • Execute any processing for this phase.

        • Upon return from each listener, call {@link + * FacesContext#getResponseComplete}

      and

      {@link + * FacesContext#getRenderResponse}

      . If either return true

        • set the internal state flag to true.

        • Execute any processing for this phase if the internal state flag

        • was not set.

    • If {@link #getAfterPhaseListener}

      returns non-null,

    • invoke the listener, passing in the correct corresponding {@link
      @@ -130,6 +144,14 @@

    private int lastId = 0;

    • /**
      • Set and cleared during the lifetime of a lifecycle phase. Has

      • no meaning between phases. If true, the lifecycle
      • processing for the current phase must not take place.

    • */
    • private boolean skipPhase;

    // -------------------------------------------------------------- Properties

    @@ -437,13 +459,16 @@

    • is null
      */
      public void processDecodes(FacesContext context) {

      • skipPhase = false;
        // avoid creating the PhaseEvent if possible by doing redundant
        // null checks.
        if (null != beforePhase || null != phaseListeners) { notifyPhaseListeners(context, PhaseId.APPLY_REQUEST_VALUES, true); }
    • super.processDecodes(context);

    • broadcastEvents(context, PhaseId.APPLY_REQUEST_VALUES);

      • if (!skipPhase) { + super.processDecodes(context); + broadcastEvents(context, PhaseId.APPLY_REQUEST_VALUES); + }

      // clear out the events if we're skipping to render-response
      // or if there is a response complete signal.
      if (context.getRenderResponse() || context.getResponseComplete()) {
      @@ -484,13 +509,16 @@
      public void encodeBegin(FacesContext context) throws IOException {
      lastId = 0;

    • skipPhase = false;
      // avoid creating the PhaseEvent if possible by doing redundant
      // null checks.
      if (null != beforePhase || null != phaseListeners)

    { notifyPhaseListeners(context, PhaseId.RENDER_RESPONSE, true); }

    • super.encodeBegin(context);
      +

      • if (!skipPhase) { + super.encodeBegin(context); + }

      }

    /**
    @@ -535,10 +563,12 @@
    (isBefore && (null != beforePhase)) ||
    (!isBefore && (null != afterPhase));
    MethodBinding binding = isBefore ? beforePhase : afterPhase;

      if (hasPhaseMethodBinding) {
      try

      Unknown macro: { binding.invoke(context, new Object [] { event });+ skipPhase = context.getResponseComplete() ||+ context.getRenderResponse(); }

      catch (Exception e)

      Unknown macro: { // PENDING(edburns)}

      catch (Exception e) {
      // PENDING(edburns): log this
      @@ -598,18 +630,19 @@

    • is null
      */
      public void processValidators(FacesContext context) {

      • skipPhase = false;
        // avoid creating the PhaseEvent if possible by doing redundant
        // null checks.
        if (null != beforePhase || null != phaseListeners) { notifyPhaseListeners(context, PhaseId.PROCESS_VALIDATIONS, true); }
    • super.processValidators(context);

    • broadcastEvents(context, PhaseId.PROCESS_VALIDATIONS);

      • if (!skipPhase) { + super.processValidators(context); + broadcastEvents(context, PhaseId.PROCESS_VALIDATIONS); + }

      // clear out the events if we're skipping to render-response
      // or if there is a response complete signal.

    • if (context.getRenderResponse() || context.getResponseComplete()) {

      • if (context.getRenderResponse() || context.getResponseComplete()) {
        if (events != null) {
        for (int i=0; i<PhaseId.VALUES.size(); i++) {
        List eventList = events[i];
        @@ -642,15 +675,16 @@
    • is null
      */
      public void processUpdates(FacesContext context) {

      • skipPhase = false;
        // avoid creating the PhaseEvent if possible by doing redundant
        // null checks.
        if (null != beforePhase || null != phaseListeners) { notifyPhaseListeners(context, PhaseId.UPDATE_MODEL_VALUES, true); }
    • super.processUpdates(context);

    • broadcastEvents(context, PhaseId.UPDATE_MODEL_VALUES);

      • if (!skipPhase) { + super.processUpdates(context); + broadcastEvents(context, PhaseId.UPDATE_MODEL_VALUES); + }

      // clear out the events if we're skipping to render-response
      // or if there is a response complete signal.
      if (context.getRenderResponse() || context.getResponseComplete()) {
      @@ -686,15 +720,17 @@

    • is null
      */
      public void processApplication(FacesContext context) {

      • skipPhase = false;
        // avoid creating the PhaseEvent if possible by doing redundant
        // null checks.
        if (null != beforePhase || null != phaseListeners) { notifyPhaseListeners(context, PhaseId.INVOKE_APPLICATION, true); }
    • // NOTE - no tree walk is performed; this is a UIViewRoot-only operation

    • broadcastEvents(context, PhaseId.INVOKE_APPLICATION);

      • if (!skipPhase) { + // NOTE - no tree walk is performed; this is a UIViewRoot-only operation + broadcastEvents(context, PhaseId.INVOKE_APPLICATION); + }

      // clear out the events if we're skipping to render-response
      // or if there is a response complete signal.
      if (context.getRenderResponse() || context.getResponseComplete()) {
      Index: test/javax/faces/component/UIViewRootTestCase.java

      RCS file:
      /cvs/javaserverfaces-sources/jsf-api/test/javax/faces/component/UIViewRootTestCase.java,v
      retrieving revision 1.18
      diff -u -r1.18 UIViewRootTestCase.java

        • test/javax/faces/component/UIViewRootTestCase.java 18 Mar 2005 14:52:07
          -0000 1.18
          +++ test/javax/faces/component/UIViewRootTestCase.java 12 Apr 2005 21:39:25 -0000
          @@ -15,6 +15,7 @@
          import java.util.Iterator;
          import java.util.List;
          import java.util.Locale;
          +import java.io.IOException;
          import javax.faces.FactoryFinder;
          import javax.faces.event.AbortProcessingException;
          import javax.faces.event.FacesEvent;
          @@ -25,6 +26,7 @@
          import javax.faces.context.FacesContext;
          import javax.faces.component.UIComponent;
          import javax.faces.component.UIViewRoot;
          +import javax.faces.component.UIInput;
          import javax.faces.event.PhaseId;
          import javax.faces.el.ValueBinding;
          import javax.faces.el.MethodBinding;
          @@ -208,19 +210,33 @@

    public void testPhaseMethBinding() throws Exception

    { UIViewRoot root = facesContext.getApplication().getViewHandler().createView(facesContext, null); - doTestPhaseMethodBinding(root); + doTestPhaseMethodBinding(root, false); + }

    • public void testPhaseMethBindingSkipping() throws Exception

    { + UIViewRoot root = facesContext.getApplication().getViewHandler().createView(facesContext, null); + doTestPhaseMethodBinding(root, true); }

    public void testPhaseListener() throws Exception

    { UIViewRoot root = facesContext.getApplication().getViewHandler().createView(facesContext, null); - doTestPhaseListener(root); + doTestPhaseListener(root, false); + }

    • public void testPhaseListenerSkipping() throws Exception

    { + UIViewRoot root = facesContext.getApplication().getViewHandler().createView(facesContext, null); + doTestPhaseListener(root, true); }

    public void testPhaseMethodBindingAndListener() throws Exception

    { UIViewRoot root = facesContext.getApplication().getViewHandler().createView(facesContext, null); - doTestPhaseMethodBindingAndListener(root); + doTestPhaseMethodBindingAndListener(root, false); }

    • public void testPhaseMethodBindingAndListenerSkipping() throws Exception

    { + UIViewRoot root = facesContext.getApplication().getViewHandler().createView(facesContext, null); + doTestPhaseMethodBindingAndListener(root, true); + }

    public void testPhaseMethBindingState() throws Exception

    { UIViewRoot root = facesContext.getApplication().getViewHandler().createView(facesContext, null); @@ -228,7 +244,7 @@ root = facesContext.getApplication().getViewHandler().createView(facesContext, null); root.restoreState(facesContext, state); - doTestPhaseMethodBinding(root); + doTestPhaseMethodBinding(root, false); }

    public void testPhaseListenerState() throws Exception

    { @@ -237,7 +253,7 @@ root = facesContext.getApplication().getViewHandler().createView(facesContext, null); root.restoreState(facesContext, state); - doTestPhaseListener(root); + doTestPhaseListener(root, false); }

    public void testPhaseMethodBindingAndListenerState() throws Exception

    { @@ -246,18 +262,37 @@ root = facesContext.getApplication().getViewHandler().createView(facesContext, null); root.restoreState(facesContext, state); - doTestPhaseMethodBindingAndListener(root); + doTestPhaseMethodBindingAndListener(root, false); }

    • public void doTestPhaseMethodBinding(UIViewRoot root) throws Exception {

      • public void doTestPhaseMethodBinding(UIViewRoot root,
      • boolean skipping) throws Exception {
      • PhaseSkipTestComponent comp = null;
      • if (skipping) { + comp = new PhaseSkipTestComponent(); + root.getChildren().add(comp); + facesContext.responseComplete(); + }
        doTestPhaseMethodBindingWithPhaseId(root,
        PhaseId.APPLY_REQUEST_VALUES);
      • if (skipping) { + assertTrue(!comp.isDecodeCalled()); + }
        doTestPhaseMethodBindingWithPhaseId(root, PhaseId.PROCESS_VALIDATIONS);
      • if (skipping) { + assertTrue(!comp.isProcessValidatorsCalled()); + }
        doTestPhaseMethodBindingWithPhaseId(root, PhaseId.UPDATE_MODEL_VALUES);
      • if (skipping) { + assertTrue(!comp.isProcessUpdatesCalled()); + }
        doTestPhaseMethodBindingWithPhaseId(root, PhaseId.INVOKE_APPLICATION);
        doTestPhaseMethodBindingWithPhaseId(root, PhaseId.RENDER_RESPONSE);
      • if (skipping) { + assertTrue(!comp.isEncodeBeginCalled()); + }

      }

      @@ -282,13 +317,32 @@
      }

      • public void doTestPhaseListener(UIViewRoot root) throws Exception {
      • public void doTestPhaseListener(UIViewRoot root,
      • boolean skipping) throws Exception {
      • PhaseSkipTestComponent comp = null;
      • if (skipping) { + comp = new PhaseSkipTestComponent(); + root.getChildren().add(comp); + facesContext.responseComplete(); + }

      doTestPhaseListenerWithPhaseId(root,
      PhaseId.APPLY_REQUEST_VALUES);

      • if (skipping)

      { + assertTrue(!comp.isDecodeCalled()); + }
      doTestPhaseListenerWithPhaseId(root, PhaseId.PROCESS_VALIDATIONS);

      • if (skipping) { + assertTrue(!comp.isProcessValidatorsCalled()); + }
        doTestPhaseListenerWithPhaseId(root, PhaseId.UPDATE_MODEL_VALUES);
      • if (skipping) { + assertTrue(!comp.isProcessUpdatesCalled()); + }
        doTestPhaseListenerWithPhaseId(root, PhaseId.INVOKE_APPLICATION);
        doTestPhaseListenerWithPhaseId(root, PhaseId.RENDER_RESPONSE);
      • if (skipping) { + assertTrue(!comp.isEncodeBeginCalled()); + }

      }

      @@ -306,17 +360,36 @@
      }

      • public void doTestPhaseMethodBindingAndListener(UIViewRoot root) throws
        Exception {
      • public void doTestPhaseMethodBindingAndListener(UIViewRoot root,
      • boolean skipping) throws Exception {
      • PhaseSkipTestComponent comp = null;
      • if (skipping) { + comp = new PhaseSkipTestComponent(); + root.getChildren().add(comp); + facesContext.responseComplete(); + }
        doTestPhaseMethodBindingAndListenerWithPhaseId(root,
        PhaseId.APPLY_REQUEST_VALUES);
      • if (skipping) { + assertTrue(!comp.isDecodeCalled()); + }

      doTestPhaseMethodBindingAndListenerWithPhaseId(root,
      PhaseId.PROCESS_VALIDATIONS);

      • if (skipping)

      { + assertTrue(!comp.isProcessValidatorsCalled()); + }

      doTestPhaseMethodBindingAndListenerWithPhaseId(root,
      PhaseId.UPDATE_MODEL_VALUES);

      • if (skipping)

      { + assertTrue(!comp.isProcessUpdatesCalled()); + }

      doTestPhaseMethodBindingAndListenerWithPhaseId(root,
      PhaseId.INVOKE_APPLICATION);
      doTestPhaseMethodBindingAndListenerWithPhaseId(root,
      PhaseId.RENDER_RESPONSE);

      • if (skipping)

      { + assertTrue(!comp.isEncodeBeginCalled()); + }

    }

    @@ -673,6 +746,46 @@

    public PhaseId getPhaseId()

    { return phaseId; }

    • }
    • public static class PhaseSkipTestComponent extends UIInput {
    • private boolean decodeCalled = false;
    • public void decode(FacesContext context)

    { + decodeCalled = true; + }

    • public boolean isDecodeCalled()

    { return decodeCalled; }

    • private boolean encodeBeginCalled = false;
    • public void encodeBegin(FacesContext context) throws IOException

    { + encodeBeginCalled = true; + }

    • public boolean isEncodeBeginCalled()

    { return encodeBeginCalled; }

    • private boolean processValidatorsCalled = false;
    • public void processValidators(FacesContext context)

    { + processValidatorsCalled = true; + }

    • public boolean isProcessValidatorsCalled()

    { + return processValidatorsCalled; + }

    • private boolean processUpdatesCalled = false;
    • public void processUpdates(FacesContext context)

    { + processUpdatesCalled = true; + }

    • public boolean isProcessUpdatesCalled()

    { + return processUpdatesCalled; + }

    }

@glassfishrobot
Copy link
Author

@edburns said:
Need to fix this as well, since it is no longer true after TCCI:

4. Made UViewRoot a source of PhaseEvent(s) for all phases of
the request processing lifecycle except
RestoreView. Provided additional "before" and "after" phase
listener attributes for the <f:view> tag. Please see Section
4.1.17 "UIViewRoot" for details.

@glassfishrobot
Copy link
Author

@edburns said:
Actually, the currently specified behavior is correct.

@glassfishrobot
Copy link
Author

@edburns said:
Prepare to delete "spec" subcomponent.

@glassfishrobot
Copy link
Author

@edburns said:
Move all to 1.2

@glassfishrobot
Copy link
Author

Marked as fixed on Thursday, March 4th 2010, 6:09:30 am

@glassfishrobot
Copy link
Author

@manfredriem said:
Closing resolved issue out

@glassfishrobot
Copy link
Author

This issue was imported from java.net JIRA JAVASERVERFACES_SPEC_PUBLIC-8

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

2 participants