Dolteng で生成するような Seasar2 による Webアプリケーションに限らず、いわゆる Java による MVC 思想を採用した SAStruts や昔の Struts でも当てはまると思いますが、私なりの楽な方法をご紹介。
もちろん、動けばいいわけですので飽くまでご参考程度に。
jQuery + Ajax の一般的(?)な処理
色々なサイトを参考にしていますが、いわゆるどのサイトでも紹介されている方法をそのまま実践している人がけっこういらっしゃるような気がします。
飽くまで例ですが、例えば以下のような感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$.ajax({ type: "POST", dataType: "json", url: "/contextPath/application", success: function(json) { // ここに返されたjsonに対する処理する記述 var html = "<table>"; for(i=0; i<json.length; i++) { html +="<tr>" + "<td>" + json[i].id + "</td>" + "<td>" + json[i].name + "</td>" + "</tr>"; $("#data").html(html); } }, }); |
Web クライアントから Ajax 通信で、返される構造化テキストを "JSON" として受け取り、それをうまいこと整形して HTML コードを生成。
たまに聞くのが、「JavaScript で HTML を生成するのが大変!」という声。
ただでさえ、スラスラと書けない HTML を、JavaScriptで生成するように書くのは割りと大変ですね。
私もこの方法だと、よく頭がゴチャゴチャになります。
MVC の性質を思い出す
でもよく考えてみると、MVC の View 部分をクライアントサイド(JavaScript)でゴリゴリ書くと、JSP のせっかくの得意技をかき消すことになってしまわないでしょうか?
そもそも JSP の役割が HTML コードを生成するというものなので、JSPにやらせませんか?というのがこの記事からの提案です。
飽くまで例ですが、私がやっている方法は以下のようになります。
Ajaxオススメのやりかた (Seasar2, SAStruts)
サーブレット
1 2 3 4 5 6 7 8 |
/** 表に表示するデータのリスト */ public List<TableData> tableDatas; @Execute(validator=false) public String application() { tableDatas = jdbcManager.from(TableData.class).getResultList(); return "table-row.jsp"; } |
サーバサイドは、JSONを返さず、通常の方法でJSPへと処理を移します。
いわゆる普通のサーブレット処理です。
JSP
1 2 3 4 5 6 |
<table> <c:forEach items="${tableDatas}" var="tableData"> <tr><td>${tableData.id}</td> <td>${tableData.name}</td></tr> </c:forEach> </table> |
JSPでは、生成したい table を生成するスクリプトレットを記述。昔から Java で Web アプリケーションを作って来た人なら、この書き方は手馴れたものですよね。
クライアントサイド(jQuery)
1 2 3 4 5 6 7 8 9 |
$.ajax({ type: "POST", dataType: "text", url: "/contextPath/application", success: function(html) { // ここに返された text (html) に対する処理する記述 $("#data").html(html); }, }); |
JSPでHTMLが生成されて返ってくるようにしたので、JavaScript で複雑で煩わしい HTML 生成を記述する必要がありません。
上記の例だと、飽くまで例なので、まだ許容範囲ですが、複雑な HTML を生成する際にはバグの温床になる可能性があります。
JSP の最大の特技である HTML 生成と jQuery, Ajax を併用した楽な方法でした。