struts-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stéphane Zuckerman <stephane.zucker...@gmail.com>
Subject Re: LazyLists and dynamic forms
Date Thu, 07 Apr 2005 16:35:17 GMT
Niall Pemberton a écrit :
> Its hard to help when all you say is "failed to make their examples work".
> Posting snippets of relevant bits of your struts-config.xml, jsp etc would
> help along with what actually happened.

Sorry for the lack of details, I know I was really too vague.

I am using Struts 1.2.4 .

So, here is what I want to do :
I have a list of text fields which number is unknown when the user gets 
to the JSP. Fields are added dynamically through JavaScript.

Now, I know there is Struts 1.2.6 on its way, but I can't wait for it to 
get a "stable" label.

So here is the example I was trying to follow (extracted from 
http://wiki.apache.org/struts/StrutsCatalogLazyList) :

[quote]
In fact using Arrays (rather than Lists) a LazyDynaBean can be used 
directly, in the following way:

   <form-beans>

      <form-bean name="skillForm"
		type="org.apache.commons.beanutils.LazyDynaBean">
         <form-property name="skills" type="myPackage.SkillBean[]"/>
      </form-bean>

   </form-beans>
[/quote]

Supposedly, the LazyDynaBean object should be wrapped within a 
BeanValidatorForm one.

Here is what I am using in my struts-config.xml file :

       <form-bean name="dynaLazyForm"
		 type="org.apache.commons.beanutils.LazyDynaBean">
         <form-property name="nb" type="java.lang.String" />
         <form-property  name="persons" 	
			type="net.beuarh.lasher.Person[]"/>
       </form-bean>

The class Person is really just a bean, with deux properties : name and 
fname.

Here is the JavaScript code I use to generate new text fields :

function foo() {
	var nb = document.getElementById('nb').value;
	var f = document.getElementById('f');
	f.innerHTML = null;
	f.innerHTML = "nb: "+
		"<input type='text' id='nb' value='"+nb+"' /><br />";
	for (var i = 0; i < nb; i++) {
		f.innerHTML += "name: <input type='text' " +
		      "name='persons["+i+"].name' id='name' /><br />";
		f.innerHTML += "first name:<input type='text' " +
		      "name='persons["+i+"].fname' id='fname' /><br />";
	}
	f.innerHTML += "<input type='submit' value='submit' />";
}

The JSP is really basic (since this is a test) :

<html>
   <head>
     <html:base/>
     <title>JSP for lazyForm form</title>
     <script src="js.js" language="javascript"
             type="text/javascript"></script>
   </head>
   <body>
     <html:errors/>
     <html:form action="/dynaLazy" styleId="f">
       nb : <html:text property="nb" onblur="foo()" styleId="nb"/>
       <br />
       <html:submit/>
     </html:form>
   </body>
</html>

... And my Action class is as simple as the JSP :

public final class DynaLazyAction extends Action {
	public ActionForward execute(...) {
		DynaValidatorForm dynaForm = (DynaValidatorForm) form;
		// here is the line that makes it all crumble...
		Person[] persons = (Person[]) dynaForm.get("persons");

		request.setAttribute("persons",persons);
		return mapping.findForward("ok");
	}
}

As I said before, when it is about "manual" forms, everything's fine, I 
use LazyLists, and it works (thank you so much, Rick; you made my 
morning wonderful :-) ).

I hope I wasn't too messy in my explanations ...

Thanks for any clue you might give me :-)

-- 
Stéphane Zuckerman

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Mime
View raw message