WebDav-Milton之一

这几篇主要介绍下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上不知道如何上传,把文件直接复制到目录下报错:
这里写图片描述

这个问题有待解决…

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页