 | Уровень сложности: средний Никлас Чейз, Независимый автор, Backstop Media
24.09.2007 Сервисный документ Atom позволяет делать значительно больше, чем просто сообщать программе чтения, где найти каналы сайта. Из этой статьи вы узнаете, как использовать этот документ для создания боковой панели, которая предоставляет средство обзора любой информации вашего сайта. В этой статье используется сервер Blogapps, который поддерживает 10-ю редакцию спецификации протокола Atom Publishing Protocol 1.0 , но она применима к любому серверу, совместимому с APP 1.0. Чтобы работать с приведенным здесь кодом, вы должны быть знакомы с программированием на Java, однако понятия Atom можно применить к любому языку программирования.
Сервисный документ
Сервисный документ Atom описывает, как сервис будет сообщать вам о доступных возможностях. Каждый сервис представляет одну или несколько рабочих областей (workspaces), в которых определена одна или несколько коллекций (collections). В коллекциях содержатся отдельные ресурсы. Например, вы можете загрузить сервисный документ Blogapps по адресу http://local hosts:8080/roller/app (см. Листинг 1).
Листинг 1. Сервисный документ
<?xml version="1.0" encoding="UTF-8"?>
<app:service xmlns:app="http://purl.org/atom/app#"
xmlns:atom="http://www.w3.org/2005/atom">
<app:workspace>
<atom:title>AdminBlog</atom:title>
<app:collection
href="http://localhost:8080/roller/app/adminblog/entries">
<atom:title>Weblog Entries</atom:title>
<app:categories app:fixed="yes"
app:scheme="http://localhost:8080/roller/adminblog/">
<atom:category atom:term="/General" atom:label="General" />
<atom:category atom:term="/Status" atom:label="Status" />
</app:categories>
<app:accept>entry</app:accept>
</app:collection>
<app:collection
href="http://localhost:8080/roller/app/adminblog/resources">
<atom:title>Media Files</atom:title>
<app:accept>image/*</app:accept>
</app:collection>
</app:workspace>
<app:workspace>
...
</app:workspace>
</app:service>
|
Из этого документа вы можете создать сервлет, содержащий боковую панель, в которой будут отображаться все доступные сервисы и каналы, а также ссылки на соответствующие документы HTML.
Базовый сервлет
Первым шагом является создание базового сервлета, в том числе пространства для боковой панели (см. Листинг 2).
Листинг 2. Базовый сервлет
package com.backstop.atom;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
public class SideBarServlet extends javax.servlet.http.HttpServlet
implements javax.servlet.Servlet {
String APPNS = "http://purl.org/atom/app#";
String AtomNS = "http://www.w3.org/2005/atom";
String AtomNS2 = "http://www.w3.org/2005/Atom";
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().print(
"<div style='width:25%; float: right;'>");
Document doc = URLContents.getContentsAsXMLDoc(
"http://localhost:8080/roller/app" );
Element root = (Element)doc.getDocumentElement();
NodeList workspaces = root.getElementsByTagNameNS(APPNS,
"workspace");
for (int i = 0; i < workspaces.getLength(); i++){
Element thisWorkspace = (Element)workspaces.item(i);
response.getWriter().print(
"<div style='border: 1px solid green; padding: 5px;'>");
String wsTitle =
thisWorkspace.getElementsByTagNameNS(AtomNS,
"title").item(0).getTextContent();
response.getWriter().print(
"<h3 class='wstitle'>"+wsTitle+"</h3>");
response.getWriter().print("</div>");
}
response.getWriter().print("</div>");
}
}
|
В этот класс входят все необходимые операторы import, а также переменные, представляющие нужные области имен. (В Blogapps есть небольшая ошибка в определении пространства имен; до тех пор, пока она не будет исправлена, вам придется объявлять обе версии: http://www.w3.org/2005/atom и http://www.w3.org/2005/Atom.)
Следующее действие заключается в добавлении к боковой панели существующих рабочих областей. Чтобы сделать это, необходимо организовать цикл по всем элементам рабочих областей документа. На сервере Blogapps все документы защищены паролем, поэтому для упрощения я переместил фактическую загрузку в отдельный вспомогательный класс URLContents. Вы можете найти этот класс в исходных кодах для этой статьи. (Если вы планируете реализовать загрузку собственными силами, не забудьте указать пространство имен в DocumentBuilderFactory.)
После того как у вас появился объект XML Document, вы можете пройти по каждому элементу рабочей области и создать для него соответствующий div на странице. Для каждой области извлекается текст названия элемента и размещается на странице, как видно из Рисунка 1.
Рисунок 1. Рабочие области
Теперь рассмотрим добавление коллекций.
Добавление коллекций
Добавление коллекций на страницу производится очень похожим образом. После того как вы получаете отдельную рабочую область, вы можете извлечь каждую из её коллекций (см. Листинг 3).
Листинг 3. Организация цикла по коллекциям
...
response.getWriter().print(
"<h3 class='wstitle'>"+wsTitle+"</h3>");
NodeList collections =
thisWorkspace.getElementsByTagNameNS(APPNS, "collection");
for (int j = 0; j < collections.getLength(); j++){
Element thisCollection = (Element)collections.item(j);
String colTitle =
thisCollection.getElementsByTagNameNS(AtomNS,
"title").item(0).getTextContent();
String feedURL = thisCollection.getAttribute("href");
response.getWriter().print(
"<h4 class='collection'>"+colTitle);
response.getWriter().print(" -- <a href='"+feedURL+
"'><img border='0' src='images/feed-icon.gif' /></a>");
response.getWriter().print("</h4>");
}
response.getWriter().print("</div>");
}
response.getWriter().print("</div>");
}
}
|
Однако для каждой коллекции нужно не просто отобразить заголовок. Каждый элемент коллекции содержит атрибут href, представляющий место расположения канала Atom для этой коллекции. Чтобы использовать эти данные, извлечем их и добавим пиктограмму канала, установив на ней ссылку на канал. Результат должен быть похож на представленный на Рисунке 2.
Рисунок 2. Добавление каналов
Добавление категорий
Кроме того, вы можете добавить указание категорий контента, охваченных каждой из коллекций (см. Листинг 4).
Листинг 4. Добавление категорий
...
response.getWriter().print(" -- <a href='"+feedURL+
"'><img border='0' src='images/feed-icon.gif' /></a>");
response.getWriter().print("</h4>");
NodeList categories =
thisCollection.getElementsByTagNameNS(AtomNS,
"category");
if (categories.getLength() > 0){
response.getWriter().print(
"Categories in this collection: ");
}
for (int k = 0; k < categories.getLength(); k++){
Element thisCategory = (Element)categories.item(k);
String catName = thisCategory.getAttributeNS(AtomNS,
"label");
if (k > 0){
response.getWriter().print(", ");
}
response.getWriter().print(catName);
}
}
response.getWriter().print("</div>");
}
response.getWriter().print("</div>");
}
}
|
Результат будет похож на страницу, представленную на Рисунке 3.
Рисунок 3. Добавление категорий
Добавление ссылок на HTML
Последний этап состоит в добавлении ссылки на представление информации в виде HTML. К сожалению, этой информации в сервисном документе нет. Чтобы получить ее, необходимо рассмотреть сам канал (см. Листинг 5).
Листинг 5. Получение информации канала
...
for (int j = 0; j < collections.getLength(); j++){
Element thisCollection = (Element)collections.item(j);
String colTitle =
thisCollection.getElementsByTagNameNS(AtomNS,
"title").item(0).getTextContent();
String feedURL = thisCollection.getAttribute("href");
String webURL = getWebURL(feedURL);
response.getWriter().print(
"<h4 class='collection'><a href='"+webURL+"'>"+>
colTitle+"</a>");
...
}
response.getWriter().print("</div>");
}
response.getWriter().print("</div>");
}
private String getWebURL(String feedURL){
String webURL = "";
Document doc = URLContents.getContentsAsXMLDoc(feedURL);
Element root = (Element)doc.getDocumentElement();
NodeList links = root.getElementsByTagNameNS(AtomNS2, "link");
for (int i = 0; i < links.getLength(); i++){
Element thisLink = (Element)links.item(i);
if (thisLink.getAttribute("rel").equals("alternate") &&
thisLink.getParentNode().equals(root)){
webURL = thisLink.getAttribute("href");
}
}
return webURL;
}
}
|
В этом случае вы извлекаете из сервисного документа URL канала, после чего извлекаете сам документ, в котором содержится элемент ссылки, например, <link rel="alternate" href="http://localhost:8080/roller/adminBlog" />, представляющий HTML-версию данных канала. После этого можно добавить полученную информацию на боковую панель. Конечный результат показан на Рисунке 4.
Рисунок 4. Добавление категорий
Резюме
Сервисный документ - это больше чем простая возможность самоанализа; при тщательном планировании вы можете использовать его для предоставления фактического контента и ссылок на него.
Загрузка | Описание | Имя | Размер | Метод загрузки |
|---|
| Atom sidebar samples | x-atomsidebar-source.zip | 3KB | HTTP |
|---|
Ресурсы Научиться
- Оригинал статьи
Create a sidebar using an Atom service document (на английском языке)
-
Обзор формата синдикации Atom 1.0 (на английском языке) (Джеймс Снелл (James Snell), developerWorks, август 2005 г.): Посмотрите, как построен этот популярный формат синдикации Web-контента.
-
Знакомство с протоколом публикации Atom Publishing Protocol (на английском языке) (Джеймс Снелл (James Snell), developerWorks, октябрь - декабрь 2005 г.): Узнайте все об интерфейсе Atom API из этой серии из трех статей:
-
RSS и Atom в действии (на английском языке) (Дэйв Джонсон (Dave Johnson), издательство Manning Publications, июль 2006 г.): Если вам необходимо нечто более реальное, познакомьтесь с этой книгой о блог-технологиях форматов новостных лент и протоколах публикации, а также о том, как совместить эти элементы. (Для этой книги был составлен Blogapps.)
-
Спецификация Atom 1.0 (на английском языке) : Познакомьтесь с этим форматом синдикации Web-контента и метаданных, построенном на базе XML.
-
Программное обеспечение, совместимое с Atom 1.0 (на английском языке) : Список наиболее распространенных пользователей Atom 1.0 можно найти на сайте Wiki рабочей группы Atom Working Group.
-
Использование формата Atom для синдикации новостей и других целей (на английском языке) (Ухе Огбуджи (Uche Ogbuji), developerWorks, май 2004 г.): Узнайте больше об этом стандарте, построенном на XML, формате и интерфейсе API для обмена данными и ссылок на Web-метаданные.
-
Раздел XML на developerWorks : Найдите еще сотни ресурсов, связанных с XML.
-
Сертификация XML корпорации IBM (на английском языке) : Узнайте, как вы можете стать сертифицированным разработчиком IBM в области XML и связанных с ним технологий.
-
Техническая библиотека XML (на английском языке) : Познакомьтесь с библиотекой XML сайта developerWorks, где вы можете найти множество технических статей и советов, рекомендаций, стандартов и руководств IBM.
-
Технические мероприятия и Web-трансляции developerWorks (на английском языке) : Самую актуальную информацию можно получить в этих разделах.
Получить продукты и технологии
Обсудить
Об авторе  | |  | Никлас Чейз (Nicholas Chase) участвовал в разработке Web-сайтов для таких компаний, как Lucent Technologies, Sun Microsystems, Oracle и Tampa Bay Buccaneers. Ник успел побывать школьным учителем физики, редактором электронного научно-фантастического журнала, инженером в области мультимедиа, инструктором по Oracle и главным инженером в интерактивной коммуникационной компании. Он является автором нескольких книг, в том числе XML Primer Plus (Sams). |
Выскажите мнение об этой странице
|  |