IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  XML  >

使用 Atom 管理媒体集

利用 Atom 发布协议(Atom Publishing Protocol)

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

讨论

样例代码


级别: 中级

Nicholas Chase (ibmquestions@nicholaschase.com), 自由撰稿人, Backstop Media

2007 年 7 月 05 日

您可能已经知道 Atom 联合格式是提供博客文章信息的一种方式。但是,您知不知道使用 Atom 联合格式结合 Atom 发布协议( Atom Publishing Protocol )可以管理媒体文件呢?本文就将介绍如何使用 Atom 创建基于 Web 的媒体储存库。

准备工作

阅读本文至少需要对 Atom 联合格式和一些 HTML 概念(比如说表单)有一定了解,文章中的例子使用的是 Apache Abdera 的 Java 版本,因此如果您想要使用特定的例子,那么可以借助 Java 的帮助,但是例子中的概念可以应用在任何编程语言的实现中,甚至可以应用于手写的非 API 辅助的应用程序中。

首先我们需要配置系统,使它能够处理 Atom。要完成这一步,我们将需要一个支持 Atom 发布协议( Atom Publishing Protocol )的应用服务器。Roller 很棒,并且甚至可以在此处的 developerWorks 网站上运行博客,不过其安装手册有 27 页那么长。幸运的是,Dave Johnson 已经把所有必备工具集成在了博客应用服务器中,可从以下链接获得:https://blogapps.dev.java.net/servlets/ProjectDocumentList?folderID=4598&expandFolder=4598&folderID=0. 要安装该服务器,只需将其解压至一个目录名中没有空格的目录内。然后,设置 CATALINA_HOME 环境变量并启动服务器(如图 1 所示)。


清单 1. 启动服务器
                
set CATALINA_HOME=c:\sw\blogapps-server-1.0.4
cd %CATALINA_HOME%\bin
startup

代码中的路径当然是要使用您自己的!

要运行示例应用程序,将需要一个支持 servlet 的服务器。博客应用程序中有 Tomcat,因此可以使用该服务器。如果要使用其他实例,则需要更改 server.xml 文件以防止端口冲突。

最后一步,安装 Apache Abdera 程序包(参见 参考资料 获得下载链接),这个程序可以使 APP 易于使用。解压该程序包,把 main 和 lib 目录下的所有 jar 文件添加至 CLASSPATH。

一切工作已准备就绪。





回页首


目标

这篇文章将向大家介绍如何创建一个图 1 所示的媒体集应用程序。


图 1. 最终产品
最终产品

要实现这个目标,我们将创建一个 servlet,这个 servlet 使用 Atom 发布协议把媒体资源添加到一个 Atom 采集程序中,而 Atom 采集程序是某个工作空间的一部分。要添加各个媒体资源,我们都将使用一个 POST 请求把该文件发送到采集的目标 URL。

在执行这一操作时,服务器便会创建一个相应媒体链接条目 来引用它。然后就可以在 Atom feed 中解压所有与这些项有关的信息,再使用这个 Atom feed 在 Web 页面上把信息显示出来。

Atom 协议还需要使用到一些其他的 HTTP 方法。我们将使用 GET 查询信息,当然,使用 DELETE 删除信息和使用 PUT 编辑已存在的信息(如果可能的话)。

我们从服务文档开始。





回页首


服务文档

服务文档能显示出可用的工作空间和集。比方说,如果从如下 URL 中检索 Blogapp 服务:http://localhost:8080/roller/app,那么可使用如下内容(如清单 2 所示)。


清单 2. 服务文档
                
<?xml version="1.0" encoding="UTF-8"?>
<app:service xmlns:app="http://purl.org/atom/app#">
  <app:workspace>
    <atom:title xmlns:atom="http://www.w3.org/2005/atom"
            >AdminBlog</atom:title>  
    <app:collection href=
         "http://localhost:8080/roller/app/adminblog/entries">
      <atom:title xmlns:atom="http://www.w3.org/2005/atom"
                                  >Weblog Entries</atom:title>
      <app:categories app:fixed="yes" app:scheme=
                    "http://localhost:8080/roller/adminblog/">
        <atom:category xmlns:atom="http://www.w3.org/2005/atom"
                   atom:term="/General" atom:label="General" />
...
      </app:categories>
      <app:accept>entry</app:accept>
    </app:collection>
    <app:collection href=
        "http://localhost:8080/roller/app/adminblog/resources">
      <atom:title xmlns:atom="http://www.w3.org/2005/atom"
                                      >Media Files</atom:title>
      <app:accept>image/*</app:accept>
    </app:collection>
  </app:workspace>
  <app:workspace>
    <atom:title xmlns:atom=
                "http://www.w3.org/2005/atom">main</atom:title>
    <app:collection href=
               "http://localhost:8080/roller/app/main/entries">
      <atom:title xmlns:atom="http://www.w3.org/2005/atom"
                                   >Weblog Entries</atom:title>
      <app:categories app:fixed="yes" app:scheme=
                          "http://localhost:8080/roller/main/">
        <atom:category xmlns:atom="http://www.w3.org/2005/atom" 
                  atom:term="/General" atom:label="General" />
...
      </app:categories>
      <app:accept>entry</app:accept>
    </app:collection>
    <app:collection href=
              "http://localhost:8080/roller/app/main/resources">
      <atom:title xmlns:atom="http://www.w3.org/2005/atom"
                                       >Media Files</atom:title>
      <app:accept>image/*</app:accept>
    </app:collection>
  </app:workspace>
</app:service>

请注意,文档中显示了两个工作空间,分别是 Adminblog 和 main。此处我们只要考虑后者。它有两个集。第一个是 Weblog Entries,它设计为 Atom 条目并由 accept 元素指定。第二个是一个媒体集,用于接收图象。后面,我们将向这个集进行提交。





回页首


创建条目

首先,创建一个 Java 类,使用这个 Java 类创建一个简单的条目并提交至服务器。创建条目就像操作任意其他对象(如清单 3 所示)。


清单 3. 创建条目
                
import java.util.Date;
import org.apache.abdera.Abdera;
import org.apache.abdera.factory.Factory;
import org.apache.abdera.model.Document;
import org.apache.abdera.model.Entry;
import org.apache.abdera.protocol.client.Client;
import org.apache.abdera.protocol.client.CommonsClient;
import org.apache.commons.httpclient.UsernamePasswordCredentials;

public class CreateEntry {

  public static void main(String[] args) throws Exception {
    
    Abdera abdera = new Abdera();
    Factory factory = abdera.getFactory();

    Entry entry = factory.newEntry();
    entry.setId("urn:sampleEntryIdValue");
    entry.setTitle("Pizza, pizza everywhere...");
    entry.setUpdated(new Date());
    entry.addAuthor("Nick Chase");
    entry.setContent("... and not a thing to drink.  What kind "+
                   "of place is this, anyway?");
    
    Document<Entry> doc = entry.getDocument();
    doc.writeTo(System.out);
    
    System.out.println();
    
  }
}

清单 3 中,我们创建了 Abdera 对象,Abdera 对象在其核心中包含了大多数函数。还提供了一个 Factory 对象,我们可以使用该对象创建新 Entry 对象。Entry 对象代表的是 entry 元素,就像我们在 Atom feed 中看到的一样。最后,我们可以设置元素的各种属性,比如说标题、更新日期、作者等等。 创建了 Entry 对象之后,便可以把它转换成 Document 元素,Document 元素可以方便地把 Entry 对象序列化为命令行。

其输出内容如清单 4 所示。


清单 4. 输出
                
<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <id>urn:sampleEntryIdValue</id>
  <title type="text">Pizza, pizza everywhere...</title>
  <updated>2007-03-19T03:59:49.750Z</updated>
  <author>
    <name>Nick Chase</name>
  </author>
  <content type="text">... and not a thing to drink.  What kind of 
place is this, anyway?</content>
</entry>

清注意,考虑到代码的可读性,此处添加了一些空格。

需要注意 content 元素。在一个条目中,它包含文本或 HTML 之类的内容,和一个文本的类型属性值。这是我们最终将要存储媒体文件的位置,不过首先还是看看如何在系统中添加条目。

要完成这一步,我们需要使用到一个 POST 请求,使用条目作为请求的内容(如清单 5 所示)。


清单 5. 发送条目
                
...
    System.out.println();
    
    Client client = new CommonsClient(abdera);
    UsernamePasswordCredentials credentials = 
          new UsernamePasswordCredentials("admin", "admin");
    
    client.addCredentials(
           "http://localhost:8080/roller/app/main/entries", 
           null, null, credentials);
    Document<Entry> docOut = client.post(
             "http://localhost:8080/roller/app/main/entries", 
             entry).getDocument();
    docOut.writeTo(System.out);
  }
}

首先,创建一个新的 Client 对象。这个对象基本上是一个 HTTP 客户机。博客应用服务器适用用户名和密码来保护所有的 URL,因此要使服务器能正常工作,需要为客户机添加身份凭证。

POST 请求自身包含请求所指向的 URL和条目,条目构成请求的主要内容。

这个操作发回一个响应,我们可以使用这个响应检查响应代码,查看请求是否成功(没有显示)。

在执行 POST 请求时,服务器发回有关已创建条目的信息,如清单 6 所示。


清单 6. 创建的条目
                
<?xml version='1.0' encoding='utf-8'?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title type="text">Pizza, pizza everywhere...</title>
  <link rel="alternate" 
      href="http://localhost:8080/roller/main/entry/pizza_pizza_everywhere" />
  <link rel="edit" 
    href="http://localhost:8080/roller/app/main/entry/46921b221167d69001116859d7ea0097" />
  <category term="/General" />
  <author>
    <name>admin</name>
    <email>admin@example.com</email>
  </author>
  <id>http://localhost:8080/roller/main/entry/pizza_pizza_everywhere
</id>
  <updated>2007-03-19T03:59:50Z</updated>
  <published>2007-03-19T03:59:50Z</published>
  <content type="html">... and not a thing to drink.  
      What kind of place is this, anyway?</content>
  <app:control xmlns:app="http://purl.org/atom/app#">
    <app:draft>no</app:draft>
  </app:control>
  <atom-draft xmlns="http://rollerweblogger.org/namespaces/app">9</atom-draft>
</entry>

这个文档包含两段。第一段为 alternate 链接,通过它提供的 URL 可以在浏览器中浏览条目内容。第二段为 edit 链接,它提供的 URI 在内部表示数据。后面,如果试图编辑这个条目,那么就需要使用这个 URI。

添加了条目之后,要想在集中查看它,请在浏览器的地址栏中输入 http://localhost:8080/roller/app/main/entries。应该可以看到新的条目内容,如清单 7 所示。


清单 7. 集 feed 中的新条目
                
...
    <content type="html"><div xmlns="http://www.w3.org/1999/xhtml">
         <p><i>The Blogapps server supports the upcoming Atom spec, 
             so if you install it... </i></p>
      </div></content>
    <app:control>
      <app:draft>no</app:draft>
    </app:control>
  </entry>

  <entry>
    <title>Pizza, pizza everywhere...</title>
    <link rel="alternate" 
         href="http://localhost:8080/roller/main/entry/pizza_pizza_everywhere" />
    <link rel="edit" 
 href="http://localhost:8080/roller/app/main/entry/46921b221167d69001116859d7ea0097" />
    <category term="/General" />
    <author>
      <name>admin</name>
      <email>admin@example.com</email>
    </author>
    <id>http://localhost:8080/roller/main/entry/pizza_pizza_everywhere
</id>
    <updated>2007-03-19T03:59:50Z</updated>
    <published>2007-03-19T03:59:50Z</published>
    <content type="html">... and not a thing to drink.  What kind of 
place is this, anyway?</content>
    <app:control>
      <app:draft>no</app:draft>
    </app:control>
  </entry>

  <entry>
    <title>This is an entry</title>
    <link rel="alternate" href=
"http://localhost:8080/roller/main/entry/this_is_an_entry2" />
    <link rel="edit" href=
"http://localhost:8080/roller/app/main/entry/402881821161c1fb011162b0ea
3400fd" />
    <category term="/General" />
    <author>
...

接下来看看如何对媒体资源进行操作。





回页首


创建媒体资源

创建媒体资源与创建条目的过程基本相同,不同之处就是文件本身成为了 POST 请求的内容(如清单 8 所示)。

清单 8. 创建媒体资源

                
import java.io.FileInputStream;
import java.util.Date;
import org.apache.abdera.Abdera;
import org.apache.abdera.factory.Factory;
import org.apache.abdera.model.Document;
import org.apache.abdera.model.Entry;
import org.apache.abdera.protocol.client.Client;
import org.apache.abdera.protocol.client.CommonsClient;
import org.apache.abdera.protocol.client.RequestOptions;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;

public class CreateResource {

  public static void main(String[] args) throws Exception {
    
    Abdera abdera = new Abdera();
    Factory factory = abdera.getFactory();

    Client client = new CommonsClient(abdera);

    FileInputStream inputStream = new FileInputStream(
            "c:\\ebay\\robin\\robin4.jpg");
    InputStreamRequestEntity file = 
             new InputStreamRequestEntity(inputStream, 
                                        "image/jpg");

    RequestOptions options = client.getDefaultRequestOptions();
    options.setHeader("Title", "Robin4");
    
    UsernamePasswordCredentials credentials = 
          new UsernamePasswordCredentials("admin", "admin");
    
    client.addCredentials(
           "http://localhost:8080/roller/app/main/resources", 
           null, null, credentials);
    Document<Entry> docOut = client.post(
             "http://localhost:8080/roller/app/main/resources", 
             file).getDocument();
    docOut.writeTo(System.out);
  }
}

在本例中,我们使用计算机上的一个物理文件作为参数创建了一个 FileInputStream 对象,而不是创建一个 Entry 对象。为它指定了一个 mime 类型之后,就可以开始添加内容了。不过首先,我们可以为它指定一个标题,它可以通过在请求的选项中发送头部来实现。(请注意,对标题的重视程度是完全由服务器决定的。比方说,博客应用程序会把所以的标题都转换成文件名。)

终于,可以开始向系统中添加文件了。清注意,只需要替换请求中的条目,添加文件作为 POST 请求的主体即可。

返回的文档看上去可能有点眼熟(如清单 9 所示)。


清单 9. 媒体描述条目
                
<?xml version='1.0' encoding='utf-8'?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title type="text">main-2007031900765.jpg</title>
  <link rel="edit" href=
"http://localhost:8080/roller/app/main/resource/main-
2007031900765.jpg.media-link" />
  <link rel="edit-media" href=
"http://localhost:8080/roller/app/main/resource/main-2007031900765.jpg"
/>
  <id>http://localhost:8080/roller/app/main/resource/main-
2007031900765.jpg</id>
  <updated>1970-01-01T00:00:00Z</updated>
  <content type="image/jpeg" src=
"http://localhost:8080/roller/resources/main/main-2007031900765.jpg" />
  <atom-draft xmlns="http://rollerweblogger.org/namespaces/app">9</atom-draft>
</entry>

在本例中,条目显示了如何对图像进行访问(http://localhost:8080/roller/resources/main/main-2007031900765.jpg)。如何在浏览器地址栏中输入这个 URL,那么应该可以看到图像,如图 2 所示。清注意,代码中还包含有两个编辑链接,而不是一个。编辑链接允许我们编辑 XML 条目,而 edit-media 链接允许我们编辑真正的媒体文件。


图 2. 上传的图像
上传的图像

我们还可以在 http://localhost:8080/roller/app/main/resources 链接中看到资源集的图像条目(如清单 10 所示)。


清单 10. 新 feed
                
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" ...>
  <title>main</title>
  <link rel="alternate" type="text/html" 
        href="http://localhost:8080/roller/main" />
  <id>http://localhost:8080/roller/app/main/entries/0</id>
  <updated>2007-03-19T04:46:41Z</updated>
  <entry>
    <title>main-2007031900765.jpg</title>
    <link rel="edit" href=
"http://localhost:8080/roller/app/main/resource/main-
2007031900765.jpg.media-link" />
    <link rel="edit-media" href=
"http://localhost:8080/roller/app/main/resource/main-2007031900765.jpg" 
/>
    <id>http://localhost:8080/roller/app/main/resource/main-
2007031900765.jpg</id>
    <updated>2007-03-19T04:31:36Z</updated>
    <content type="image/jpeg" src=
"http://localhost:8080/roller/resources/main/main-2007031900765.jpg" />
  </entry>
  <entry>
    <title>robin3.jpg</title>
    <link rel="edit" href=
"http://localhost:8080/roller/app/main/resource/robin3.jpg.media-link" 
/>
    <link rel="edit-media" href=
"http://localhost:8080/roller/app/main/resource/robin3.jpg" />
    <id>http://localhost:8080/roller/app/main/resource/robin3.jpg</id>
    <updated>2007-03-19T02:20:30Z</updated>
    <content type="image/jpeg" src=
"http://localhost:8080/roller/resources/main/robin3.jpg" />
  </entry>
  <entry>
    <title>robin2.jpg</title>
...
  </entry>
</feed>

这个 feed 是 servlet 的基础。





回页首


显示 feed 中的项

第一步,创建一个新的 servlet。要显示集中的项目列表,就要解析表示该集的 feed(如清单 11 所示)。


清单 11. 解析 feed
                
import java.io.FileInputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.util.List;
import org.apache.abdera.*;
import org.apache.abdera.model.*;
import org.apache.abdera.protocol.client.*;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.UsernamePasswordCredentials;

public class FeedList extends javax.servlet.http.HttpServlet 
                               implements javax.servlet.Servlet {

   protected void doGet(HttpServletRequest request, 
                        HttpServletResponse response) 
                           throws ServletException, IOException {
      
      java.io.PrintWriter out = response.getWriter();
      out.println(
            "<html><head><title>Media List</title></head><body>");
      
      try{
         
         Abdera abdera = new Abdera();
         Client client = new CommonsClient(abdera);

         String uri = 
              "http://localhost:8080/roller/app/main/resources";        
         UsernamePasswordCredentials credentials = 
              new UsernamePasswordCredentials("admin", "admin");
         client.addCredentials(uri, null, null, credentials);

         Document<Feed> doc = client.execute("get", uri, null,
                    null).getDocument();

         Feed feed = doc.getRoot();
         List<Entry> entries = feed.getEntries();
       
         int numEntries = entries.size();
         for (int i = 0; i < numEntries; i++){
            Entry thisEntry = entries.get(i);
            out.println(thisEntry.getTitle());
            out.println("<br />");
            out.print("<img height='120' src='");
            out.println(
                   thisEntry.getContentElement().getSrc().toString());
            out.println("' /><br />");
            out.println("<a href='FeedList?action=delete&uri="+
                   thisEntry.getEditLinkResolvedHref()+"'>Delete</a>");
            out.println("<hr />");
         }
      
         out.println("<form action='FeedList' method='post'>");
         out.println(
              "URL for media: <input type='text' name='newMedia' />");
         out.println(
               "Title for media: <input type='text' name='title' />");
         out.println(
               "<br /><input type='submit' value='Add New Asset' />");
         out.println("</form>");

      } catch (Exception e){
         e.printStackTrace(response.getWriter());
      }
      
      out.println("</body></html>");
      
   }     
   
}

在 servlet 的 doGet() 方法(该方法用于触发在浏览器向 servlet 提交的一个 GET 请求)中,像前面一样创建 Abdera 和客户机对象,添加凭证等等。而在本例中,我们将向服务器发送一个 GET 请求,用于检索对应于该集的 Feed 文档。

获取这个文档之后,便可以通过使用 getRoot() 方法获得真正的 Feed 对象。要从 feed 中检索真正的条目,可以使用 getEntries() 方法检索各个 List<Entry>。完成这步之后,便可以逐个遍历它的 Entry 对象,并为每个 Entry 对象显示相应的 HTML。这个 HTML 包含一个 img 标志,这个 img 标记以最小高度 120 象素显示真正的图像和一个删除该资源的链接。(后者使用 getEditLinkResolvedHref() 方法检索在内部与条目对应的实际的 URL。)

需要注意页面底部的表单。那个表单可以让用户输入要添加的内容。因为该表单指定了 POST 方法,所以我们将把那个函数添加到 doPost() 方法中(如清单 12 所示)。


清单 12. doPost() 方法
                
...
      out.println("</body></html>");
      
   }     
   
   protected void doPost(HttpServletRequest request, 
                         HttpServletResponse response) 
                            throws ServletException, IOException {

      java.io.PrintWriter out = response.getWriter();
      out.println(
         "<html><head><title>Media List</title></head><body>");
      
      try {
         Abdera abdera = new Abdera();
         Client client = new CommonsClient(abdera);
         UsernamePasswordCredentials credentials = 
               new UsernamePasswordCredentials("admin", "admin");
         client.addCredentials(
              "http://localhost:8080/roller/app/main/resources", 
              null, null, credentials);

         String uri = 
               "http://localhost:8080/roller/app/main/resources";
         Document<Entry> docOut = null;
         
         FileInputStream inputStream = new FileInputStream(
               request.getParameter("newMedia").toString());
         InputStreamRequestEntity file = 
                new InputStreamRequestEntity(inputStream, 
                                           "image/jpg");

         RequestOptions options = client.getDefaultRequestOptions();
         options.setHeader("Title", request.getParameter("title"));
      
         docOut = client.post(uri, file, options).getDocument();
          doGet(request, response);
      } catch (Exception e){
         e.printStackTrace();
      }
      
      out.println("</body></html>");      
   }               
}

此处我们添加了图像,其操作和在 standalone 中添加图像一样。不同之处就是需要从 servlet 请求中检索参数,以决定待添加文件的位置和标题。

清注意,我们还可加以设置,使用户能够上传文件到服务器中,不过因为这一操作涉及到提取上载到 Java servlet 中的文件的复杂操作,所以我把这个操作留给读者做为练习来完成。

应该可以在 feed 中看到新的条目,如清单 13. 所示。


清单 13. 新 feed
                
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" ... >
  <title>main</title>
  <link rel="alternate" type="text/html" 
        href="http://localhost:8080/roller/main" />
  <id>http://localhost:8080/roller/app/main/entries/0</id>
  <updated>2007-03-19T04:46:41Z</updated>
  <entry>
    <title>main-2007031900125.jpg</title>
    <link rel="edit" href=
"http://localhost:8080/roller/app/main/resource/main-
2007031900125.jpg.media-link" />
    <link rel="edit-media" href=
"http://localhost:8080/roller/app/main/resource/main-2007031900125.jpg" 
/>
    <id>http://localhost:8080/roller/app/main/resource/main-
2007031900125.jpg</id>
    <updated>2007-03-19T04:46:41Z</updated>
    <content type="image/jpeg" src=
"http://localhost:8080/roller/resources/main/main-2007031900125.jpg" />
  </entry>
  <entry>
    <title>main-200703190078.jpg</title>
    <link rel="edit" href=
"http://localhost:8080/roller/app/main/resource/main-
200703190078.jpg.media-link" />
...  

我们还可以在当前的 servlet 页面中看到新的图像。





回页首


删除资源

删除某个的条目非常简单。记住,我们为每个资源都创建了一个链接。这个链接使浏览器中的请求有两个参数:action 参数和资源的 edit-URI。可以使用这个信息来删除资源(如清单 14 所示)。


清单 14. 删除资源
                
...
   protected void doGet(HttpServletRequest request, 
                        HttpServletResponse response) 
                           throws ServletException, IOException {
      
      java.io.PrintWriter out = response.getWriter();
      out.println(
            "<html><head><title>Media List</title></head><body>");
      
      String action = null;
      if (request.getParameter("action") == null){
         action = "list";
      } else {
         action = request.getParameter("action").toString();
      }
      
      try{
         
         Abdera abdera = new Abdera();
         Client client = new CommonsClient(abdera);
         String uri = 
              "http://localhost:8080/roller/app/main/resources";        
         UsernamePasswordCredentials credentials = 
              new UsernamePasswordCredentials("admin", "admin");
         client.addCredentials(uri, null, null, credentials);

         if (action.equals("list")){

...

         } else if (action.equals("delete")){
            client.delete(request.getParameter("uri").toString());
            out.println("The item has been deleted. "+
                        "<a href='FeedList'>Back to the list</a>");
         }

      } catch (Exception e){
   ...

这就全部完成了!该项已经不在集中了,因此也不在 feed 中了。





回页首


着眼于未来

您可以想知道,完成这些后该如何编辑已存在的内容项。当前版本的博客应用程序并不支持编辑媒体资源(通常的配置也是如此),不过其过程类似于清单 15,其中显示了如何编辑条目。


清单 15. 编辑条目
                
...
String editUri = "http://localhost:8080/roller/app/main/entry/40288182115c1af501115c2e50
a80033";
Document<Entry> editDoc = client.get(editUri).getDocument();
Entry thisEntry = editDoc.getRoot();
thisEntry.setTitle("This is a new Title, one that's been edited");
client.put(editUri, thisEntry);
...

要编辑某个条目,首先必须使用 edit URI(edit URI 在内部表示数据)从数据库中检索这个条目。要实现这个目标,可以使用客户机(当然是经过正确配置的)执行向那个 URL 发出的 get() 请求。这个方法会返回一个 Response 对象,我们可以从中检索 Document。有了 Document 之后,便可以使用 getRoot() 方法检索 Entry 对象了。

获得 Entry 对象之后,就可以和前面一样对它进行处理了。然而,要替代某个已存在的条目,必须使用 PUT 方法而不是使用 POST。使用 PUT 方法,可以指定 URL 和数据,而且服务器能够替代已存在的信息而不是创建一个新的条目。

记住,每个媒体资源都有一个 media-link 条目,编辑媒体信息需要使用到 media-link 条目。要替换当前的资源,只需使用文件替换编辑过的条目,就和刚开始添加资源的步骤一样(如清单 16 所示)。


清单 16. 替换资源
                
...
String editUri = "http://localhost:8080/roller/app/main/entry/40288182115c1af501115c2e50
a80033";
FileInputStream inputStream = new FileInputStream(
			   "c:\\ebay\\redbowl\\redbowl1.jpg");
InputStreamRequestEntity thisFile = 
		       new InputStreamRequestEntity(inputStream, 
		    		                        "image/jpg");
client.put(editUri, thisFile);
...

在本例中,并不需要检索 Entry,因为我们要替换的只是资源。


分享这篇文章......

digg 将本文提交到 Digg
del.icio.us 发布到 del.icio.us
Slashdot 提交到 Slashdot!





回页首


结束语

Atom 联合格式(Atom Syndication Format)非常适于在显示集中的信息细节。使用它与功能强大的Atom 发布协议( Atom Publishing Protocol )相结合,我们可以以多种方式管理资源、图像、音频或者甚至文本和 xhtml 文件。这篇文章向大家介绍了如何使用 Apache Abdera,轻松利用这些功能来创建一个基于 Web 的媒体资源管理程序。






回页首


下载

描述名字大小下载方法
示例代码x-atommedia.source.zip3KBHTTP
关于下载方法的信息


参考资料

学习

获得产品和技术

讨论


关于作者

Nicholas Chase 曾经参与多家公司的网站开发,包括 Lucent Technologies、Sun Microsystems、Oracle 和 Tampa Bay Buccaneers。Nick 曾经做过高中物理教师、低放射性废弃设备管理员、在线科幻杂志的编辑、多媒体工程师、Oracle 教员以及一家交互通信公司的首席技术官。他出版了多部著作,包括 XML Primer Plus(Sam's)。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

将您的建议发给我们或者通过参加讨论与其他人分享您的想法.




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款