Strutsメモ

このページはJakarta Strutsの紹介、およびメモです。

もくじ



Strutsって?

Struts(ストラッツ)はWebアプリケーションを開発するためのフレームワークです。

Strutsは英語(?)で、支柱という意味で、家や橋を支える土台となるものです。 基本となる部分を裏方で支え、アプリケーションの開発者が 簡単にアプリケーションを開発できるようにします。

フレームワークって?

フレームワークというのは、枠組みです。 開発効率やプロダクトの品質を上げるために使われます。

旅行に例えるなら、パック旅行のようなものです。 行き帰りの飛行機や、宿泊先、誰もがおとづれるような、 メジャー観光地への訪問は先に用意されています。 パック旅行を利用する人は、 旅券やホテルの手配などの手間を省き、 単純に旅行を楽しむという目的に専念できます。 はじめての海外旅行でも、 失敗せずに、旅行を楽しむことができます。 もちろん、パック旅行を選択することで、 自分ができることの自由は幾分減ってしまいますが。 あと、どのパック旅行の選択も重要です。 自然を楽しみたいのに、大都会へ行っても仕方ないですしね。

ソフトウェアの世界でのフレームワークもそんな感じです。 Webアプリケーション開発時に、押さえておかなければいけない、 セキュリティーや保守性の問題をフレームワークをもとに作成することで、 解決できます。 パック旅行と違うのは、申し込めばOKというものではなく、 フレームワークの使い方を習得するまでが、けっこう大変というところです。

MVC モデル2

MVCモデルは、現在Webアプリケーションを作成する上で、もっとも一般的な考え方です。 ブラウザからのリクエスト〜レスポンスまでを、 Model、View、Controllと役割を分けることで、 作業分担を可能にし、保守性を向上させます。
モデル2というのは、MVCモデルを発展させたもので、 リクエストを受けるController(通常サーブレット)を1箇所に まとめることで、共通ロジックを集中させます。 現存するフレームワークはたいてい、このモデル2を採用しています(たぶん)。

と思ったんだけど、単にMVCをWebに適用したのが2かも。
dW : Java technology : Struts、オープン・ソースMVC実装

シンプルStruts

というわけで、ストラッツです。 Strutsは、機能がシンプルで習得しやすいと言われていますが、 意外と難しい気がします。 それはきっと、基本的なActionFormやActionの他に、 カスタムタグやらリソースやらが絡んできて、 単純にハローワールドするだけでも、 あれこれ準備が必要、というのが手間なんでしょう。

今回は、最低限実行に必要な部分に絞って、実装してみました。 アプリケーションは昔Perlで作った、わーどばとらーを、 Javaにして、Struts上で作ってみました。

一応アーカイブは wb-0.1.zipです。 warのディレクトリ構造になっていますが、 重くなるので、libの中身は省きました。 動作のためにはstruts-blankなどからjarをコピーする必要があります。 Strutsのバージョンは1.1-b1を使いました。 現状、新機能は使っていませんが、Validationとかはやってみたいので。

struts-bean.tldやstruts-logic.tldさえ使っていません。 struts-htmlのみ使っています。密接にstrutsに関わっていないタグライブラリは 今後、JSTLで実装を追加していきたいと思います。

以下、作成中につまずいたところについて、簡単に書きます。

Applicationリソースファイル

これは、なくても動くかと思ったんですが、 struts.configで指定しないと起動時エラーになるし、 入力エラーを返すActionErrorの引数で必要なようなので、 しぶしぶ使いました。

リソースファイル(ex.ApplicationResources.properties) を作って、クラスパス以下に置きます。 ソースパスにおいといて、コンパイル時にクラスパスにコピーするようにするとよいでしょう。 でもって、struts.configの下の方の記述を自分が置いた場所に書き換えます。
  <message-resources parameter="wb.ApplicationResources"/>
私は、エラーメッセージだけ書きました。
error.name.required=name is required.<br>
error.word.required=word is required.<br>
error.word.duplicated=word is allready used.<br>
ちゃんと作る場合は、表示するメッセージを全部ここに書いとくと、 あとでローカライズする(他言語に置き換える)ときに便利です。

エラーメッセージを表示するには、 表示する場所に以下のような記述をします。
  <html:errors/>

errosについての補足
<html:errors/>を使う場合には、 リソースファイルからヘッダ(errors.footer)とフッダ(errors.header) が読み込まれるので、この値もリソースファイルに定義しましょう( でないと、null nullが表示されます)。
エラー一覧でなく、個々のエラーを場所を指定して、出力したい場合は、 property属性を使います。 <html:errors property="username"/>
このあたりのことはDeveloper GuidesのHTML Tagsに書いてます。

ActionFormとAction

これはstrutsの基本的な仕組みなので、作らないわけにはいかないでしょう。 詳細は、参考のページを見ると詳しいです。

入力の日本語化

JSPのフォームなどから入力した日本語を、正しくエンコーディングするには、 アプリケーション側で手を加える必要があります。 これは最低限の機能ではないですが、 今回作ったアプリケーション(わーどばとらー)では必須機能なので、 一応やってみました。 それほど手間でもないし。

一番簡単なのはfilterの機能を使い、filter中で、 ServletRequest#setCharcterEncodingすることです。 javax.servlet.Filterインターフェイスを実装したクラスを作り、 doFilterはこんな感じにします。
  public void doFilter(ServletRequest req, ServletResponse res,
    FilterChain chain)
    throws IOException, ServletException {

    req.setCharacterEncoding(enc);
    chain.doFilter(req, res);
  }
でもって、web.xmlにfilterを登録します。
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>wb.EncodingFilter</filter-class>
      <init-param>
        <param-name>encoding</param-name>
        <param-value>Shift_JIS</param-value>
      </init-param>
  </filter>

  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <servlet-name>action</servlet-name>
  </filter-mapping>
ちなみに、struts-sampleやstruts-blankをコピーして、 作ってた場合、web.xmlのDDがサーブレットがAPI2.2用になってるので、 これは2.3用に変更する必要があります。 このへんはstruts云々でなく、web.xmlの設定の問題ですが。
  <!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
filter機能の詳細については、 dW JavaTechnology Tomcatにおけるフィルタリング機能の活用 を見るといいかも。

API2.2で作らないといけないような場合は、 ActionServletを継承したサーブレットをつくり、 HttpServletRequestのラッパーを作るのが、 一番簡単かなという気がします。たぶん。

次のページへ

調査予定

参考

書籍 WEB

(2002/8/11)
もどる