示例演示:上传电子书的用例
下面针对用户上传一个文档这个用例,讲述如何实现这个功能。
构建上传文件页面
在工程的 war 目录下,添加一个新的文件 upload.html,在该文件中包含如下的代码。
<form method="post" action="upload" enctype="multipart/form-data">
<table>
<tbody>
<tr><td><strong>*Please select a file</strong></td></tr>
<tr><td><input name="efile" type="file" id="fileNode"></td></tr>
<tr><td><strong>*Please set the file's title</strong></td></tr>
<tr><td><input name="filename" type="text" size=60></td></tr>
<tr><td><strong>File tags</strong></td></tr>
<tr><td><input name="tags" type="text" size=60>
<label>seperate by whitespace, like
<i><b>Google appengine</b></i>
</label></td>
</tr>
<tr><td><strong>File description</strong></td></tr>
<tr><td>
<textarea name="description" rows="5" cols="50"></textarea>
</td></tr>
<tr><td><strong>your name</strong></td></tr>
<tr><td><input name="username" type="text" size=60></td></tr>
<tr><td><strong>your email</strong></td></tr>
<tr><td><input name="useremail" type="text" size=60></td></tr>
</tbody>
</table>
<input type="submit" value="upload">
</form>
<table>
<tbody>
<tr><td><strong>*Please select a file</strong></td></tr>
<tr><td><input name="efile" type="file" id="fileNode"></td></tr>
<tr><td><strong>*Please set the file's title</strong></td></tr>
<tr><td><input name="filename" type="text" size=60></td></tr>
<tr><td><strong>File tags</strong></td></tr>
<tr><td><input name="tags" type="text" size=60>
<label>seperate by whitespace, like
<i><b>Google appengine</b></i>
</label></td>
</tr>
<tr><td><strong>File description</strong></td></tr>
<tr><td>
<textarea name="description" rows="5" cols="50"></textarea>
</td></tr>
<tr><td><strong>your name</strong></td></tr>
<tr><td><input name="username" type="text" size=60></td></tr>
<tr><td><strong>your email</strong></td></tr>
<tr><td><input name="useremail" type="text" size=60></td></tr>
</tbody>
</table>
<input type="submit" value="upload">
</form>
构建文件上传处理的 servlet
利用 apache 的 commons 的文件上传的库,该 servlet 将上传的内容解析成 File 对象。
图 9. Servlet 模型

持久化改文件
应为 File 类已经添加了 JDO 需要的注释,如下。
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class File {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String username;
@Persistent
private String useremail;
@Persistent
private Date uploadDate;
@Persistent
private String filename; //could be a filename or a url...
@Persistent
private String description; //could be a filename or a url...
@Persistent
private String mimeType; //pdf,ppt, chm etc.
@Persistent
private com.google.appengine.api.datastore.Blob file;
@Persistent
private Set<Key> tags = new HashSet<Key>(); // associated tags
public class File {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String username;
@Persistent
private String useremail;
@Persistent
private Date uploadDate;
@Persistent
private String filename; //could be a filename or a url...
@Persistent
private String description; //could be a filename or a url...
@Persistent
private String mimeType; //pdf,ppt, chm etc.
@Persistent
private com.google.appengine.api.datastore.Blob file;
@Persistent
private Set<Key> tags = new HashSet<Key>(); // associated tags
利用 JDO 的规范提供的 API,可以持久化该对象到 Google 的 App Engine 的存储设施上。
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
pm.makePersistent(file);
} finally {
pm.close();
}
try {
pm.makePersistent(file);
} finally {
pm.close();
}
注意,这里需要首先在在项目的 classpath 的 META-INF 目录下有 jdoconfig.xml,其内容如下。
<?xml version="1.0" encoding="utf-8"?>
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">
<persistence-manager-factory name="transactions-optional">
<property name="javax.jdo.PersistenceManagerFactoryClass"
value="org.datanucleus.store.appengine.jdo.
DatastoreJDOPersistenceManagerFactory"/>
<property name="javax.jdo.option.ConnectionURL" value="appengine"/>
<property name="javax.jdo.option.NontransactionalRead" value="true"/>
<property name="javax.jdo.option.NontransactionalWrite" value="true"/>
<property name="javax.jdo.option.RetainValues" value="true"/>
<property name="datanucleus.appengine.autoCreateDatastoreTxns"
value="true"/>
</persistence-manager-factory>
</jdoconfig>
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">
<persistence-manager-factory name="transactions-optional">
<property name="javax.jdo.PersistenceManagerFactoryClass"
value="org.datanucleus.store.appengine.jdo.
DatastoreJDOPersistenceManagerFactory"/>
<property name="javax.jdo.option.ConnectionURL" value="appengine"/>
<property name="javax.jdo.option.NontransactionalRead" value="true"/>
<property name="javax.jdo.option.NontransactionalWrite" value="true"/>
<property name="javax.jdo.option.RetainValues" value="true"/>
<property name="datanucleus.appengine.autoCreateDatastoreTxns"
value="true"/>
</persistence-manager-factory>
</jdoconfig>
本文介绍了云计算领域的一个重要厂商 Google 的 Appengine for Java 的开发平台。通过一个实际的例子讲述了如何使用该平台开发 Web 应用。