SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

外部のRSSフィードを自サイトで公開する

Webサイトから利用可能なRSSリーダ


  • X ポスト
  • このエントリーをはてなブックマークに追加

Webサイト上で利用可能なRSSリーダを紹介します。出力レイアウトはテンプレートで指定できますので、サイトのデザインに応じて簡単に見栄えをカスタマイズできるのが特長です。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 RSS(RDF Site Summary)とは、その名の通り、サイトのサマリ情報を配信するためのデータ記述フォーマットです。皆さんも、さまざまなサイトで「RSS」と書かれたというアイコンを見かけることがあるでしょう。これは、そのサイトでRSS情報を配信しているということを表すものです。昨今はやりのブログでは、標準でRSSに対応しているものも多くなってきましたから、知らず知らずのうちにRSSを利用していたという方も多いかもしれません。

 RSSを利用することで、エンドユーザは自分が興味を持ったサイトをいちいち巡回する必要はありません。「RSSリーダ」と呼ばれる専用のクライアントアプリケーションにRSSの配信元を登録しておくだけで良いのです。すると、RSSリーダがあらかじめ設定した間隔でそれぞれのサイトからRSS文書(「RSSフィード」とも言います)を取得してくれますので、ユーザはその収集結果をひとところで確認できます。

 また、RSSによって恩恵を受けるのはこうしたエンドユーザばかりではありません。自分で独自のサイトを立ち上げている方ならば、自サイトに関係するサイトが提供するRSSフィードをインポートしても良いでしょう。たとえば、自サイトでIT関係の話題を扱っているならば、@ITや(手前味噌ですが)著者サイト「サーバサイド技術の学び舎 - WINGS」が提供するRSSフィードを取り込んでおけば、常に最新の公開記事を自サイトで紹介することができます。

 本稿では、このようにWebサイト上で利用可能なRSSリーダを紹介します。出力レイアウトはテンプレートで指定できますので、サイトのデザインに応じて簡単に見栄えをカスタマイズできるのが特長です。

必要な環境

 本稿で紹介するフォルダシステムは、JSP2.0&サーブレット2.4環境で動作するカスタムタグです。利用するにあたっては、以下のソフトウェアが最低限必要となります。これらソフトウェアのインストール方法については、著者サイト「サーバサイド技術の学び舎」より「サーバサイド環境構築設定」を参照してください。

 サンプルコードは「.war」形式で提供しています。記事上部のリンクからダウンロードできる「CZ_RssReader.war」を「%CATALINA_HOME%/webapps」フォルダ配下に配置し、コンテナを再起動することで自動的に展開されます。

 また、サンプルフォルダ「/CZ_RssReader」の直下には、カスタムタグを実際に試すための「sample.jsp」が含まれていますので、以下のURLから起動し、コードが正常に動作していることを確認してください。

http://localhost:8080/CZ_RssReader/sample.jsp
「sample.jsp」でRssReaderを動作したところ
「sample.jsp」でRssReaderを動作したところ

 Rss4Jについては、ダウンロードファイルに既に含まれていますので、サンプルをそのまま利用する場合には改めてインストールする必要はありません。

ファイル構造

 先述したように、本稿で紹介するRssReaderはJSP2.0&サーブレット2.4環境で動作するカスタムタグです。まずは、ダウンロードファイル内のファイル構造を示しておきます(赤字のファイルは、他のアプリケーションで利用する場合に必要なファイルであることを表します)。

ダウンロードファイル内のファイル構造
ダウンロードファイル内のファイル構造

<RssReader>要素の利用方法

 カスタムタグ<RssReader>要素で利用可能な属性は、以下の通りです。

<RssReader>要素で利用可能な属性
属性フラグメント概要
url×取得したいRSSフィードのURL
headerヘッダテンプレート
body本体テンプレート
footerフッタテンプレート

 また、それぞれのテンプレート(フラグメント)内では、以下のページ属性を利用可能です。ページ属性は、${属性名}の形式で参照可能です。

<RssReader>要素の各テンプレートで利用可能なページ属性
テンプレート属性名概要
ヘッダchannet_titleチャネルのタイトル
本体title記事タイトル
link記事のURL
description記事の説明文
フッタなし

 以上に基づいて、具体的なJSPページの記述例を見てみることにしましょう。

「sample.jsp」
<%@ page contentType="text/html;charset=Windows-31J" %>
<%@ taglib prefix="cz"
  uri="http://www.wings.msn.to/CodeZineTagLibs-1.0" %>
<cz:RssReader url="http://www.wings.msn.to/redirect.php/-/A-12/">
  <jsp:attribute name="header">
    <table bordercolor="#000000" cellspacing="1"
      bordercolordark="#ffffff" cellpadding="5"
      bordercolorlight="#000000" border="1">
    <tr>
    <td bgcolor="#FFffEE">
    <h2>${channel_title}</h2>
    <ol>
  </jsp:attribute>
  <jsp:attribute name="body">
    <li><a href="${link}" style="color:#220055">${title}</a></li>
  </jsp:attribute>
  <jsp:attribute name="footer">
    </td>
    </tr>
    </table>
  </jsp:attribute>
</cz:RssReader>

 ポイントとなるのは、以下の2点です。

  1. @taglibディレクティヴでタグライブラリを登録する
  2. カスタムタグを利用する場合には、あらかじめ@taglibディレクティヴでタグライブラリの登録を行う必要があります。この際、uri属性の値は固定ですが、prefix属性は自由に決めることができます。ただし、prefix属性はコード中の要素プレフィックス(<xx:~>の部分)と対応関係にある必要がありますので、注意してください。
  3. フラグメントは<jsp:attribute>要素で記述する
  4. <RssReader>要素では、フラグメントを利用して、ヘッダ、本体、フッタという3つのテンプレートをJSPページから指定できるようにしています。フラグメントにテンプレートを引き渡すには、<RssReader>要素の配下に<jsp:attribute>要素を記述します。<jsp:attribute>要素の一般的な構文は以下の通りです。
<jsp:attribute name="属性名">テンプレート本体</jsp:attribute>

タグハンドラクラスRssReaderTagの骨格

 <RssReader>要素の使い方を理解したところで、<RssReader>要素の挙動を定義するタグハンドラクラスRssReaderTagの中身を覗いてみることにしましょう。まずはタグハンドラクラスの基本的な骨格を理解します。

「RssReaderTag.java」 (抜粋)
public class RssReaderTag extends SimpleTagSupport {
  private String url;
  private JspFragment header;
  private JspFragment body;
  private JspFragment footer; 
  public void doTag() throws JspException, IOException {
    ...中略...
  }
  public void setUrl(String url){this.url=url;}
  public void setHeader(JspFragment header){this.header=header;}
  public void setBody(JspFragment body){this.body=body;}
  public void setFooter(JspFragment footer){this.footer=footer;}
}

 タグハンドラクラスで最低限必要なポイントは、以下の3点です。

  1. SimpleTagSupportクラスを継承する
  2. SimpleTagSupportクラスはカスタムタグの基本的な機能を提供するクラスです。タグハンドラクラスを定義するには、SimpleTagSupportクラスを継承し、これに対して必要なロジックを追加する必要があります。なお、定義するタグの種類によっては、SimpleTagSupportクラスの代わりに、TagSupportBodyTagSupportクラスを利用する場合もあります。
  3. タグの処理を規定するのはdoTagメソッドの役割
  4. SimpleTagSupport派生クラスにおいて、タグの挙動を規定するのはdoTagメソッドの役割です。doTagメソッドに、必要な一連の処理を記述します。
  5. 属性はアクセサメソッドとして定義する
  6. JSPページから設定可能な属性は、アクセサメソッドとして定義しておく必要があります。ここでは、urlheaderbodyfooterという4つの属性を公開したいので、それぞれ対応するsetUrlsetHeadersetBodysetFooterメソッドを定義しています。

 なお、タグハンドラクラスを利用する場合には、デプロイメントディスクリプタ(web.xml)、タグライブラリディスクリプタ(myTag.tld)に適切な設定を施しておく必要があります。本稿では割愛しますが、詳細はダウンロードファイルに含まれる該当のファイルを参照してください。

Rss4JによるRSSフィードの読み込み

 タグハンドラクラスの骨格が理解できたところで、次にdoTagメソッドの中身、url属性で指定されたRSSフィードを読み込み、指定されたテンプレートに基づいて出力するためのロジックを概観してみることにしましょう。以下は、doTagメソッドの中身です。

PageContext pageContext=(PageContext)this.getJspContext();
URL rss=new URL(this.url);
RssDocument doc=null;
try {
  doc = RssParser.parseRss(rss.openConnection().getInputStream());
} catch (RssParseException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}
Enumeration objEnm=doc.channels();
while(objEnm.hasMoreElements()){
  RssChannel channel=(RssChannel)objEnm.nextElement();
  pageContext.setAttribute("channel_title",
    channel.getChannelTitle());
  header.invoke(null);
  Enumeration items=channel.items();
  while(items.hasMoreElements()){
    RssChannelItem item=(RssChannelItem)items.nextElement();
    pageContext.setAttribute("title",item.getItemTitle());
    pageContext.setAttribute("link",item.getItemLink());
    pageContext.setAttribute("description",
      item.getItemDescription());
    body.invoke(null);
  }
  footer.invoke(null);
}

 Rss4Jの中核を担うのはRssParserクラスです。RssParser#parseRssメソッドに対して、RSSフィードを表す入力ストリームを引き渡すことでRSSフィードが解析され、解析済みのRSS情報がRssDocumentオブジェクトとして返されます。

 RssDocumentオブジェクトは、配下にチャネル情報や個々の記事情報を含むオブジェクトツリーとなっていますので、あとは対応するメソッドを辿っていくだけで必要な情報を直感的に取得できるのが特長です。

 取り出した情報は、PageContext#setAttributeメソッドでページ属性に登録した上で、JspFragment#involeメソッドで対応するテンプレート(フラグメント)を呼び出してください。ここでは、チャネル情報を取り出す都度にheaderテンプレートを、チャネル配下のアイテム情報を取り出す度にbodyテンプレートを、そして、アイテム情報を出力し終わった直後にfooterテンプレートを、それぞれ出力しています。

まとめ

 以上、JSP&サーブレットアプリケーションで利用可能な<RssReader>要素を紹介してみました。本稿ではまずはRSSフィードでよく利用する情報のみを出力可能にしていますが、もちろん、RSSフィードにはこの他にもさまざまな情報が含まれています。Rss4Jを使えばそれらの情報を簡単に取り出すことができるでしょう。

参考資料

  1. ChurchillObjects.com 『Rss4J』

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/44 2006/05/12 13:13

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング