The problem here is the need to be able to populate the form from a
submission. Initialising it in the action before forwarding to the view
is okay when rendering the page to the browser, but when interpreting
the forms submission, struts is going to instantiate the new actionform
instance (its request scoped I presume), call its reset(), and then try
to populate it, before any action is invoked.
The only place to initialise the size of the list so populate will work
is in the reset() method, however its naughty to connect to the database
(to find out the required size) from here.
My first suggestion was to use a lazy list. Thats probably the best way,
but another simple method would be to write the size of the list to a
hidden field in the html. Then it will be sent back in the submitted
request. You can then check that in the reset() method using getParameter().
ie (at its simplest), in reset() :
int size = Integer.parseInt( request.getParameter("myListSize") );
this.propertyValues = new ArrayList(size);
Ummm. I was having another look at that wiki link I sent. Its notable
that their example provides an indexed getter. You may also need to do
something like that, but I dont recall the details :-(
Jeff Beal wrote:
> When I have this sort of thing, I usually put it in an "initializer"
> Action that I always link to in place of the JSP.
>
> <action path="initPage" name="BasicContentForm" validate="false"
> type="com.example.InitAction">
> <!-- This action populates the form -->
> <forward path="page.jsp" redirect="false" name="success" />
> </action>
> <action path="processPage" name="BasicContentForm" validate="true"
> input="initPage.do" ...>
> <!-- this action processes the form -->
> </action>
>
> -- Jeff
>
> Diego Manilla Suárez wrote:
>
>> Hi! I have a problem with form members initialization.
>>
>> I have this form.
>>
>> public class BasicContentForm extends ValidatorForm {
>>
>> protected java.util.List propertyValues;
>> public BasicContentForm() {
>> this.propertyValues = new java.util.ArrayList();
>> }
>> public void setPropertyValues( java.util.List propertyValues ) {
>> this.propertyValues = propertyValues;
>> } public java.util.List getPropertyValues() {
>> return this.propertyValues;
>> }
>> public Object getPropertyValue(int index) {
>> return propertyValues.get(index);
>> }
>> public void reset(ActionMapping mapping, HttpServletRequest
>> request) {
>> this.propertyValues = new java.util.ArrayList();
>> }
>> }
>>
>> And this jsp:
>>
>> <logic:iterate name="basicContentForm" property="propertyValues"
>> id="propertyValue">
>> <html:text name="propertyValue" property="value" indexed="true"/>
>> </logic:iterate>
>>
>> The problem is that the number and type of the elements of
>> propertyValues list is calculated dynamically (from the database). I
>> was doing that on my Action class, but I've realized that this doesn't
>> work: when I submit the form, I get an Exception at
>> BeanUtils.populate, because the list is not properly initialized. If I
>> can't initialize it on the reset() method (I need to access the
>> database), what else can I do?
>>
>> Thanks in advance
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org
|