easyaction web application framework
更新履歴
- 2007.1.24
- easyaction 0.9.1 をリリースしました。Linux環境に対応しました。エラーメッセージ削除メソッドresetErrorMessageを追加しました。
- 2006.12.29
- easyactionの最初のバージョン(0.9.0)をリリースしました。フィードバックがいただけるとうれしいです。
easyaction web application frameworkとは?
easyactionは,簡単,やさしいを目標にしたWebアプリケーションフレームワークです。Webアプリケーションをガンガン作るためのフレームワークとなることを目指しています。
strutsと同じようにMVCモデル2アーキテクチャを採用しています。基本的にstrutsと似たような構造ですが,リクエストプロセッサ,アクションフォームBean,アクションフォワードなどはありません。また,struts-config.xmlのような設定ファイルもありません。
とにかくシンプルです。もちろん,サニタイズ,文字エンコーディング,フロー制御機能,ログ機能,エラー制御機能は備えています。
基本構成は以下のとおりです。赤枠がeasyactionになります。
WebブラウザからのリクエストをActionServletが受け付け,そのリクエストに対応するActionクラスを生成し実行します。
このとき他のJavaクラスやJavaBeansなどを利用したりもします。次にJSPを呼び出します。JSPでは,表示に必要な情報をリクエストスコープやセッションスコープのJavaBeansなどから取り出し,JSPに埋め込んでWebブラウザ側へ返します。
詳細なクラス図は以下のとおりです。
個人的にWebアプリケーションフレームワークはstrutsで決まりと考えていました。しかし,独自のしくみを学ぶこと,バージョンアップごとの変更についていくこと,将来が不安なこと,ページを追加するごとにstruts-config.xmlを書かなければならないことに嫌気がさして,このフレームワークを作成しました。
私自身,このフレームワークを利用してWebアプリケーションをガンガン作っています。正確に言うと,
私が利用していたしくみをフレームワークとして取り出したものがeasyactionということになります。
ただし,小規模アプリケーション向けといえるでしょう。
特徴は,
- struts-config.xmlのような設定ファイルがいりません。とにかくシンプルです。
- jstlやcommons loggingなどできるだけデファクトスタンダードなものを利用しています。
独自のしくみををわざわざ勉強する必要はありません。
といったところです。
struts-config.xmlのような設定ファイルが不要なのは,リクエストされたアドレスから対応するActonクラスの呼び出しを簡単な規則で実現しているからです。具体的には,「先頭文字を大文字に変換し,.doを削除し,Actionを接続する」という規則です。例えば,login.doがリクエストされたとき,LoginActionが対応するActionクラスになります。そして,そのActionクラスをクラスパスから自動的に探し出し呼び出しています。よって設定ファイル不要で,ただLoginActionを実装すればよいということになります。
easyactionはオープンソースソフトウェアです。自由に利用してください。
ダウンロード
ファイル一覧
- readme.txt 注意書きです。最初に読んでください。
- doc/ easyactionのjavadocを格納しているディレクトリです。この中のindex.htmlを実行してください。
- src/ easyactionのjavaソースが格納されているディレクトリです。
- webapp/ easyactionの雛形とサンプルを格納しているディレクトリです。
- easyaction-blank.war 雛形です。これを利用します。
- easyaction-helloworld.war サンプルです。
チュートリアル
◆環境構築
ここでは,次の環境で実行していきます。
- OS
- Windows XP
- JDK
- 1.5.0.06
- Tomcat
- 5.5.16
- easyaction
- 0.9.1
- Eclipse
- 3.2
- WTP
- 1.5
JDKやTomcatのインストールは他のサイトを
参考にしてください。ちなみにこのサイトは素晴らしいです。
EclipseやWTPのインストールも
他のサイトを参考にしてください。ここは少し古いですが・・・
そして,easyactionをダウンロードし,解凍してください。
◆easyaction-blank.warをWebコンテナ(Tomcat)にデプロイして実行
(1)easyactionのwarファイルをTomcatのwebappsフォルダにコピーします。
解凍してできたeasyaction-0.9.1のフォルダの中のwebappsフォルダの中に入っているeasyaction-blank.warファイルをTomcatのフォルダ\webappsにコピーします。
(2)Tomcatを起動します。
Tomcatを起動します。しばらくすると上でコピーしたファイルが解凍されます。
(3)ブラウザで動作を確認してみます。
ブラウザを起動して次のURLを指定します。http://localhost:8080/easyaction-blank/
◆easyaction-helloworld.warをWebコンテナ(Tomcat)にデプロイして実行
(1)easyactionのwarファイルをTomcatのwebappsフォルダにコピーします。
解凍してできたeasyaction-0.9.1のフォルダの中のwebappsフォルダの中に入っているeasyaction-helloworld.warファイルをTomcatのフォルダ\webappsにコピーします。
(2)Tomcatを起動します。
Tomcatを起動します。しばらくすると上でコピーしたファイルが解凍されます。
(3)ブラウザで動作を確認してみます。
ブラウザを起動して次のURLを指定します。http://localhost:8080/easyaction-helloworld/
サンプルを開始します。をクリックすると
名前入力欄に山口秀昭と入力し送信ボタンをクリックすると
(4)easyaction-helloworldのソースコードは次のとおりです。struts-config.xmlのような設定ファイルはありません。
input.jspで<form method=”post” action=”hello.do“>とhello.doを呼び出しているので,easyactionの規則(先頭文字を大文字に変換し,.doを削除し,Actionを接続する)によりHelloActionクラスのインスタンスが生成されて実行されます。
web.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- ★のところは必要に応じて変更してください。その他は,基本的に変更や削除はしないでください。 動作しなくなる場合があります。もちろん,追加は自由です。 当たり前のことですが,このweb.xmlを変更したら,このコンテキストを再ロードする必要があります ので注意してください。変更が反映されません。再ロードの方法がわからない場合はwebコンテナを 再起動してください。 --> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- ★あなたのプロジェクト名などに変更してください。 --> <display-name>easyaction-helloworld</display-name> <!-- ========== フィルタの設定 =================== --> <filter> <filter-name>CharacterEncoding</filter-name> <filter-class> easyaction.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <!-- ★クライアントの文字コードを選択してください。 --> <param-value>Windows-31J</param-value> <!-- <param-value>EUC-JP</param-value> <param-value>UTF-8</param-value> <param-value>JISAutoDetect</param-value> --> </init-param> </filter> <!-- フィルタの追加はここから下 --> <!-- ========== フィルタマッピングの設定 =================== --> <filter-mapping> <filter-name>CharacterEncoding</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <!-- <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> --> </filter-mapping> <!-- フィルタマッピングの追加はここから下 --> <!-- ========== サーブレットの設定 =================== --> <!-- 起動時に一度だけ実行される初期化サーブレット --> <servlet> <servlet-name>EasyActionInit</servlet-name> <servlet-class> easyaction.EasyActionInit </servlet-class> <init-param> <param-name>log4jInitFile</param-name> <param-value>WEB-INF/conf/log4j.xml</param-value> </init-param> <init-param> <param-name>logLocation</param-name> <!-- ★ログの記録場所(ディレクトリ)を指定してください。 --> <param-value>WEB-INF/log</param-value> </init-param> <load-on-startup>1</load-on-startup> <!-- 起動時に実行されます --> </servlet> <!-- リクエスト受付窓口サーブレット --> <servlet> <servlet-name>ActionServlet</servlet-name> <servlet-class> easyaction.ActionServlet </servlet-class> <!-- ★必要に応じて初期化パラメータを記述してください。 --> <!-- 初期化パラメータを利用する場合は,ActionServletInitインタフェースをimplementsしたクラスを 書かなければなりません。そして,下記のコメントをはずし,そのクラス名を完全修飾名で設定してください。 下記はクラス名がactionweblog.init.AppInitの場合の例です。 --> <!-- <init-param> <param-name>actionServletInitClassName</param-name> <param-value>actionweblog.init.AppInit</param-value> </init-param> --> <!-- 初期化パラメータの追加はここから下 --> </servlet> <!-- ========== サーブレットマッピングの設定 =================== --> <servlet-mapping> <servlet-name>ActionServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- ========== ウェルカムページの設定 =================== --> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Style-Type" content="text/css"> <title>easyaction-helloworld</title> </head> <body> <h1>easyaction-helloworldサンプル</h1> <p>テキストボックスへ入力された文字が次のページでそのまま表示されます。</p> <a href="input.jsp">サンプルを開始します。</a> </body> </html>
input.jsp
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <%@ page language="java" pageEncoding="SHIFT_JIS" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Style-Type" content="text/css"> <title>名前の入力</title> </head> <body> <h1>easyaction-helloworldサンプル</h1> <jsp:include page="errormessage.jsp" flush="true" /> <p>テキストボックスにあなたの名前を入力し,送信ボタンを押してください。 次のページで,あいさつ文が表示されます。何も入力せずに送信ボタンを押すとエラーメッセージが表示されます。</p> <p>日本語も正しく表示され,サニタイズもされています。</p> <form method="post" action="hello.do"> 名前を入力してください:<input type="text" name="yourName" value="${requestScope.yourName}"><br /> <input type="submit" name="go" value="送信"> </form> </body> </html>
HelloAction.java
package helloworld.action; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import easyaction.Action; public class HelloAction extends Action { public String execute(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String nextPage = "/hello.jsp"; ///(1)入力 String yourName = getParameter(request, "yourName"); if(yourName == null || yourName.equals("")){ setErrorMessage("名前を入力してください。"); } ///(2)処理 if(existErrorMessage()){ request.setAttribute("errorMessage", getErrorMessage()); nextPage = "/input.jsp"; return nextPage; } request.setAttribute("yourName", yourName); ///(3)出力 return nextPage; } }
hello.jsp
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <%@ page language="java" pageEncoding="SHIFT_JIS" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Style-Type" content="text/css"> <title>あいさつ</title> </head> <body> <h1>easyaction-helloworldサンプル</h1> <h2>ようこそ,${requestScope.yourName}さん</h2> <p>${requestScope.yourName}さん,easyactionのシンプルさをご堪能ください。</p> <p><a href="input.jsp">もう一度実行します。</a></p> </body> </html>
errormessage.jsp
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <%@ page language="java" pageEncoding="SHIFT_JIS" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:if test="${requestScope.errorMessage != null && requestScope.errorMessage != ''}"> <p><strong style="color:red;">エラー発生</strong></p> <p><strong style="color:red;">${requestScope.errorMessage}</strong></p> </c:if>
◆Eclipseで,easyaction-blank.warを雛形にして開発
(1)easyaction-blank.warをEclipseにインポートします。
(2)WARファイル欄にeasyaction-blank.warを指定し,Webプロジェクト欄にプロジェクト名(ここではmyWebApp)を入力します。そして,次へボタンを押します。
(3)何も選択せずに,終了ボタンを押します。
(4)インポートされました。次に,web.xmlをダブルクリックします。
(5)display-nameエレメントを自分のプロジェクト名(ここではmyWebApp)に書き直します。
(6)ここまでで実行してみましょう。
(7)後は,jspとActionクラスを追加していってください。
◆easyactionのjavadoc
easyactionのAPIのjavadocです。ダウンロードした
easyactionのdocディレクトリにも含まれています。
FAQ
- Q:strutsなどの素晴らしいWebアプリケーションフレームワークがたくさんあるのに,なぜeasyactionが必要なのですか?
- strutsは素晴らしいですが,小規模Webアプリケーションをパパッと作るには面倒な手順が多く開発効率が落ちると考えます。strutsは中規模以上の開発で威力を発揮するものだと考えています。小規模Webアプリケーション用には簡単で,シンプルなフレームワークが必要なのです。実際,私はeasyactionを利用して,小規模Webアプリケーションをパパッと作っています。
- Q:ではなぜ,敷居の低いPHPではダメなのですか?
- PHPでいいんです。ただ私は,もともとC/C++が好きな人間ですので,型宣言のない言語にはなじめなかったのです。実はPHP3,PHP4の頃は使っていましたが,規模が大きくなってくると,型宣言がないことによるバグに悩まされ始めPHPの利用は止めました。PHP5以降のことは知りません。すみません。
- Q:JSPはどういう方針で書けばよいですか?
- 基本的に自由です。ただ私は,HTMLとJSTLタグとEL(式言語)だけを使用するようにしています。スクリプトレット(Javaコード)は,どうしても必要というとき以外は使用しないようにしています。保守性が悪くなるからです。実は私はstrutsを利用しているときもstrutsタグは使用せずHTMLとJSTLタグとEL(式言語)だけを使用していました。将来使わなくなるかもしれない技術の勉強には時間をかけたくないからです。
- Q: