はじめに
インターネット上で共有したい情報は、なにも平のテキスト情報ばかりではありません。Microsoft Officeで作成したオフィスドキュメントや画像、PDF(Portable Document Format)などリッチなコンテンツをWeb上に公開/共有したいというケースも多くあります。
そのような場合に、これまでであればどのようにしていたでしょうか。
特定のフォルダにドキュメントを格納した上で、それぞれのドキュメントにリンクを張ったインデックスページを作成していたかもしれません。あるいは、手軽にWebサーバがデフォルトで生成するインデックスページをそのまま利用しているという方もいるかもしれません。しかし、前者はドキュメントをアップするたびにHTMLを自前で修正しなければならないので手間ですし、後者は見栄えという意味で難点があります。
そこで本稿では、ドキュメントを特定のフォルダにアップロードするだけで、自動的にインデックスページを生成してくれるフォルダシステムを紹介します。出力レイアウトはテンプレートで指定できますので、サイトのデザインに応じて簡単に見栄えをカスタマイズできるのが特長です。
必要な環境
本稿で紹介するフォルダシステムは、JSP2.0&サーブレット2.4環境で動作するカスタムタグです。利用するにあたっては、以下のソフトウェアが最低限必要となります。これらソフトウェアのインストール方法については、著者サイト「サーバサイド技術の学び舎」より「サーバサイド環境構築設定」を参照してください。
- J2SE 5.0_02
- JSP&サーブレットコンテナ(Tomcat 5.5.7で確認済)
サンプルコードは「.war」形式で提供しています。記事上部のリンクからダウンロードできる「CZ_FolderPublish.war」を「%CATALINA_HOME%/webapps」フォルダ配下に配置し、コンテナを再起動することで自動的に展開されます。
また、サンプルフォルダ「/CZ_FolderPublish」の直下には、カスタムタグを実際に試すための「sample.jsp」が含まれていますので、以下のURLから起動し、コードが正常に動作していることを確認してください。
http://localhost:8080/CZ_FolderPublish/sample.jsp
ファイル構造
先述したように、本稿で紹介するフォルダシステムはJSP2.0&サーブレット2.4環境で動作するカスタムタグです。まずは、ダウンロードファイル内のファイル構造を示しておきます(赤字のファイルは、他のアプリケーションで利用する場合に必要なファイルであることを表します)。
<FolderPublish>要素の利用方法
カスタムタグ<RssReader>
要素で利用可能な属性は、以下の通りです。
属性 | フラグメント | 概要 |
path | × | 読み込みたいフォルダのパス(アプリケーションルートを基点とした絶対パス) |
header | ○ | ヘッダテンプレート |
body | ○ | 本体テンプレート |
footer | ○ | フッタテンプレート |
また、それぞれの本体テンプレートでは、以下のページ属性を利用可能です。ページ属性は、${属性名}
の形式で参照可能です。
属性名 | 概要 |
name | ファイル名 |
path | ファイルパス |
length | ファイルサイズ(バイト単位) |
lastModifiled | ファイルの最終更新日(java.util.Date クラス) |
以上に基づいて、具体的なJSPページの記述例を見てみることにしましょう。
<%@ page contentType="text/html;charset=Windows-31J" %> <%@ taglib prefix="cz" uri="http://www.wings.msn.to/CodeZineTagLibs-1.0" %> <cz:FolderPublish path="/data"> <jsp:attribute name="header"> <table bordercolor="#000000" cellspacing="1" bordercolordark="#ffffff" cellpadding="1" bordercolorlight="#000000" border="1"> <tr> <th>ファイル名</th><th>サイズ</th><th>最終更新日</th> </tr> </jsp:attribute> <jsp:attribute name="body"> <tr> <td><a href="${path}">${name}</a></td> <td>${length}Byte</td> <td>${lastModified}</td> </tr> </jsp:attribute> <jsp:attribute name="footer"> </table> </jsp:attribute> </cz:FolderPublish>
ポイントとなるのは、以下の2点です。
@taglib
ディレクティヴでタグライブラリを登録する- フラグメントは
<jsp:attribute>
要素で記述する
カスタムタグの利用方法については、関連記事の「外部のRSSフィードを自サイトで公開する」でも紹介していますので、詳しくはこちらを参照してください。
タグハンドラクラスFolderPublishTagの利用方法
<FolderPublish>
要素の使い方を理解したところで、<FolderPublish>
要素の挙動を定義するタグハンドラクラスFolderPublishTag
の中身を覗いてみることにしましょう。
タグハンドラクラスの基本的な骨格については、関連記事の「外部のRSSフィードを自サイトで公開する」でも紹介していますので、詳しくはこちらを参照してください。また、タグハンドラクラスを利用する場合には、デプロイメントディスクリプタ(web.xml)、タグライブラリディスクリプタ(myTag.tld)に適切な設定を施しておく必要があります。本稿では割愛しますが、詳細はダウンロードファイルに含まれる該当のファイルを参照してください。
public void doTag() throws JspException, IOException { PageContext pageContext=(PageContext)this.getJspContext(); ServletContext application=pageContext.getServletContext(); HttpServletRequest request =(HttpServletRequest)pageContext.getRequest(); File folder=new File(application.getRealPath(this.path)); File[] files=folder.listFiles(); header.invoke(null); for(int i=0;i<files.length;i++){ if(!files[i].isDirectory()){ pageContext.setAttribute("name",files[i].getName()); pageContext.setAttribute("path", request.getContextPath() + this.path + "/" + files[i].getName()); pageContext.setAttribute("length",new Long(files[i].length())); pageContext.setAttribute("lastModified", new Date(files[i].lastModified())); body.invoke(null); } } footer.invoke(null); }
File#listFiles
メソッドは、現在のFile
オブジェクトの配下に配置されるサブフォルダ、ファイルをFile
オブジェクト配列として返します。本サンプルではサブフォルダには対応しないものとしますので、オブジェクト配列files
から取り出したファイル要素がフォルダでない(isDirectory
メソッドがfalse
の)場合にのみ、出力処理を行います。ここでは、ファイル名、パス、ファイルサイズ、最終更新日をそれぞれページ属性としてセットした上で、本体テンプレート(body
フラグメント)を実行しているというわけです。
もちろん、本体テンプレートですべてのページ属性を引用する必要はありません。
まとめ
以上、JSP&サーブレットアプリケーションで利用可能な<FolderReader>
要素を紹介してみました。本稿ではまず基本的なファイルシステムの読み込みについて紹介しましたが、「日本語ファイル名への対応(本稿では未対応)」「サブフォルダへの対応」など、改善すべきところは、各自対応してみてください。