SHOEISHA iD

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

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

特集記事

特定フォルダ内に保存されたドキュメントをWebページで公開する

フォルダ内容の自動インデックス化


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

本稿では、ドキュメントを特定のフォルダにアップロードするだけで、自動的にインデックスページを生成してくれるフォルダシステムを紹介します。

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

はじめに

 インターネット上で共有したい情報は、なにも平のテキスト情報ばかりではありません。Microsoft Officeで作成したオフィスドキュメントや画像、PDF(Portable Document Format)などリッチなコンテンツをWeb上に公開/共有したいというケースも多くあります。

 そのような場合に、これまでであればどのようにしていたでしょうか。

 特定のフォルダにドキュメントを格納した上で、それぞれのドキュメントにリンクを張ったインデックスページを作成していたかもしれません。あるいは、手軽にWebサーバがデフォルトで生成するインデックスページをそのまま利用しているという方もいるかもしれません。しかし、前者はドキュメントをアップするたびにHTMLを自前で修正しなければならないので手間ですし、後者は見栄えという意味で難点があります。

 そこで本稿では、ドキュメントを特定のフォルダにアップロードするだけで、自動的にインデックスページを生成してくれるフォルダシステムを紹介します。出力レイアウトはテンプレートで指定できますので、サイトのデザインに応じて簡単に見栄えをカスタマイズできるのが特長です。

「sample.jsp」で「/data」フォルダの内容を整形
「sample.jsp」で「/data」フォルダの内容を整形

必要な環境

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

 サンプルコードは「.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>要素で利用可能な属性は、以下の通りです。

<FolderPublish>要素で利用可能な属性
属性フラグメント概要
path×読み込みたいフォルダのパス(アプリケーションルートを基点とした絶対パス)
headerヘッダテンプレート
body本体テンプレート
footerフッタテンプレート

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

<FolderPublish>要素の本体テンプレートで利用可能なページ属性
属性名概要
nameファイル名
pathファイルパス
lengthファイルサイズ(バイト単位)
lastModifiledファイルの最終更新日(java.util.Dateクラス)

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

「sample.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点です。

  1. @taglibディレクティヴでタグライブラリを登録する
  2. フラグメントは<jsp:attribute>要素で記述する

 カスタムタグの利用方法については、関連記事の「外部のRSSフィードを自サイトで公開する」でも紹介していますので、詳しくはこちらを参照してください。

タグハンドラクラスFolderPublishTagの利用方法

 <FolderPublish>要素の使い方を理解したところで、<FolderPublish>要素の挙動を定義するタグハンドラクラスFolderPublishTagの中身を覗いてみることにしましょう。

 タグハンドラクラスの基本的な骨格については、関連記事の「外部のRSSフィードを自サイトで公開する」でも紹介していますので、詳しくはこちらを参照してください。また、タグハンドラクラスを利用する場合には、デプロイメントディスクリプタ(web.xml)、タグライブラリディスクリプタ(myTag.tld)に適切な設定を施しておく必要があります。本稿では割愛しますが、詳細はダウンロードファイルに含まれる該当のファイルを参照してください。

「FolderPublishTag.java」 (抜粋)
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>要素を紹介してみました。本稿ではまず基本的なファイルシステムの読み込みについて紹介しましたが、「日本語ファイル名への対応(本稿では未対応)」「サブフォルダへの対応」など、改善すべきところは、各自対応してみてください。

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

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

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、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編 」他、著書多数

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング