在上传图片的时候,用户可以传多张图片,我通过JS来给页面添加input标签。
这就造成input标签个数不确定。那么我对应的struts表当的formbean应该怎么
设计啊?
    在做多选框表单的时候,<input type="checkbox" value="1" />标签的值设置成整形的,我的frombean
可以设计成一个整形数组,而所有input标签的名字设置成一致。那么formbean获取的
这个整形数组就是我所有选中了的checkbox的值组成的数组。    效仿上面这个例子。我的formbean里设计一个FormFile数组files,而用页面中的
<input type="file" />标签的名字都设为files,原以为可以得到用户所输入的FormFile
数组,但是报错说类型不匹配。请问要怎么解决啊?

解决方案 »

  1.   

    换个角度呢,干嘛去钻牛角尖。不要用FormFile了。
    直接在action里从request对象里拿文件。
      

  2.   

    如果是用struts的formbean,不能实现你的动态表单。
    可以上网找个多文件上传的列子,如果不涉及文件上传,可使用将当前页面元素的值封装为一个xml然后通过ajax的send方法发送xmlDoc到后台,然后解析xml并处理业务即可
      

  3.   

    谢谢~开始我也想过了,request.getParameter(String),可以用变量来代替属性名。那么我就可以利用循环(给属性名加整形后缀)来得到所有的数据。但是我以前做文件上传都用的struts表单。如果用request获取数据,那么如何获得文件的数据流呢?struts表单是FormFile.getInputStream();request对象有什么方法呀?
      

  4.   

    你去看看 ActionForm 的 getMultipartRequestHandler() 方法,相信会有答案的。注意,要用这个方法的时候Action第一要配置一个form-bean,空的也行,不能不配。否则会抛异常。
      

  5.   

    使用freeer实现动态表单,在action中加一个map接受表单参数。
      

  6.   

    为什么不可以,很简单的吧,很久之前在网上找的demo 忘记出处了 贴到下面
    public class MultiUploadForm extends ActionForm {    private List myFiles;    public MultiUploadForm(){        myFiles = new ArrayList();        //为了能够在页面初始显示一个file        myFiles.add(new UploadFile());    }    public List getMyFiles() {        return myFiles;    }    
      //注意这个方法的定义
       public UploadFile getUploadFile(int index){        int size = myFiles.size();        if(index>size-1){            myFiles.add(new UploadFile());        }        return (UploadFile)myFiles.get(index);    }    public void setMyFiles(List myFiles) {        this.myFiles = myFiles;    }}
    Dataset部分:public class UploadFile implements Serializable {    private FormFile file;    public FormFile getFile() {        System.out.println("run in uploadFile.getFile()");        return file;    }    public void setFile(FormFile file) {        this.file = file;    }}Action部分:public class MultiUploadAction extends Action {    public ActionForward execute(ActionMapping mapping, ActionForm form,                                 HttpServletRequest request,                                 HttpServletResponse response) {        MultiUploadForm multiUploadForm = (MultiUploadForm) form;        List myFiles = multiUploadForm.getMyFiles();        for(int i =0;i<myFiles.size();i++){            UploadFile uploadFile = (UploadFile)myFiles.get(i);            FormFile file = uploadFile.getFile();
                if(file==null){                System.out.println("file is null");            }            else{
                    //能运行到这里,就可以使用单个文件上传的方法进行上传了。循环而已                System.out.println("filename:::" + file.getFileName());                System.out.println("file size:::" + file.getFileSize());            }        }
            return null;    }}
    JSP部分:
    <%@ page contentType="text/html; charset=GBK" %><%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" %>
    <html:html><head><title>multiUploadDemo</title></head><script language="javascript" type="">   var num = 0;   function addFile(){      var innerHTML = multiUploadForm.innerHTML;      var signal = "<TD id=tdTarget>";      var signalLen = signal.length;      var targetIndex = innerHTML.indexOf(signal);
          var preHTML = innerHTML.substring(0,(targetIndex-6));      var subHTML = innerHTML.substring(targetIndex-6);      num++;      var insertHTML = "<TR><TD><input type=file name=uploadFile["+ num + "].file value=''></TD>";      innerHTML = preHTML + insertHTML + subHTML;
          multiUploadForm.innerHTML = innerHTML;      //alert(multiUploadForm.innerHTML);   }   function upload(){     multiUploadForm.submit();   }</script><body bgcolor="#ffffff"><html:form method="post" action="/multiUploadAction.do" enctype="multipart/form-data"><table border="1"><TBODY><br><br>
    this is file  <nested:iterate id="uploadFile" property="myFiles" name="multiUploadForm" indexId="index">      <nested:nest property="uploadFile">        <nested:file property="file" name="uploadFile" indexed="true"/>      </nested:nest>  </nested:iterate>
    <TR>  <input type="button" name="btnAddFile" value="Add File" onclick="addFile()"/>  <TR><TD id="tdTarget"></TD>  <input type="button" name="btnUpload" value="upload" onclick="upload()"></TBODY></table></html:form></body></html:html>
     struts-config.xml部分:
      <form-beans>    <form-bean name="multiUploadForm" type="MultiUploadForm" />  </form-beans>
    <action name="multiUploadForm" path="/multiUploadAction" type="MultiUploadAction" />
      

  7.   

    太乱了 重贴下:public class MultiUploadForm extends ActionForm {    
    private List myFiles;    
    public MultiUploadForm(){        
    myFiles = new ArrayList();        
    //为了能够在页面初始显示一个file        
    myFiles.add(new UploadFile());    
    }    
    public List getMyFiles() {        
    return myFiles;    
    }    
      //注意这个方法的定义
       public UploadFile getUploadFile(int index){        
    int size = myFiles.size();        
    if(index>size-1){           
     myFiles.add(new UploadFile());       
     }       
     return (UploadFile)myFiles.get(index);  
      }   
     public void setMyFiles(List myFiles) {        
    this.myFiles = myFiles;   
     }
    }
    Dataset部分:
    public class UploadFile implements Serializable {    
    private FormFile file;    
    public FormFile getFile() {        
    System.out.println("run in uploadFile.getFile()");        
    return file;    
    }    
    public void setFile(FormFile file) {        
    this.file = file;    
    }
    }
    Action部分:
    public class MultiUploadAction extends Action {    
    public ActionForward execute(ActionMapping mapping, ActionForm form,                                 
    HttpServletRequest request,                                 
    HttpServletResponse response) {       
     MultiUploadForm multiUploadForm = (MultiUploadForm) form;       
     List myFiles = multiUploadForm.getMyFiles();        
    for(int i =0;i<myFiles.size();i++){            
    UploadFile uploadFile = (UploadFile)myFiles.get(i);            
    FormFile file = uploadFile.getFile();
                if(file==null){                
    System.out.println("file is null");            
    }            
    else{
                    //能运行到这里,就可以使用单个文件上传的方法进行上传了。循环而已                System.out.println("filename:::" + file.getFileName());               
     System.out.println("file size:::" + file.getFileSize());            }        }
            return null;    
    }
    }
    JSP部分:
    <%@ page contentType="text/html; charset=GBK" %>
    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
    <%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" %>
    <html:html>
    <head>
    <title>multiUploadDemo</title>
    </head>
    <script language="javascript" type="">
       var num = 0;   
    function addFile(){      
    var innerHTML = multiUploadForm.innerHTML;      
    var signal = "<TD id=tdTarget>";      
    var signalLen = signal.length;      
    var targetIndex = innerHTML.indexOf(signal);
    var preHTML = innerHTML.substring(0,(targetIndex-6));      
    var subHTML = innerHTML.substring(targetIndex-6);      
    num++;      
    var insertHTML = "<TR><TD><input type=file name=uploadFile["+ num + "].file value=''></TD>";      
    innerHTML = preHTML + insertHTML + subHTML;
    multiUploadForm.innerHTML = innerHTML;      
    //alert(multiUploadForm.innerHTML);   
    }   
    function upload(){     
    multiUploadForm.submit();   
    }
    </script>
    <body bgcolor="#ffffff">
    <html:form method="post" action="/multiUploadAction.do" enctype="multipart/form-data">
    <table border="1">
    <TBODY><br><br>
    this is file  
    <nested:iterate id="uploadFile" property="myFiles" name="multiUploadForm" indexId="index">      <nested:nest property="uploadFile">        
    <nested:file property="file" name="uploadFile" indexed="true"/>      
    </nested:nest>  
    </nested:iterate>
    <TR>  
    <input type="button" name="btnAddFile" value="Add File" onclick="addFile()"/>  
    <TR><TD id="tdTarget"></TD>  
    <input type="button" name="btnUpload" value="upload" onclick="upload()">
    </TBODY>
    </table>
    </html:form>
    </body>
    </html:html>
     struts-config.xml部分:
      <form-beans>    
    <form-bean name="multiUploadForm" type="MultiUploadForm" />  
    </form-beans>
    <action name="multiUploadForm" path="/multiUploadAction" type="MultiUploadAction" />
      

  8.   

    谢谢楼上的朋友,也谢谢 nickycheng
    我似乎找到一个方法了。ActionForm.getMultipartRequestHandler().getAllElements()可以拿到页面中所有传过来的数据集合。
    我现在试着去做下。多谢提醒。感激不尽
      

  9.   

    感谢nivkycheng,从ActionForm.getMultipartRequestHandler().getAllElements()返回的HASHTABLE中拿到的FormFile对象可以拿到数据流,实现文件上传。多谢指点,分值不多表示心意。谢谢