[Tapestry5] Tapestry5.0.13动态实现多文件上传!

fty001 2008-07-16
今天终于解决了tapestry 5 的动态多文件上传问题,故想写下来希望对大家有所帮助。

首先需要一个数据对像:FileValue.java
如下:package com.jdapp.web.data;

import org.apache.tapestry5.upload.services.UploadedFile;

public class FileValue {


private  UploadedFile filevalue;

private Integer id;

public UploadedFile getFilevalue() {
return filevalue;
}

public Integer getId() {
return id;
}

public void setFilevalue(UploadedFile filevalue) {
this.filevalue = filevalue;
}

public void setId(Integer id) {
this.id = id;
}



}
然后再写一个页面类BlockDemo :package com.jdapp.web.pages;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;

import org.apache.tapestry5.PrimaryKeyEncoder;
import org.apache.tapestry5.annotations.BeginRender;
import org.apache.tapestry5.annotations.Log;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
import org.apache.tapestry5.upload.services.MultipartDecoder;
import org.apache.tapestry5.upload.services.UploadedFile;
import org.apache.tapestry5.util.DefaultPrimaryKeyEncoder;

import com.jdapp.web.data.DoubleItem;
import com.jdapp.web.data.FileValue;

import edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicInteger;

public class BlockDemo {

@Property private List<FileValue> files = new
ArrayList<FileValue>();

    @Property private FileValue currentValue;
    private static final AtomicInteger ID_ALLOCATOR = new AtomicInteger(1);
   
    @Property
    private UploadedFile file;
   
    @Persist
    private  Map<Integer, FileValue> DB ;
   
    @BeginRender
    public void setup()
   
    {
    if(DB==null)
   
    {
   
    DB= CollectionFactory.newConcurrentMap();
    }
   
    }

   // @Property
  //  private DefaultPrimaryKeyEncoder<Integer, FileValue> encoder = new DefaultPrimaryKeyEncoder<Integer, FileValue>();

    public PrimaryKeyEncoder getEncoder()
    {
        return new PrimaryKeyEncoder<Integer, FileValue>()
        {
            public Integer toKey(FileValue value)
            {
                return value.getId();
            }

            public void prepareForKeys(List<Integer> keys)
            {
            }

            public FileValue toValue(Integer key)
            {
                return DB.get(key);
            }
        };
    }
   
   
    @Inject
    private MultipartDecoder decoder;
   
    @Log
    public List<FileValue> getDoubleItems()
    {
        //
   
   
    //List<UploadedFile> items = CollectionFactory.newList(DB.values());
   

        List<FileValue> items = CollectionFactory.newList(DB.values());
   

        return items;
    }
   

    public int getNumOfFiles() {
      return files.size();
    }

    public void onSubmit() {
    System.out.println("提交ajaxForm");
    List<FileValue> items = CollectionFactory.newList(DB.values());
   
    for (FileValue v : items) {
   
    System.out.println(v.getFilevalue().getFileName());
   
   
}
   
   
      // what do i do here?
    }

    public Object onAddRow() {
   
    FileValue file=new FileValue();
    System.out.println(".............................................."+file);
    file.setId(ID_ALLOCATOR.incrementAndGet());
   
    DB.put(file.getId(), file);
    //System.out.println("is null...."+currentValue);
   
    //System.out.println("添加一列");
        return file; // what do i do here? this causes illegal state excepton
     
     
    }

    void onRemoveRow(FileValue item)
    {
        DB.remove(item.getId());
    }
   
    void onPrepareForSubmit()
    {
       
    }

    void onAfterSubmit()
    {
      
    }


    void onActionFromReset()
    {
        DB.clear();
    }


}
与以上页面类对应的页面如下:BlockDemo.tml
<html t:type="Border" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">  
      
  
  <t:form>


  <li t:id="loop"   t:type="ajaxformloop" source="doubleItems" value="currentValue" encoder="encoder">
         <t:submitnotifier>
           <t:upload t:value="currentValue.filevalue"  />
           <t:removerowlink>移除文件</t:removerowlink>
         </t:submitnotifier>
         <t:parameter name="addRow">
           <t:addrowlink>添加一行</t:addrowlink>
         </t:parameter>

     
    </li>
      <div class="t-beaneditor-row">
          <input type="submit" value="Submit"/>
       </div>
     </t:form>

     <p>Number of strings (after submit): ${numOfFiles}</p>

     <t:grid source="files"/>

  </html> 
即可实现动态加态上传控件,可以想传多少个文件均可

missjie0527 2008-08-09
Unable to resolve 'Border' to a component class name.

“Border“是自己定义的??
tph_java 2008-08-20
[flash=200,200][/flash][url][/url][img][/img]
引用
[u][/u][i][/i][b][/b]
mgo 2008-10-30

import com.jdapp.web.data.DoubleItem;
import com.jdapp.web.data.FileValue;

import edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicInteger;

这三个怎么没见你贴啊!?
mgo 2008-10-30
搞定了!多谢楼主!

三个包其实是写错了,DoubleItem可以不要
edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicInteger;
其实是java.util.concurrent.atomic.AtomicInteger;

顺便解答下missjie0527的问题:
border是指tapestry页面的body!你自己写也可以!
Global site tag (gtag.js) - Google Analytics