I have ActionForm's that contain String array variables like:

private String[] parmTypeCd = null;

With the normal:
public String[] getParmTypeCd() {
        return parmTypeCd;
}
public void setParmTypeCd(String parmTypeCd[]) {
        this.parmTypeCd = parmTypeCd;
}

My form has:
<html:select property="parmTypeCd" multiple="true" size="3">
        <html:option value="1">Value1</html:option>
        <html:option value="2">Value2</html:option>
        ...
</html:select>

Then, underneath I build my ArrayList to pass to my iBatis query like:

ArrayList parmTypeCds = null;
if(form.getParmTypeCd() != null && form.getParmTypeCd().length > 0) {
        parmTypeCds = new ArrayList();
      String typeCds[] = form.getParmTypeCd();
      for(int i=0; i<form.getParmTypeCd().length; i++) {
        parmTypeCds.add(typeCds[i]);
        }
}

Pretty simple.  There may be a better way to do it, but this works just fine
for me.

--Brad

-----Original Message-----
From: Will Stranathan [mailto:[EMAIL PROTECTED] 
Sent: Monday, January 24, 2005 3:11 PM
To: user@struts.apache.org
Subject: Select Multiple Issues

I had posted earlier concerning this, and haven't gotten any response, 
but I think it got lost in all the spirited discussions about 
constants interfaces, leadership voting, etc. over the past week. 
 I've done a lot of searching, and AFAICT, I'm trying all the right 
things, but it's still not working...

I promise I google'd first....

I'm trying to use a multiple-select select box, for example:

<html:select multiple="true" property="bar" size="5">
<html:option value="1">One</html:option>
<html:option value="2">Two</html:option>
<html:option value="3">Three</html:option>
<html:option value="4">Four</html:option>
</html:select>

And I've tried backing my form bean with String[] AND with an 
ArrayList.

When I try to use a String[] as the backing, the form displays, but 
when I submit, I get an argument type mismatch:

DEBUG 2005-01-19 10:51:56 
org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:87
6) 
setProperty([EMAIL PROTECTED], bar, [2,4,8])
DEBUG 2005-01-19 10:51:56 
org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:
418) 
Convert string '2' to class 'java.lang.String'
DEBUG 2005-01-19 10:51:56 
org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:
426) 
Using converter 
[EMAIL PROTECTED]
DEBUG 2005-01-19 10:51:56 
org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUti
lsBean.java:1756) 
setSimpleProperty: Invoking method public void 
com.boa.cis.portal.forms.FooForm.setBar(java.lang.String[]) with value 
2 (class java.lang.String)
ERROR 2005-01-19 10:51:56 
org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBea
n.java:1777) 
Method invocation failed.
java.lang.IllegalArgumentException: argument type mismatch

It looks like it's iterating through the values, calling a simple 
String set on each one.

So I tried backing with an array list, like so:

package com.boa.cis.portal.forms;

import java.util.ArrayList;
import org.apache.struts.action.ActionForm;

public class FooForm extends ActionForm {

    private ArrayList<String> bar;
    
    public FooForm() {
      bar = new ArrayList<String>();
    }

    public String getBar(int index) {
      return this.bar.get(index);
    }

    public String[] getBar() {
      return (String[])this.bar.toArray();
    }

    public void setBar(int index, String bar) {
      this.bar.set(index,bar);
    }

    public void setBar(String[] bar) {
      this.bar.clear();
      for (int i = 0; i < bar.length; i++) {
        this.bar.set(i,bar[i]);
      }
    }
    
    public void reset(org.apache.struts.action.ActionMapping mapping, 
javax.servlet.http.HttpServletRequest request) {
      bar = new ArrayList<String>();
      super.reset(mapping, request);
    } }

But that won't even render the form - I get a ClassCastException:

ERROR 2005-01-19 10:58:58 
org.apache.struts.taglib.tiles.InsertTag$InsertHandler.doEndTag(InsertTag.ja
va:918) 
ServletException in 'foo.jsp': Getter for property bar threw 
exception: java.lang.ClassCastException: [Ljava.lang.Object;
javax.servlet.ServletException: Getter for property bar threw 
exception: java.lang.ClassCastException: [Ljava.lang.Object;
at 
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextI
mpl.java:825)


I'm using Struts 1.2.6.

  From all I can tell of the error reporting, is that possibly the 
Struts taglib is not using the multiple="true" property the way it 
ought, so it doesn't think it's supposed to be looking for an array 
type from the getter method on my form bean.

Has anybody had any success with this?

Thanks
Will

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to