最近、私の身近な開発者で、Web未経験の人がいたのだが、Web開発を学習していて、こんな愚痴をもらしていた。
今までWeb開発は、少ししか携わったことがなかったが、あらためて勉強をしてみると、覚えなければならないことが多くて大変だ。
HTML、JavaScript、CSSを分かった上で、各言語ごとのWebの仕組みを学ばなければならない。
もっともだと思う。
例えば、ASP.NETならば、VB.NET(C#でもよいが)とASP.NETを覚えなければならない。
Javaはもっと多い。Java言語、Servlet, JSP、Strutsだ。JSPのカスタムタグや、Strutsのカスタムタグだのも覚えなければならない。単なる条件分岐(if)だけでも、JavaScriptのif、Javaのif、JSTLの<c:if/>を使い分けなければならない。なんてこった。
さらに、ここで挙げているのは比較的、枯れた技術だ。
いまどきの技術なども考えると、HibernateなどのO/Rマッピングツールや、DI、EJB、Webサービスなども使われるだろう。昔から、技術者として学習して来た人ならともかく、新入社員がこれだけのことを学習するのは非常に大変だ。
そこで、もっと勉強をしなくてもすむWeb開発の手法がないものかを考えてみた。
ASP.NETやJSFなどといった、Webアプリを隠蔽する技術はどうかと思う。
HTMLやJavaScriptを覚えなくても、「VisualStudioでプロパティ設定すればできる」という思想は分かる。
しかし、結局、実行時には低レベルな技術に置き換えられているわけで、なにか修正をしたい場合に、HTMLやJavaScript,CSSの知識が必要になってくると思う。
HTMLやJavaScriptを全く知らない人が、「ASP.NETを使ってどんなWebアプリでも作ることができます。」というのはとても考えられないからだ。
これは、技術の進歩によって解決するだろうが、まだまだ先のことのように思える。
私はWicketというフレームワークに期待している。
これはASP.NETやJSFとは違い、純粋なHTMLと、Java言語で開発できるので、覚えるべき技術カテゴリとしては、HTML, Java, Wicketの3つになる。
低レベルな技術をできる限り隠蔽せずに、便利さを追求しているという感じがある。学習量も少なく、すぐに使い始められると感じた。
私自身も、「Struts開発パターン」での経験を生かして、フレームワークを考えてみた。
巷にたくさんある「俺フレームワーク」をこれ以上増やしても、無駄だというのは百も承知だ。
なので、フレームワークの勉強ということで、プロトタイプの作成にとどめる。
俺フレームワーク(覚えることの少ないフレームワークの考察)
- JSPではスクリプトレットを使いカスタムタグは使わない
- カスタムタグのif文を覚えなくても、スクリプトレットのif文でよいではないか。
for文を知っているのに、ちょっと使い方の違う<c:foreach>まで覚えるのはやめる。
スクリプトレットならJava言語なので何でもできる。ただ書き方が長ったらしいので、省略するための関数を用意する - Beanではなくpublicフィールドを持ったクラスを使用
- StrutsのActionFormはBeanなので、setterとgetterを実装しなければならない。
IDEを使ったり、自動生成すれば手間は少ないが、必ずsetterとgetterを持たせるくらいならpublicフィールドでいいのでは?(もはやJavaBeanではない) - 1画面-1Bean-1Action
- 作成タスクをルール化することで、モデリングできない人でも手が動くようにする。
1画面のすべての動的データをBeanで持つ。
画面から送信される情報は、StrutsのMappingDispatchActionのようにアクションの各メソッドに振り分ける。
Foo.jspと、FooBeanと、FooActionの3つをセットで作成する。
JSPはこんな感じ
(Test.jsp)
~
~
スクリプトレットで、Beanの各フィールドの値を取得し、画面に描画しています。
JSP内の関数esc()でHTMLエスケープができるようになっています。
送信先は、Test_calc.acttionとなっていますが、これは{画面名}_{呼び出しメソッド}.action
という形で動作するような仕様とする。
Beanは、もはやJavaBeanではないのだが、publicフィールドのみです。
(TestBean.java)
~
public class TestBean {
public int val1;
public int val2;
public int ans;
}
~
コントローラはStrutsでいうところのActionServlet的なものを作成した。
アクションの実行は、URLからクラス名とメソッド名を決定する。
具体的には、”/Test_calc.acttion”というURLでリクエストされると、TestActionのcalcメソッドが動作するようにActionServletを作成する。
実行されるActionは次のように作成する。
(TestAction.java)
public class TestAction{
public void calc(Server server, TestBean bean){
bean.ans = bean.val1 + bean.val2;
}
}
リフレクションをバリバリ使うので、メソッドの引数はTestBeanで定義する。(Strutsのように抽象的なActionFormで定義しないのでキャスト不要)
この辺まで作成したところでやめた。
セキュリティ的な面や、リクエストをBeanにつめるところをきちんと実装すれば、そこそこ使えるとは思う。
Strutsと比べた場合、次の点で楽です。
- struts-configで設定ファイルを記述する必要がない
→URLで実行するクラス、メソッドを決める - Beanの作成にsetter/getterが要らない
→フィールドの定義のみ - カスタムタグは覚える必要が無く、JSPの知識(スクリプトレット)のみで記述できる。
→xss対策などの関数を用意。