这几篇主要介绍下Milton,一个用java实现了WebDav协议的开源软件,并且可以集成Spring(貌似是唯一一个实现WebDav协议支持Spring)
原文地址:http://milton.io/programs/milton/anno/anno1/pgetting-started-with-annotations.html
(原文地址时不时的访问不了)
我的例子是在官网例子上修改的(主要是改了pom文件等),
这篇文章对应的例子是:examples/tuts-anno1,例子源码见https://github.com/zlp1992/micro-milton
先使用maven建立一个web项目,修改pom.xml文件如下
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.milton.tuts</groupId>
<artifactId>tuts-anno1-hello-world</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>tuts-anno1-hello-world</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<milton.version>2.7.3.0</milton.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<configuration>
<contextPath>/</contextPath>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<!--<port>8085</port>-->
<port>8080</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>
<stopKey>stop</stopKey>
<stopPort>8089</stopPort>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>bintray-milton-Milton</id>
<name>bintray</name>
<url>http://dl.bintray.com/milton/Milton</url>
</repository>
<repository>
<id>ettrema-repo</id>
<url>http://milton.io/maven/</url>
</repository>
<repository> <!-- 这里额外加上maven的仓库是怕有些依赖下不下来-->
<id>maven repo</id>
<url>http://repo1.maven.org/maven2/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository> <!-- 这里额外加上maven的仓库是怕有些依赖下不下来-->
<id>maven repo</id>
<url>http://repo1.maven.org/maven2/</url>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>io.milton</groupId>
<artifactId>milton-server-ce</artifactId>
<version>${milton.version}</version>
</dependency>
</dependencies>
</project>
接着在web.xml文件中添加milton的MiltonFilter
以及AnnotationResourceFactory
,如下所示
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<filter>
<filter-name>MiltonFilter</filter-name>
<filter-class>io.milton.servlet.MiltonFilter</filter-class>
<init-param>
<param-name>resource.factory.class</param-name>
<param-value>io.milton.http.annotated.AnnotationResourceFactory</param-value>
</init-param>
<init-param>
<param-name>controllerPackagesToScan</param-name>
<param-value>com.helloworld</param-value>
</init-param>
<!--
<init-param>
<param-name>contextPath</param-name>
<param-value>/webdav</param-value>
</init-param>
-->
</filter>
<filter-mapping>
<filter-name>MiltonFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
</welcome-file-list>
</web-app>
后面就可以开始写逻辑代码了,创建一个HelloWorldController类,并用Milton的注解@ResourceController
标记,接下来第一件事是得让Milton知道你的文件/目录的的层级关系的根是什么,可以使用@Root
注解标记这是你整个文件层次关系的根,现在就可以运行程序了,但是为了更有点意思,创建一个Product类,表示产品,并且使用@ChildrenOf
注解标记方法,用于获取子节点(即子文件或目录),代码如下:
package com.helloworld;
import io.milton.annotations.ChildrenOf;
import io.milton.annotations.PutChild;
import io.milton.annotations.ResourceController;
import io.milton.annotations.Root;
import java.util.ArrayList;
import java.util.List;
@ResourceController //注解告诉milton这是一个Controller
public class HelloWorldController {
private static org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(HelloWorldController.class);
private List<Product> products = new ArrayList<Product>();
public HelloWorldController() {
products.add(new Product("hello"));
products.add(new Product("world"));
}
@Root //此注解表示整个文件层次的根,只能有一个
public HelloWorldController getRoot() {
return this;
}
@ChildrenOf //表明是谁的孩子节点,这里即返回的是HelloWorldController的子节点
public List<Product> getProducts(HelloWorldController root) {
return products;
}
public class Product {
private String name;
public Product(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
}
在命令行使用 mvn jetty:run
运行,成功后,因为我是在windows运行,因此如何在windows连接我们启动的webdav服务器,单击打开计算机->右击选择添加一个网络位置,进入添加网络位置向导,输入我们的地址:http://localhost:8080
,此时会提示输入用户名和密码,默认的用户名和密码为:”user”, “passoword”,成功后便可看到如下所示:
这里我们看到文件类型为文件,那么如何创建文件夹即目录??
在milton中,如何可以包含子节点那么就是文件夹,在例子中,我们只有一个@ChildrenOf
注解,表明其实root节点的孩子,实际上root就是一个文件夹,我们可以再在Product上添加一个@ChildrenOf
注解,即可产生文件夹。
再创建一个ProductFile类作为Product的子节点即孩子,添加如下代码:
@ChildrenOf
public List<ProductFile> getProductFiles(Product product) {
return product.getProductFiles();
}
public class ProductFile {
private String name;
private byte[] bytes;
public ProductFile(String name, byte[] bytes) {
this.name = name;
this.bytes = bytes;
}
public String getName() {
return name;
}
}
再次运行便可以看到目录了:
此时,这些目录都是空目录,接下来如何在文件夹里上传文件呢?
使用@PutChild
注解,最后整体代码如下:
package com.helloworld;
import io.milton.annotations.ChildrenOf;
import io.milton.annotations.PutChild;
import io.milton.annotations.ResourceController;
import io.milton.annotations.Root;
import java.util.ArrayList;
import java.util.List;
@ResourceController
public class HelloWorldController {
private static org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(HelloWorldController.class);
private List<Product> products = new ArrayList<Product>();
public HelloWorldController() {
products.add(new Product("hello"));
products.add(new Product("world"));
}
@Root
public HelloWorldController getRoot() {
return this;
}
@ChildrenOf
public List<Product> getProducts(HelloWorldController root) {
return products;
}
@ChildrenOf
public List<ProductFile> getProductFiles(Product product) {
return product.getProductFiles();
}
@PutChild //上传文件
public ProductFile upload(Product product, String newName, byte[] bytes) {
ProductFile pf = new ProductFile(newName, bytes);
product.getProductFiles().add(pf);
return pf;
}
public class Product {
private String name;
private List<ProductFile> productFiles = new ArrayList<ProductFile>();
public Product(String name) {
this.name = name;
}
public String getName() {
return name;
}
public List<ProductFile> getProductFiles() {
return productFiles;
}
}
public class ProductFile {
private String name;
private byte[] bytes;
public ProductFile(String name, byte[] bytes) {
this.name = name;
this.bytes = bytes;
}
public String getName() {
return name;
}
}
}
不幸的是,我运行后,在windows上不知道如何上传,把文件直接复制到目录下报错:
这个问题有待解决…