これ以上無い超シンプルなオレオレフレームワーク

かっとなってつい思いつきで作ってみた。


PHPの言語がアレでもアレだけ支持されているってのもやっぱり複雑な仕組みはいらないのではないかと。そこで考えられるもっともシンプルな仕組みのWebフレームワークを考えてみた。

まず、画面の流れはJSPベース。通常フロントコントローラですべての処理を受け持って各種JSPフォワードするという仕組みをもっとシンプルに出来ないかということから考えたのがこれ。Struts等で何事もなければsuccessで決まったJSPを渡すことは多いと思う。ならば逆転の発想でまずJSPありきで考えてみた。いわゆるアクションはフィルタで処理。

文字で説明しても分かりにくいので画像を用意してみた。

アクションを作っていなければそのまま表示される。アクションをどうマッピングするかいろいろと方法はあると思うが、今回はJSPと同じ階層構造で配置してみる。その呼ばれるJSPと同じディレクトリにクラス存在していたらそれが呼ばれる。

例えば/hoge/foo.jspならばroot.hoge.Fooクラスが呼ばれる。root部分を自由に変更可能に。具体的に言えばフィルタのパラメータに設定しておいた。


つまり、ロジック等がからまないJSPやHTMLで画面の流れをさくっと作った後、そのJSPをそのまま使いつつ、ロジックを埋め込んでいくことが出来る。URLはJSPやHTMLのアドレスのままだからだ。そのまま素直に配置したJSPを扱うということはDreamweaverでまったく問題なく扱えるということをあらわす。DreamWeaverJSPも扱えるためだ。

なお、ポイントはカスタムタグでHTMLを生成しないようにすること。あくまでも条件やループなどの制御のみに徹する。


そしてアクション側だが、ここは思い切って戻り値としてvoidを選択。なにもしなければJSPがそのままビューとして渡されることを意識した。入力ミス等で前の画面に戻したい場合はどうするか。つまり、入力異常がほとんどなのだから、ここは素直に例外を発行する。通常動作があくまでも「success」というわけだ。
/index.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>計算するぜ!</title>
    </head>
    <body>
        超シンプルなShinMVC(仮)♪<br>
        <form action="calc/calc.jsp">
            <input type="text" name="param1">+<input type="text" name="param2">
            <input type="submit" value="=">
        </form>
    </body>
</html>

/calc/calc.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>結果</title>
    </head>
    <body>
        結果だよ!<br>
        ${param.param1} + ${param.param2} = ${result}
    </body>
</html>
package shinmvc.action.calc;

import省略

public class Calc implements Action{

    public void execute(HttpServletRequest request, HttpServletResponse response) throws Exception{
        try{
            Integer p1 = Integer.parseInt(request.getParameter("param1"));
            Integer p2 = Integer.parseInt(request.getParameter("param2"));
            request.setAttribute("result", p1 + p2);
        }catch(Exception ex){
            //フォワードしたい場合
            throw new ForwardException("/index.jsp");
            //リダイレクトしたい場合
//            throw new RedirectException("/index.jsp");
        }
    }

}

ではHTMLやJSP以外の表示はどうするか。PDFのダウンロードとかそういうやつ。これは素直にServletで表示してあげればよい。Servletもフィルターが同様に効く為だ。ロジックはあくまでもアクション側で処理、Servletをビューとして独立を意識させたほうが良いだろう。




この10年でロジック部分の生産性はオブジェクト指向とかDIコンテナとかO/Rマッピングとか無料のRDBの大量出現とかさまざまな理由によって大幅に向上したと思う。でも画面周りは生産性が上がるどころかWeb化によってむしろ下がっていると思う。このへんでちょっとてこ入れが必要なんじゃないかなと思ったり。そしてこの部分を解決したフレームワークNetBeansで標準搭載のVisualWebのようなポトペタくらいしかないように感じる。そしてこのポトペタはデザイナが用意したもとと相性が悪いというオチもあり、なかなか手放しで喜べないのが現状だ。

今回のフレームワークと呼ぶのもおこがましいShinMVC(仮)はデザインと画面遷移まではなんとJavaIDEをまったく必要としないというのがポイント。基本的にDreamWeaver1本だけでよい。アクションもその原理からモックを用意することが容易なのでダミーデータの表示までデザイナ主導で動かすことが出来る。こちらプログラマ側はロジックだけに集中したい。

こんなシンプルなのは誰もが考え付く超変態クソアーキだ!と罵ってくださってくれれば本望。30分くらいで思いついて60分くらいで実装しただけなのであんまり深く突っ込まないでね。

誰でも知っている超基本的なServlet/JSPの基礎の機能しか使っていないため、習得が容易でDIコンテナだろうがなんだろうが自由にかぶせたり拡張することがいくらでも可能。軽く実装して使ってみたが思ったよりよかった。デフォルト動作がいわゆる「success」を強要するというのはかなり分かりやすい。結果URLとJSPとアクションの一体感もかなりのものだと思う。


まぁ想像以上にシンプルで面白かったので今後いろいろと深くやってみようかな。もっとシンプルな方法があるよ!という意見求む。