-
1. Re: Need to understand the @factory
amitev Dec 25, 2009 9:10 AM (in response to aymenez)The idea behind @Factory is to lazy create an object and store it in the context when a variable with the factory name gets requested. When the object is created it's stored in the same scope as the factory or in the scope of the owning component if the factory scope isn't specified. Probably your scope is EVENT, so the factory is called on each request and after the response is sent to the browser, the variable is destroyed.
-
2. Re: Need to understand the @factory
aymenez Dec 25, 2009 9:47 AM (in response to aymenez)Hello, thank you Adrian for your help,
I know very well that my variable is destroyed after the response is sent because my component scope is EVENT.
but what i do not understand why the factory is called the first thing after i submit the page.
As i understand from the lifecycle of JSF, the life cycle must update the model values of the form and after invoke the application, so why the factory is called before to instansiate the backing bean of the model.
my factory variable is needed only to render the response, so why it is instansieted?
I debug my code, i put a message in the constructor of Project(my baking bean for rthe form), and a message in the factory method, when the request is get(first request), the backing bean is first instansieted and after the factory is called.
but after a submit, i see that the factory is called and after the backingbean is instansieted to update model.
why? is the resoreView that calls the factory?
To understand me better, this is my xhtml page :
<h:form>
<s:validateAll>
<h:inputText value="#{projet.nom}" size="15" required="true"/>
<br />
<h:inputText value="#{projet.description}" size="15" required="true"/>
</s:validateAll>
<h:messages/>
<br />
<h:commandButton type="submit" value="creer Projet"
action="#{projetManager.ajouterProjet}" />
</h:form>
<h:dataTable value="#{projets}" var="project">
<h:column>
<h:outputText value="#{project.nom}" />
</h:column>
<h:column>
<h:outputText value="#{project.description}" />
</h:column>
</h:dataTable>
after a submit, the factory is called first thing, because i think that my variable #{projets} is only needed to render the response. -
3. Re: Need to understand the @factory
amitev Dec 25, 2009 11:51 AM (in response to aymenez)dataTable requires it's value not only for rendering but also for decode so it will call your factory even on submit without rerendering the same page. Keep your factory variable in page scope and you'll fix the problem.
-
4. Re: Need to understand the @factory
aymenez Dec 25, 2009 3:11 PM (in response to aymenez)Thank you very much Adrian for your help, my problem was fixed.
I am a beginner in using seam and i was very happy by your help.
I want to understand better what is happening in background, i do not understand why the datatable do the
decode in the jsf lifecycle. As i understand, the purpose of this phase in jsf life cycle is that each component updates its value, and this value will be searched by raquest.getParameter();
but when this is a table, there will not be values which will be sent in the form. So why the datatable calls the decode method? i think that my question is turning in a jsf question.
when it is a textbox or date field, it is logic to call decode but when it is a datatable, i do not understand the purpose.
and i have an other issue, the model of datatable can be obtained from the viewstate field, the view state contains the state of the page, so the seam engine can obtain the model of this datatable in the last request, so why it calls the factory? i think that there is not a need to call the factory, because the model can be obtained. -
5. Re: Need to understand the @factory
amitev Dec 25, 2009 5:04 PM (in response to aymenez)The dataTable performs decode because there could be ValueHolder components inside it.
Your model is not kept in the view state so it can't be restored. If you use the page scope, seam will store your object in the view state (this is how the page scope is implemented). -
6. Re: Need to understand the @factory
aymenez Dec 25, 2009 6:35 PM (in response to aymenez)Hello Adrian,
Thank you very much again Adrian.Your model is not kept in the view state : is it specefic for datatables or for all components?
For example if i have a textbox which binds to a seam component and this component is request scoped, the value will not be stored in the view state?
-
7. Re: Need to understand the @factory
amitev Dec 25, 2009 7:28 PM (in response to aymenez)
Your model is not kept in the view state : is it specefic for datatables or for all components?The jsf components don't keep your beans and this is common for all components.
For example if i have a textbox which binds to a seam component and this component is request scoped, the value will not be stored in the view state?The inputText component doesn't keep your bean(seam components)'s property in the view state.
-
8. Re: Need to understand the @factory
aymenez Dec 26, 2009 12:07 AM (in response to aymenez)Hello Adrian,
I am sorry beacuse my question was ambigous that's why you do not understand my question,
Your model is not kept in the view state : is it specefic for datatables or for all components?
in this question, i wanted to say the value and not the bean. it is obvious that jsf doen not keep the bean in the view state but the value is kept. so this is my new question and this is the accurate version of my question :
the value is not kept in the view state : is it specefic for datatables or for all components?when i show the example of the inputtext, it is obvious that its value is kept in the view state and not the bean, and in the next reuqest, jsf will know the last value of the input text.
So why the value of the datatable is obtained from the factory method and not from the view(the value and not the bean)? -
9. Re: Need to understand the @factory
aymenez Dec 28, 2009 11:53 AM (in response to aymenez)hello,
I am sorry and i will make my question clearer.
if the value of a datatable is stored in the page scope, the value will be stored in the view state. and if not, seam will call the factory method again when we submit in this page. This point is clear.
so for ValueHolders, is it the same or it is different?
if we have for example an inputtext which binds to a proporty of component that its scope is request. its value will be stored in the view state or not? or we must keep the component in the page sope to have the value of the inputtext stored in the viewstate?