-
1. Re: Help with back button
gonorrhea May 12, 2009 10:09 PM (in response to gonorrhea)sorry, CreateRepairCase.seam is the page the user navigates to after clicking a link in the dataTable in ManageEquipment.seam.
-
2. Re: Help with back button
gonorrhea May 12, 2009 10:25 PM (in response to gonorrhea)Here is a difference:
booking main.xhtml (inside h:dataTable tags):
<h:column id="column5"> <f:facet id="ActionFacet" name="header">Action</f:facet> <s:link id="viewHotel" value="View Hotel" action="#{hotelBooking.selectHotel(hot)}"/> </h:column>
ManageEquipment.xhtml (inside rich:dataTable tags):
<rich:column> <f:facet name="header"><h:outputText value=""/></f:facet> <a4j:commandLink value="Create" action="#{manageEquipment.setCreateMode}" rendered="#{workOrder.equipmentRepairId == null}"/> <a4j:commandLink value="Edit" action="#{manageEquipment.processRepairHistorySelection}" rendered="#{workOrder.equipmentRepairId ne null}"/> </rich:column>
-
3. Re: Help with back button
gonorrhea May 13, 2009 12:21 AM (in response to gonorrhea)OK so I did a quick POC to break things down a bit and simplify the problem if possible.
.xhtml (first one):
<h:form> <rich:dataTable id="courseList" var="course" value="#{testBackButtonAction.searchResults}" rendered="#{not empty testBackButtonAction.searchResults}"> <h:column> <f:facet name="header"><h:outputText value="Course ID"/></f:facet> <s:link view="/TestBackButton2.xhtml" value="#{course}"/> </h:column> </rich:dataTable> <h:inputText value="#{testBackButtonAction.userInputCourseId}" id="searchBox"/> <h:commandButton id="searchBtn" value="search" action="#{testBackButtonAction.search}" reRender="courseList"/> <a4j:commandLink id="goNext" value="goNext" action="#{testBackButtonAction.goNext}"/> </h:form>
.xhtml (2nd one):
<h:form> <a4j:commandLink id="btnBack" value="go back" action="#{courseList.goBack}"/> </h:form>
backing SFSB:
@Name("testBackButtonAction") @Stateful public class TestBackButtonAction implements TestBackButtonLocal { @Logger private Log log; private List<Integer> searchResults; private Integer userInputCourseId; private Integer courseId; public String goNext() { return "/TestBackButton2.xhtml"; } //@Begin(join = true) public void search() { log.info("courseList.search() called. input courseId for search is: "+this.userInputCourseId); //put your search logic here and populate the searchResults this.searchByCourseId(this.userInputCourseId); } public List<Integer> getSearchResults() { return searchResults; } public void searchByCourseId(Integer userInputCourseId) { searchResults = new ArrayList<Integer>(); searchResults.add(userInputCourseId); } @Remove @Destroy public void destroy() { } public Integer getUserInputCourseId() { return userInputCourseId; } public void setUserInputCourseId(Integer userInputCourseId) { this.userInputCourseId = userInputCourseId; } }
Back button on browser from xhtml 2 works fine with or w/o the @Begin. So that means with temp conv or with LRC the dataTable is still rendered and data is intact when I go back to first page via back button on browser (or via commandLink).
-
4. Re: Help with back button
gonorrhea May 13, 2009 12:29 AM (in response to gonorrhea)Why
is
this
the
only
forum
that
does
not
have
an
edit
button?
I meant this:
<h:form> <a4j:commandLink id="btnBack" value="go back" action="#{testBackButtonAction.goBack}"/> </h:form>
-
5. Re: Help with back button
gonorrhea May 13, 2009 12:37 AM (in response to gonorrhea)ok so when the @Begin(join=true) is removed, the back links on the 2nd xhtml don't work (they do but the dataTable is not visible/rendered anymore). But the browser back button in IE7 does work fine (table/data still there).
hmmmmmm....
Does the @Factory and @DataModel combo have something to do with this problem I'm having?
-
6. Re: Help with back button
gonorrhea May 13, 2009 12:58 AM (in response to gonorrhea)both SFSBs (the POC and my project) have this code:
@Remove @Destroy public void destroy() { log.info("in destroy"); }
@Remove So this gets called when the ejb container deems that the SFSB needs to be passivated and/or removed (invalidated) by the client.
@org.jboss.seam.annotations.Destroy Alternative to javax.annotations.PreDestroy for use in a pre Java EE 5 environment. Designates a destroy method that is called when a context ends and the component is being disposed.
I added a breakpoint in the debugger at the log.info line above and that line is getting hit multiple times even though there is @Begin annotated method that is being exec'd. It gets hit immediately after I click the browser back button in my use case (not the POC). Why?
Confused as to why this is happening...
-
7. Re: Help with back button
gonorrhea May 13, 2009 1:21 AM (in response to gonorrhea)I commented out the @Destroy and there was no effect in terms of UI experience (i.e. the dataTable is not rendered after back button click).
I noticed in the debugger that the breakpoint was getting hit still with only the @Remove on the destroy() method. Why does the container keep destroying this Seam SFSB component? Is it normal for the @Remove destroy() to be called so many times during use case execution with @Begin annotation on business method in SFSB?
Does the @Remove method get called consistently after you access a business method and there is no LRC running?
-
8. Re: Help with back button
gonorrhea May 13, 2009 1:36 AM (in response to gonorrhea)This is all the output to the console immediately after I click the back button on the 2nd page of my app:
16:32:27,651 INFO [ProfilingInterceptor] *** Entering method: getHeader 16:32:27,651 INFO [ProfilingInterceptor] *** Method class org.jboss.ejb3.interceptor.InvocationContextImpl.public java.lang.String com.cox.bets.session.ManageEquipmentAction.getHeader() executed in 0ms *** 16:32:27,667 INFO [ProfilingInterceptor] *** Entering method: getSerialNumber 16:32:27,667 INFO [ProfilingInterceptor] *** Method class org.jboss.ejb3.interceptor.InvocationContextImpl.public java.lang.String com.cox.bets.session.ManageEquipmentAction.getSerialNumber() executed in 0ms *** 16:32:27,698 INFO [ProfilingInterceptor] *** Entering method: getShowCreateNew 16:32:27,698 INFO [ProfilingInterceptor] *** Method class org.jboss.ejb3.interceptor.InvocationContextImpl.public java.lang.Boolean com.cox.bets.session.ManageEquipmentAction.getShowCreateNew() executed in 0ms *** 16:32:27,714 INFO [ProfilingInterceptor] *** Entering method: getShowCreateNew 16:32:27,714 INFO [ProfilingInterceptor] *** Method class org.jboss.ejb3.interceptor.InvocationContextImpl.public java.lang.Boolean com.cox.bets.session.ManageEquipmentAction.getShowCreateNew() executed in 0ms *** 16:32:27,792 INFO [ProfilingInterceptor] *** Entering method: getShowCreateNew 16:32:27,792 INFO [ProfilingInterceptor] *** Method class org.jboss.ejb3.interceptor.InvocationContextImpl.public java.lang.Boolean com.cox.bets.session.ManageEquipmentAction.getShowCreateNew() executed in 0ms *** 16:32:27,808 INFO [ProfilingInterceptor] *** Entering method: getShowCreateNew 16:32:27,808 INFO [ProfilingInterceptor] *** Method class org.jboss.ejb3.interceptor.InvocationContextImpl.public java.lang.Boolean com.cox.bets.session.ManageEquipmentAction.getShowCreateNew() executed in 0ms *** 16:32:27,870 INFO [ProfilingInterceptor] *** Entering method: destroy
this is the destroy() method for the same SFSB:
@Remove public void destroy () { log.info("in destroy()"); }
so why is the destroy() method being called when I click the back button in my browser? what triggers the ejb container to call it??
very strange. There is no @End annotation in my SFSB and here is the pages.xml:
<?xml version="1.0" encoding="UTF-8"?> <pages xmlns="http://jboss.com/products/seam/pages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.0.xsd" no-conversation-view-id="/home.xhtml" login-view-id="/login.xhtml"> <!-- Force users to be authenticated --> <page view-id="*" > <action execute="#{identity.login}" if="#{not identity.loggedIn}"/> <navigation> <rule if="#{not identity.loggedIn}"> <redirect view-id="/error.xhtml"> <message>Your Cox network login credentials could not be detected.</message> </redirect> </rule> </navigation> </page> <!-- according to CBauer, "Entries for the conversation list and conversation switcher are only created if the pages have descriptions. So put some descriptions in your conversational pages in pages.xml." see this thread: http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4049848#4049848 --> <page view-id="/ManageEquipment.xhtml"> <description>Manage Equipment</description> <navigation from-action="#{manageEquipment.processRepairHistorySelection}"> <redirect view-id="/RepairCaseDetails.xhtml"/> </navigation> </page> <page view-id="/BulkCreateRepairCase.xhtml"> <description>Bulk Create Repair Case</description> <navigation from-action="#{bulkCreateRepairCase.processRepairHistorySelection}"> <redirect view-id="/RepairCaseDetails.xhtml"/> </navigation> </page> <page view-id="/ApplicationMetaData.xhtml"> <action execute="#{applicationMetaData.getDatabaseDetails}"/> </page> <exception class="org.jboss.seam.framework.EntityNotFoundException"> <redirect view-id="/error.xhtml"> <message>Not found</message> </redirect> </exception> <exception class="javax.persistence.EntityNotFoundException"> <redirect view-id="/error.xhtml"> <message>Not found</message> </redirect> </exception> <exception class="javax.persistence.OptimisticLockException"> <end-conversation/> <redirect view-id="/error.xhtml"> <message>Another user changed the same data, please try again</message> </redirect> </exception> <exception class="org.jboss.seam.security.AuthorizationException"> <redirect view-id="/error.xhtml"> <message>You don't have permission to do this</message> </redirect> </exception> <exception class="org.jboss.seam.security.NotLoggedInException"> <redirect view-id="/login.xhtml"> <message>Please log in first</message> </redirect> </exception> <exception class="javax.faces.application.ViewExpiredException"> <redirect view-id="/error.xhtml"> <message>Your session has timed out, please try again</message> </redirect> </exception> <exception> <redirect view-id="/error.xhtml"> <message>Unexpected error, please try again</message> </redirect> </exception> </pages>
-
9. Re: Help with back button
gonorrhea May 13, 2009 1:40 AM (in response to gonorrhea)More data (I guess I was wrong about ejb container calling @Remove method??)
from SiA:
The @Remove method is called when the context containing the session bean reference is destroyed. Seam uses this method to instruct the EJB container to destroy the session bean. If the @Remove method is invoked directly, it leads to an immediate removal of the session bean reference, unless a runtime or remote exception is thrown and the exception class is marked with @ApplicationException (it’s not a system exception) or an exception is thrown that isn’t a runtime or remote exception and the retainIfException attribute on the @Remove annotation is set to true. NOTE Note that there is a distinct difference between the @Remove and @Pre- Destroy annotations. The method marked with the @Remove annotation is called when Seam removes the reference to the instance, and the method marked with the @PreDestroy annotation is called when the EJB 3 container destroys the instance itself.
-
10. Re: Help with back button
gonorrhea May 13, 2009 1:53 AM (in response to gonorrhea)I converted the SFSB to a JavaBean and thus bypassing the @Remove destroy() method.
Same results after clicking back button.
Wow, what a pain and no wonder nobody uses Seam...
-
11. Re: Help with back button
gonorrhea May 15, 2009 7:37 PM (in response to gonorrhea)As the French say - finalement!
I have discovered the root cause and applied a fix.
Root cause is the <a4j:commandButton> I have commented out below:
<h:form> <h:panelGrid columns="3"> <h:column> <b>Serial Number:</b> </h:column> <h:column> <h:inputText id="serialNumberId" value="#{testManageEquipment.serialNumber}" size="32" maxlength="32" required="true"> </h:inputText> </h:column> <h:column> <!-- <a4j:commandButton id="searchButton" value="Search" action="#{testManageEquipment.searchSerialNumber}" reRender="form1"> </a4j:commandButton> --> <h:commandButton id="searchButton" value="Search" action="#{testManageEquipment.searchSerialNumber}" reRender="form1"> </h:commandButton> </h:column> </h:panelGrid> <BR/> <BR/> <BR/> <a4j:commandLink id="goNext" value="goNext" action="#{testBackButtonAction.goNext}"/> </h:form> <BR/> <BR/> <BR/> <h:form id="form1"> <h:panelGrid columns="2"> <h:outputText value="MAC Address:"/> <h:outputText value="#{testManageEquipment.equipmentDetailBean.macAddress}"/> <h:outputText value="Desc:"/> <h:outputText value="#{testManageEquipment.equipmentDetailBean.description}"/> </h:panelGrid> </h:form>
It works fine with <h:commandButton> as a replacement for the search. The destroy() method is not executed in that case!
What the hell is this? Is this a known issue in JIRA, etc.? I tried replacing <h:form> with <a4j:form> for the form that surrounds that commandButton and that didn't help. Is this a general
unknown
rule in Seam not to use a4j:commandButton if you want to use browser back button? Haven't read that anywhere.The problem is that I actually need an AJAX req/resp cycle to occur b/c we are using a4j:status in coordination with a4j:modalPanel to display a
please wait
modalPanel to the user during the ajax req/resp cycle.I tried this as a workaround (which is most likely counter-intuitive and bad practice but what else can I do?):
<h:commandButton id="searchButton" value="Search"> <a4j:support event="onclick" action="#{manageEquipment.searchSerialNumber}"/> </h:commandButton>
but the modalPanel displays too late after a page refresh.
Any suggestions? Gets pretty weird on this board when you talk to yourself :)
thx.
-
12. Re: Help with back button
gonorrhea May 19, 2009 1:39 AM (in response to gonorrhea)Ok, I decided to analyze the server.log contents immediately after clicking the back button in browser.
Here is a sample:
2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.core.Manager] Discarding conversation state: 55 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.contexts.FacesLifecycle] After render response, destroying contexts 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.util.Naming] JNDI InitialContext properties:{java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces} 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.contexts.Contexts] destroying business process context 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.core.Events] Processing event:org.jboss.seam.preDestroyContext.BUSINESS_PROCESS 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.core.Events] Processing event:org.jboss.seam.postDestroyContext.BUSINESS_PROCESS 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.contexts.Contexts] destroying conversation context 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.core.Events] Processing event:org.jboss.seam.preDestroyContext.CONVERSATION 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.contexts.Contexts] destroying: testManageEquipment 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events 2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events
So why is it destroying my SFSB conversation-scoped component? There is no @End annotation in my SFSB anywhere.
Relevant fwk code:
org.jboss.seam.contexts.FacesLifecycle:
public static void endRequest(ExternalContext externalContext) { log.debug("After render response, destroying contexts"); try { Session session = Session.getInstance(); boolean sessionInvalid = session!=null && session.isInvalid(); Contexts.flushAndDestroyContexts(); if (sessionInvalid) { Lifecycle.clearThreadlocals(); clearPhaseId(); invalidateSession(externalContext); //actual session context will be destroyed from the listener } } finally { Lifecycle.clearThreadlocals(); log.debug( "<<< End JSF request for " + getRequestPath(externalContext) ); } }
org.jboss.seam.core.Manager:
/** * Touch the conversation stack, destroy ended conversations, * and timeout inactive conversations. */ public void endRequest(Map<String, Object> session) { if ( isLongRunningConversation() ) { if ( log.isDebugEnabled() ) { log.debug("Storing conversation state: " + getCurrentConversationId()); } touchConversationStack( getCurrentConversationIdStack() ); } else { if ( log.isDebugEnabled() ) { log.debug("Discarding conversation state: " + getCurrentConversationId()); } //now safe to remove the entry removeCurrentConversationAndDestroyNestedContexts(session); } /*if ( !Init.instance().isClientSideConversations() ) {*/ // difficult question: is it really safe to do this here? // right now we do have to do it after committing the Seam // transaction because we can't close EMs inside a txn // (this might be a bug in HEM) Manager.instance().conversationTimeout(session); //} }
Why is this Seam core framework code being executed when I click the back button with a4j:commandButton in my h:form but it doesn't get executed with h:commandButton in my h:form?
I tried changing all h: references to a4j: (for buttons, forms, etc.) and that doesn't fix it.
Also, I have no BUSINESS_PROCESS scoped components in my app. So why is that showing in the log snippet above?
Here is the dump for Seam component init:
16:31:46,683 INFO [Initialization] Installing components... 16:31:46,792 INFO [Component] Component: applicationMetaData, scope: SESSION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.ApplicationMetaDataAction, JNDI: BETS/ApplicationMetaDataAction/local 16:31:46,808 INFO [Component] Component: applicationSetting, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.ApplicationSettingsAction, JNDI: BETS/ApplicationSettingsAction/local 16:31:46,824 INFO [Component] Component: authenticator, scope: STATELESS, type: STATELESS_SESSION_BEAN, class: com.cox.bets.session.Authenticator, JNDI: BETS/Authenticator/local 16:31:46,824 INFO [Component] Component: authorizer, scope: SESSION, type: JAVA_BEAN, class: com.cox.bets.session.TestAuthorizer 16:31:46,824 INFO [Component] Component: bulkCreateRepairCase, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.BulkCreateRepairCaseAction, JNDI: BETS/BulkCreateRepairCaseAction/local 16:31:46,824 INFO [Component] Component: bulkCreateRepairCaseSupport, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.BulkCreateRepairCaseSupportBean, JNDI: BETS/BulkCreateRepairCaseSupportBean/local 16:31:46,839 INFO [Component] Component: bulkCreateWorkOrdersBean, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.session.BulkCreateWorkOrdersBean 16:31:46,839 INFO [Component] Component: bypassAuthenticator, scope: EVENT, type: JAVA_BEAN, class: com.cox.bets.session.BypassAuthenticator 16:31:46,839 INFO [Component] Component: calculateUtils, scope: EVENT, type: JAVA_BEAN, class: com.cox.bets.utils.CalculateUtils 16:31:46,839 INFO [Component] Component: codes, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.session.Codes 16:31:46,839 INFO [Component] Component: createRepairCase, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.CreateRepairCaseAction, JNDI: BETS/CreateRepairCaseAction/local 16:31:46,839 INFO [Component] Component: entityManager, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.persistence.ManagedPersistenceContext 16:31:46,855 INFO [Component] Component: entityManagerDSS, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.persistence.ManagedPersistenceContext 16:31:46,855 INFO [Component] Component: equipmentDetailBean, scope: EVENT, type: JAVA_BEAN, class: com.cox.bets.session.EquipmentDetailBean 16:31:46,855 INFO [Component] Component: equipmentHistoryDetailBean, scope: EVENT, type: JAVA_BEAN, class: com.cox.bets.session.EquipmentHistoryDetailBean 16:31:46,855 INFO [Component] Component: equipmentHistoryMovementBean, scope: EVENT, type: JAVA_BEAN, class: com.cox.bets.session.EquipmentHistoryMovementBean 16:31:46,855 INFO [Component] Component: equipmentRepair, scope: CONVERSATION, type: ENTITY_BEAN, class: com.cox.bets.entity.EquipmentRepair 16:31:46,855 INFO [Component] Component: equipmentRepairCost, scope: CONVERSATION, type: ENTITY_BEAN, class: com.cox.bets.entity.EquipmentRepairCost 16:31:46,855 INFO [Component] Component: hibernateUtils, scope: EVENT, type: JAVA_BEAN, class: com.cox.bets.utils.hibernate.HibernateUtils 16:31:46,855 INFO [Component] Component: jdbcUtils, scope: EVENT, type: JAVA_BEAN, class: com.cox.bets.utils.JdbcUtils 16:31:46,855 INFO [Component] Component: listManagement, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.ListManagementAction, JNDI: BETS/ListManagementAction/local 16:31:46,870 INFO [Component] Component: macAddressConverter, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.utils.converters.MacAddressConverter 16:31:46,870 INFO [Component] Component: manageEquipment, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.ManageEquipmentAction, JNDI: BETS/ManageEquipmentAction/local 16:31:46,870 INFO [Component] Component: monitorConversationTimeout, scope: STATELESS, type: STATELESS_SESSION_BEAN, class: com.cox.bets.session.MonitorConversationTimeoutBean, JNDI: BETS/MonitorConversationTimeoutBean/local 16:31:46,870 INFO [Component] Component: newWorkOrdersBean, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.session.NewWorkOrdersBean 16:31:46,870 INFO [Component] Component: org.jboss.seam.async.dispatcher, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.async.ThreadPoolDispatcher 16:31:46,886 INFO [Component] Component: org.jboss.seam.captcha.captcha, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.captcha.Captcha 16:31:46,886 INFO [Component] Component: org.jboss.seam.captcha.captchaImage, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.captcha.CaptchaImage 16:31:46,886 INFO [Component] Component: org.jboss.seam.core.ConversationIdGenerator, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationIdGenerator 16:31:46,886 INFO [Component] Component: org.jboss.seam.core.contexts, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.Contexts 16:31:46,886 INFO [Component] Component: org.jboss.seam.core.conversation, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.core.Conversation 16:31:46,886 INFO [Component] Component: org.jboss.seam.core.conversationEntries, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationEntries 16:31:46,886 INFO [Component] Component: org.jboss.seam.core.conversationListFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationList 16:31:46,886 INFO [Component] Component: org.jboss.seam.core.conversationPropagation, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationPropagation 16:31:46,886 INFO [Component] Component: org.jboss.seam.core.conversationStackFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationStack 16:31:46,886 INFO [Component] Component: org.jboss.seam.core.events, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.Events 16:31:46,886 INFO [Component] Component: org.jboss.seam.core.expressions, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesExpressions 16:31:46,886 INFO [Component] Component: org.jboss.seam.core.interpolator, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.Interpolator 16:31:46,886 INFO [Component] Component: org.jboss.seam.core.locale, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.international.Locale 16:31:46,902 INFO [Component] Component: org.jboss.seam.core.manager, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesManager 16:31:46,902 INFO [Component] Component: org.jboss.seam.core.resourceBundle, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.ResourceBundle 16:31:46,902 INFO [Component] Component: org.jboss.seam.core.resourceLoader, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.faces.ResourceLoader 16:31:46,902 INFO [Component] Component: org.jboss.seam.core.validators, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.core.Validators 16:31:46,902 INFO [Component] Component: org.jboss.seam.debug.contexts, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.debug.Contexts 16:31:46,917 INFO [Component] Component: org.jboss.seam.debug.hotDeployFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.debug.hot.HotDeployFilter 16:31:46,917 INFO [Component] Component: org.jboss.seam.debug.introspector, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.debug.Introspector 16:31:46,933 INFO [Component] Component: org.jboss.seam.exception.exceptions, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.exception.Exceptions 16:31:46,933 INFO [Component] Component: org.jboss.seam.faces.dataModels, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.faces.DataModels 16:31:46,933 INFO [Component] Component: org.jboss.seam.faces.facesContext, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesContext 16:31:46,933 INFO [Component] Component: org.jboss.seam.faces.facesMessages, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesMessages 16:31:46,933 INFO [Component] Component: org.jboss.seam.faces.facesPage, scope: PAGE, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesPage 16:31:46,933 INFO [Component] Component: org.jboss.seam.faces.httpError, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.HttpError 16:31:46,933 INFO [Component] Component: org.jboss.seam.faces.redirect, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.faces.Redirect 16:31:46,933 INFO [Component] Component: org.jboss.seam.faces.renderer, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.ui.facelet.FaceletsRenderer 16:31:46,949 INFO [Component] Component: org.jboss.seam.faces.switcher, scope: PAGE, type: JAVA_BEAN, class: org.jboss.seam.faces.Switcher 16:31:46,949 INFO [Component] Component: org.jboss.seam.faces.uiComponent, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.faces.UiComponent 16:31:46,949 INFO [Component] Component: org.jboss.seam.faces.validation, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.faces.Validation 16:31:46,949 INFO [Component] Component: org.jboss.seam.framework.currentDate, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.framework.CurrentDate 16:31:46,949 INFO [Component] Component: org.jboss.seam.framework.currentDatetime, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.framework.CurrentDatetime 16:31:46,949 INFO [Component] Component: org.jboss.seam.framework.currentTime, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.framework.CurrentTime 16:31:46,949 INFO [Component] Component: org.jboss.seam.graphicImage.image, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.ui.graphicImage.Image 16:31:46,949 INFO [Component] Component: org.jboss.seam.international.localeSelector, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.international.LocaleSelector 16:31:46,949 INFO [Component] Component: org.jboss.seam.international.messagesFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.international.Messages 16:31:46,949 INFO [Component] Component: org.jboss.seam.international.timeZone, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.international.TimeZone 16:31:47,027 INFO [Component] Component: org.jboss.seam.international.timeZoneSelector, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.international.TimeZoneSelector 16:31:47,042 INFO [Component] Component: org.jboss.seam.mail.mailSession, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.mail.MailSession 16:31:47,042 INFO [Component] Component: org.jboss.seam.navigation.pages, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.navigation.Pages 16:31:47,042 INFO [Component] Component: org.jboss.seam.navigation.safeActions, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.navigation.SafeActions 16:31:47,042 INFO [Component] Component: org.jboss.seam.pdf.documentStore, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.pdf.DocumentStore 16:31:47,042 INFO [Component] Component: org.jboss.seam.persistence.persistenceContexts, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.persistence.PersistenceContexts 16:31:47,058 INFO [Component] Component: org.jboss.seam.persistence.persistenceProvider, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.persistence.HibernatePersistenceProvider 16:31:47,058 INFO [Component] Component: org.jboss.seam.remoting.gwt.gwtToSeamAdapter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.remoting.gwt.GWTToSeamAdapter 16:31:47,058 INFO [Component] Component: org.jboss.seam.remoting.remoting, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.remoting.Remoting 16:31:47,058 INFO [Component] Component: org.jboss.seam.security.configurationFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.security.Configuration 16:31:47,074 INFO [Component] Component: org.jboss.seam.security.entityPermissionChecker, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.security.HibernateEntityPermissionChecker 16:31:47,074 INFO [Component] Component: org.jboss.seam.security.facesSecurityEvents, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.security.FacesSecurityEvents 16:31:47,074 INFO [Component] Component: org.jboss.seam.security.identity, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.security.RuleBasedIdentity 16:31:47,074 INFO [Component] Component: org.jboss.seam.theme.themeFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.theme.Theme 16:31:47,074 INFO [Component] Component: org.jboss.seam.theme.themeSelector, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.theme.ThemeSelector 16:31:47,074 INFO [Component] Component: org.jboss.seam.transaction.ejbTransaction, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.transaction.EjbTransaction 16:31:47,074 INFO [Component] Component: org.jboss.seam.transaction.synchronizations, scope: EVENT, type: STATEFUL_SESSION_BEAN, class: org.jboss.seam.transaction.EjbSynchronizations, JNDI: BETS/EjbSynchronizations/local 16:31:47,089 INFO [Component] Component: org.jboss.seam.transaction.transaction, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.transaction.Transaction 16:31:47,089 INFO [Component] Component: org.jboss.seam.ui.EntityConverter, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.ui.converter.EntityConverter 16:31:47,089 INFO [Component] Component: org.jboss.seam.ui.entityIdentifierStore, scope: PAGE, type: JAVA_BEAN, class: org.jboss.seam.ui.converter.entityConverter.EntityIdentifierStore 16:31:47,105 INFO [Component] Component: org.jboss.seam.ui.entityLoader, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.ui.converter.entityConverter.EntityLoader 16:31:47,105 INFO [Component] Component: org.jboss.seam.ui.facelet.faceletCompiler, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.facelet.FaceletCompiler 16:31:47,105 INFO [Component] Component: org.jboss.seam.ui.graphicImage.graphicImageResource, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.graphicImage.GraphicImageResource 16:31:47,105 INFO [Component] Component: org.jboss.seam.ui.graphicImage.graphicImageStore, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.ui.graphicImage.GraphicImageStore 16:31:47,105 INFO [Component] Component: org.jboss.seam.ui.hibernateEntityLoader, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.ui.converter.entityConverter.HibernateEntityLoader 16:31:47,120 INFO [Component] Component: org.jboss.seam.ui.resource.safeStyleResources, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.resource.SafeStyleResources 16:31:47,120 INFO [Component] Component: org.jboss.seam.ui.resource.styleResource, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.resource.StyleResource 16:31:47,120 INFO [Component] Component: org.jboss.seam.ui.resource.webResource, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.resource.WebResource 16:31:47,120 INFO [Component] Component: org.jboss.seam.web.ajax4jsfFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.Ajax4jsfFilter 16:31:47,120 INFO [Component] Component: org.jboss.seam.web.ajax4jsfFilterInstantiator, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.ui.filter.Ajax4jsfFilterInstantiator 16:31:47,120 INFO [Component] Component: org.jboss.seam.web.exceptionFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.ExceptionFilter 16:31:47,120 INFO [Component] Component: org.jboss.seam.web.isUserInRole, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.IsUserInRole 16:31:47,120 INFO [Component] Component: org.jboss.seam.web.loggingFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.LoggingFilter 16:31:47,120 INFO [Component] Component: org.jboss.seam.web.multipartFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.MultipartFilter 16:31:47,120 INFO [Component] Component: org.jboss.seam.web.parameters, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.faces.Parameters 16:31:47,136 INFO [Component] Component: org.jboss.seam.web.redirectFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.RedirectFilter 16:31:47,136 INFO [Component] Component: org.jboss.seam.web.servletContexts, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.web.ServletContexts 16:31:47,136 INFO [Component] Component: org.jboss.seam.web.session, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.web.Session 16:31:47,136 INFO [Component] Component: org.jboss.seam.web.userPrincipal, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.UserPrincipal 16:31:47,136 INFO [Component] Component: populateDropDown, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.session.PopulateDropDown 16:31:47,136 INFO [Component] Component: repairCaseDetails, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.RepairCaseDetailsAction, JNDI: BETS/RepairCaseDetailsAction/local 16:31:47,136 INFO [Component] Component: seamValidatorCodes, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.utils.validators.SeamValidatorCodes 16:31:47,136 INFO [Component] Component: seamValidatorCost, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.utils.validators.SeamValidatorCost 16:31:47,136 INFO [Component] Component: seamValidatorDates, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.utils.validators.SeamValidatorDates 16:31:47,152 INFO [Component] Component: seamValidatorMacAddress, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.utils.validators.SeamValidatorMacAddress 16:31:47,152 INFO [Component] Component: seamValidatorRepairCostType, scope: SESSION, type: JAVA_BEAN, class: com.cox.bets.utils.validators.SeamValidatorRepairCostType 16:31:47,152 INFO [Component] Component: securityRoleDAO, scope: STATELESS, type: STATELESS_SESSION_BEAN, class: com.cox.bets.dao.SecurityRoleDAO, JNDI: BETS/SecurityRoleDAO/local 16:31:47,152 INFO [Component] Component: securityRoleManager, scope: STATELESS, type: STATELESS_SESSION_BEAN, class: com.cox.bets.session.SecurityRoleManager, JNDI: BETS/SecurityRoleManager/local 16:31:47,152 INFO [Component] Component: securityRules, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.drools.RuleBase 16:31:47,152 INFO [Component] Component: storedProcedureDAO, scope: STATELESS, type: STATELESS_SESSION_BEAN, class: com.cox.bets.dao.StoredProcedureDAO, JNDI: BETS/StoredProcedureDAO/local 16:31:47,152 WARN [Component] Component class should be serializable: stringUtils 16:31:47,152 INFO [Component] Component: stringUtils, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.utils.StringUtils 16:31:47,152 INFO [Component] Component: testBackButtonAction, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.TestBackButtonAction, JNDI: BETS/TestBackButtonAction/local 16:31:47,152 INFO [Component] Component: testIdentityInsert, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.TestIdentityInsertAction, JNDI: BETS/TestIdentityInsertAction/local 16:31:47,167 INFO [Component] Component: testIdentityUpdate, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.TestIdentityUpdateAction, JNDI: BETS/TestIdentityUpdateAction/local 16:31:47,167 INFO [Component] Component: testInjectCreate, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.TestInjectCreateAction, JNDI: BETS/TestInjectCreateAction/local 16:31:47,167 INFO [Component] Component: testManageEquipment, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.TestManageEquipmentAction, JNDI: BETS/TestManageEquipmentAction/local
-
13. Re: Help with back button
gonorrhea May 19, 2009 2:03 AM (in response to gonorrhea)This is critical as well.
org.jboss.seam.jsf.SeamPhaseListener:
protected void beforeRenderResponse(FacesContext facesContext) { if ( Contexts.isPageContextActive() ) { Context pageContext = Contexts.getPageContext(); //after every time that the view may have changed, //we need to flush the page context, since the //attribute map is being discarder pageContext.flush(); //force refresh of the conversation lists (they are kept in PAGE context) pageContext.remove(Seam.getComponentName(Switcher.class)); pageContext.remove("org.jboss.seam.core.conversationList"); pageContext.remove("org.jboss.seam.core.conversationStack"); } preRenderPage(facesContext); if ( facesContext.getResponseComplete() ) { //workaround for a bug in MyFaces prior to 1.1.3 if ( Init.instance().isMyFacesLifecycleBug() ) { FacesLifecycle.endRequest( facesContext.getExternalContext() ); } } else //if the page actions did not call responseComplete() { FacesMessages.instance().beforeRenderResponse(); //do this both before and after render, since conversations //and pageflows can begin during render FacesManager.instance().prepareBackswitch(facesContext); } FacesPage.instance().storeConversation(); FacesPage.instance().storePageflow(); PersistenceContexts persistenceContexts = PersistenceContexts.instance(); if (persistenceContexts != null) { persistenceContexts.beforeRender(); } }
So it may come down to this line of code:
facesContext.getResponseComplete()
this apparently is returning true for a4j:commandButton scenario and false for h:commandButton scenario.
how is there a page action when you click the back button in browser? anybody care to explain? and yes, I tested with FF 3 and same results.
-
14. Re: Help with back button
kapitanpetko May 19, 2009 6:46 AM (in response to gonorrhea)If you click the back button, your browser should do a GET using the previous URL in history (assuming you disabled caching).
Use Firefly or something similar to see what exactly is happening. My guess is that,
for some reason, your URL looks different when using a4j:commandButton as opposed to h:commandButton,
and that is why you are getting different behaviour.Seam cleans up all contexts on request end (deleting temporary/expired conversations, etc.), so if
you have a request (GET in this case), cleanup code should get executed.Your SFSB is destroyed probably because of this:
2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.core.Manager] Discarding conversation state: 55
Dump conversation/session contents to the log to be sure.
HTH