古いJ2EE技術でかんたんなWebアプリ開発を考える

最近、私の身近な開発者で、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)
~
<jsp:useBean id="bean" type="bean.TestBean" scope="request"/>
<form action="Test_calc.action" method="post">
	<input type="text" name="val1" value="<%= esc(bean.val1) %>" />+
	<input type="text" name="val2" value="<%= esc(bean.val2) %>" />=
	<%= esc(bean.ans) %>

	<input type="submit" value="計算">
</form>
~

スクリプトレットで、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対策などの関数を用意。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)