IBM®
Перейти к тексту
    в России и странах СНГ [изменить]    Условия использования
 
 
   
    Главная страница    Продукты    Услуги и решения    Поддержка и загрузка    Мой профиль    
Перейти к тексту

developerWorks Россия  >  XML  >

Создание боковой панели с помощью сервисного документа Atom

Сервисные документы Atom предоставляют больше информации, чем простой ответ на вопрос, где найти каналы для сайта

developerWorks
Опции документа

Опции документа, требующие включения JavaScript, не отображаются

Обсудить

Исходные тексты примера


Выскажите мнение об этой странице

Помогите нам улучшить содержание


Уровень сложности: средний

Никлас Чейз, Независимый автор, 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.)

Поделиться этой статьей

digg digg.com
del.icio.us del.icio.us
Slashdot slashdot.org

Следующее действие заключается в добавлении к боковой панели существующих рабочих областей. Чтобы сделать это, необходимо организовать цикл по всем элементам рабочих областей документа. На сервере 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 samplesx-atomsidebar-source.zip3KBHTTP
Информация о методах загрузки


Ресурсы

Научиться

Получить продукты и технологии

Обсудить


Об авторе

Никлас Чейз (Nicholas Chase) участвовал в разработке Web-сайтов для таких компаний, как Lucent Technologies, Sun Microsystems, Oracle и Tampa Bay Buccaneers. Ник успел побывать школьным учителем физики, редактором электронного научно-фантастического журнала, инженером в области мультимедиа, инструктором по Oracle и главным инженером в интерактивной коммуникационной компании. Он является автором нескольких книг, в том числе XML Primer Plus (Sams).




Выскажите мнение об этой странице


Пожалуйста, найдите минутку и заполните форму, чтобы повысить уровень сервиса.



ДаНетНе знаю
 


 


12345
 


В начало


IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия.

    IBM в России Конфиденциальность Контакты