使用 Metro 创建 Web 服务的简单示例

红薯 发布于 2012/02/13 23:53
阅读 1K+
收藏 6

Metro是一个高性能,可扩展,易于使用的web service stack/framework。它提供一个一站式解决方案来满足你所有web service需求。

下面我们使用 Metro 来创建一个简单的 Web 服务:

Music.java

package com.wordpress.jdevel.ws;
 
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
 
@WebService(serviceName = "Music")
public class Music {
 
    private static final File FOLDER = new File("D:/TEMP/SONGS");
 
    @WebMethod(operationName = "listSongs")
    public Song[] listSongs(@WebParam(name = "artist") String artist) {
 
        List<Song> songs = new ArrayList<Song>();
        System.out.println("ARTIST: " + artist);
        if (artist != null) {
            File folder = new File(FOLDER, artist);
            if (folder.exists() && folder.isDirectory()) {
                File[] listFiles = folder.listFiles(new FilenameFilter() {
 
                    public boolean accept(File dir, String name) {
                        return name.toUpperCase().endsWith(".MP3");
                    }
                });
 
                for (File file : listFiles) {
                    String fileName = file.getName();
                    String author = file.getParentFile().getName();
                    int size = (int) (file.length() / 1048576); //Megabytes
                    Song song = new Song(fileName, author, size);
                    songs.add(song);
                }
            }
        }
 
        return songs.toArray(new Song[songs.size()]);
    }
 
    @WebMethod(operationName = "listArtists")
    public String[] listArtists() {
        File[] folders = getFolders(FOLDER);
        List<String> artists = new ArrayList<String>(folders.length);
        for (File folder : folders) {
            artists.add(folder.getName());
        }
        return artists.toArray(new String[artists.size()]);
    }
 
    private File[] getFolders(File parent) {
        FileFilter filter = new FileFilter() {
 
            public boolean accept(File pathname) {
                return pathname.isDirectory();
            }
        };
 
        File[] folders = parent.listFiles(filter);
 
        return folders;
    }
 
    public static void main(String[] args) {
        Music listFiles = new Music();
        String[] artists = listFiles.listArtists();
        System.out.println("Artists: " + artists);
        for (String artist : artists) {
            Song[] listSongs = listFiles.listSongs(artist);
            for (Song song : listSongs) {
                System.out.println(song.getArtist() + " : " + song.getFileName() + " : " + song.getSize() + "MB");
            }
        }
    }
}

我们还需要一个简单的 Bean 类来处理复杂数据类型:

package com.wordpress.jdevel.ws;
 
import java.io.Serializable;
 
public class Song implements Serializable {
    String fileName;
    String artist;
    int size;
 
    public Song() {
    }
 
    public Song(String fileName, String artist, int size) {
        this.fileName = fileName;
        this.artist = artist;
        this.size = size;
    }
 
    public String getArtist() {
        return artist;
    }
 
    public void setArtist(String artist) {
        this.artist = artist;
    }
 
    public String getFileName() {
        return fileName;
    }
 
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
 
    public int getSize() {
        return size;
    }
 
    public void setSize(int size) {
        this.size = size;
    }
}

我们需要使用注解 @WebService(serviceName = "Music") 来声明一个 Web 服务,然后通过 @WebMethod(operationName = "listArtists") 来标注一个服务方法。

如果你使用 GlassFish 的话,这就足够了。但我们这里使用的是 Tomcat,因此还需要额外的 3 步:

1. 拷贝 Metro 2.0 的 jars 文件到 WEB-INF/lib
2. 在 web.xml 中添加 Metro 的 servlet 和 listener:

<listener>
	<listener-class>
		com.sun.xml.ws.transport.http.servlet.WSServletContextListener
	</listener-class>
</listener>
<servlet>
	<servlet-name>Music</servlet-name>
	<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>Music</servlet-name>
	<url-pattern>/Music</url-pattern>
</servlet-mapping>

请不要修改上述内容,将它们粘贴到你的 web.xml 中的 web-app 节点中。

3. 然后添加 sun-jaxws.xml 文件到 WEB-INF 目录:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
	<endpoint implementation="com.wordpress.jdevel.ws.Music" name="Music" url-pattern="/Music"/>
</endpoints>

上述XML中:

  • implementation 必须与 @WebService 类名一致
  • name 必须与 @WebService 注解中声明的 serviceName 一致
  • url-pattern 必须与 web.xml 中定义的 servlet 的 url-pattern 一致

然后你就可以启动 Tomcat 并打开浏览器访问如下地址:

http://localhost:8080/WSServer/Music

加载中
返回顶部
顶部