EL式を拡張したSAStrutsタグ/ファンクションは超便利:Java初心者が超俊敏にWebアプリを作る方法(4)(2/2 ページ)
Eclipseプラグイン「Dolteng」のScaffoldという自動生成機能やSeasar 2.4のHOT deploy機能を利用して、DBの参照・更新・削除ができるSAStrutsのWebアプリを作ります。Java初心者だけでなくStrutsに慣れた開発者も必見です
f:h()
${f:h(param:info)}
HTMLエスケープ(クロスサイトスクリプティング対策で「<」を「<」などに変換すること)が必要なケースは、f:h()を使ってください。f:h()は、配列もリストと同じように表示できます。
f:u()
${f:u(param:info)}
URLエンコーディング(クロスサイトスクリプティング対策で「javascript:alert('hoge')」のような入力を「javascript%3Aalert%28%27hoge%27%29」のようにJavaScriptが実行されないように変換すること)が必要なケースは、f:u()を使ってください。
f:br()
${f:br(f:h(textarea))}
テキストエリアで入力した値を表示するときに、改行を<br />タグに変換したい場合は、f:br()を使います。
f:nbsp()
${f:br(f:nbsp(f:h(textarea)))}
半角スペースをそのまま表示したい場合は、f:nbsp()を使います。
f:date()
<fmt:formatDate value="${f:date(date, 'yyyyMMdd')}" pattern="yyyy/MM/dd"/>
日付をフォーマットして表示するには、fmt:formatDateを使いますが、value要素に設定する値はDate型である必要があります。
Strutsの場合、入力値は、文字列で定義するのが一般的なので、文字列で定義されている入力値は、fmt:formatDateでフォーマットできません。このような場合は、f:date()を使って文字列をDate型に変換します。2番目の引数は、SimpleDateFormatの形式で指定します。
f:number()
<fmt:formatNumber value="${f:number(number, '####'}" pattern="#,###"/>
数値をフォーマットして表示するには、value要素に設定する値はNumber型である必要があります。
Strutsの場合、入力値は文字列で定義するのが一般的なので、文字列で定義されている入力値はfmt:formatNumberでフォーマットできません。このような場合は、f:number()を使って文字列をNumber型に変換します。2番目の引数は、DecimalFormatの形式で指定します。
f:url()
<a href="${f:url(param:info)}"
<a>タグのhref要素などを設定するときに、使用します。カスタムタグの<s:form>や<s:link>タグと同じように計算したパスを出力します。
f:label()
${f:label(e.deptId, deptItems,"id","name")}
任意のオブジェクトの値を読みやすい文字列で表示するには、f:label(value, dataList, valueName, labelName)を使います。
valueは、任意のオブジェクトの値です。dataListはJavaBeansかMap<String, Object>のリストで、どのオブジェクトの値をどの文字列に変換するのかを指定します。valueNameはvalue用のプロパティ名(Mapの場合は、キー名)、labelNameはlabel用のプロパティ名(Mapの場合はキー名)です。
例えば、部署のidプロパティの値をnameプロパティの値で表示したい場合、次のように指定します。deptItemsには、部署のデータを全件入れておきます。
セキュリティ上の注意!
「${プロパティ名}」と書くことでHTMLに値を書き出すことができますが、タグのボディではこのような記述はしないようにしてください。
値がそのまま出力されてしまうため、クロスサイトスクリプティングの問題が起こる危険があります。HTMLに文字列表示をする際には必ず${f:h(プロパティ名)}としてください。「${プロパティ名}」とするのは、要素を設定するときのみに使用します。
JSPへのダイレクト(methodがGETによる)アクセスは、デフォルトで禁止されています。意図しないJSPにアクセスされることを防いだり、最初はアクションで何もすることがなくても、後から必要になった場合にURLが変わらないようにするためです。JSPはアクションを経由して表示した方がいいでしょう。
また、セキュリティ的なチェックを入れたいときも、アクションを経由する方が何かと便利です。どうしても、JSPへ直接アクセスする必要が出てきた場合は、web.xmlのroutingfilterのinit-paramでjspDirectAccessの値を「true」にします。
カスタムタグやファンクションを使うための設定と実行
JSPでは、SAStrutsの<s>タグや<f>タグ、Strutsの<html>タグや<bean>タグを使用する設定がありません。いままですべてのJSPファイルのヘッダの部分に利用するタグ定義を書いているプロジェクトもまだ多くあると思いますが、SAStrutsを利用する際にはできるだけそのようなことは避けてください。それは、以下のように設定できるためです。
これらの定義は、「webapp/WEB-INF/view/common/common.jsp」に共通で使う宣言が定義されています。ここに記述すれば、すべてのJSPに利用する宣言が読み込まれます。このcommon.jspを読み込む記述は、web.xmlに定義してあります。
<web-app> ……【略】…… <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <el-ignored>false</el-ignored> <page-encoding>UTF-8</page-encoding> <scripting-invalid>false</scripting-invalid> <include-prelude>/common/common.jsp</include-prelude> </jsp-property-group> </jsp-config> </web-app>
これで、いままでのJSPのコピー&ペーストされていたヘッダ部分もすっきりします。
SAStruts Pluginの便利機能その【3】+α
すべてが出来上がったら、サーバを起動して表示したいアクションを選択し、[Ctrl]キーを押してください。Webブラウザが立ち上がり、そのActionを動作させるためのURLでアクセスされます。
これがSAStruts Pluginの3つ目の機能です。自分でいちいちURLを作成しなくても簡単にWebブラウザを立ち上げ表示できます。
おまけの機能として、[F10]+[Ctrl]キーでヘルプとしてSAStrutsのページを簡単に表示できる機能もあります。
テンプレートエンジンに置き換えることもできる!
これで、SAStrutsのWebの流れが完成しました。SAStrutsでは、JSPの部分はStrutsの資産を生かした形のままとなっています。そのうえ、さらにスマートに設定するためにSAStrutsのカスタムタグやファンクションがいくつか用意されています。
JSPは記述する方法も変わらず、JSPならではの自由さを失っていません。ただ、JSPのあまりの汎用性の高さからJSPを使いたくないと考える開発者がいるかもしれません。しかし、SAStrutsではViewとControlはしっかり分けられているため、JSPが必須というわけではありません。「Apache Velocity」や同じSeasarのプロダクトである「Mayaa」などの、ほかのテンプレートエンジンに置き換えることもできます。
また今回、JSPはSAStrutsの仕様ではないので、すべての処理に関して解説できませんでした。より具体的なJSPの利用方法などを参考にしたいのであれば、ぜひSAStrutsの公式ページにあるチュートリアルのプロジェクトをダウンロードして動作させてみてください。
次回は、連載の最後にServiceクラスとそこで使われているS2JDBCについて簡単に触れたいと思います。
筆者紹介
所属:
株式会社パワーエッジ
AD事業部(Application Development事業部)
新田 智啓(しんでん ともひろ)
SAStrutsコミッタ
Seasarプロダクトのsandboxで新たにS2Csvのプロダクトを公開。業務で汎用的に使えるように更新中。
Copyright © ITmedia, Inc. All Rights Reserved.