[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!你自己写也可以! |