2003年
StrutsでJSPを作る場合にいくつかの流儀があります。
1. <form>タグはStrutsが提供する<html:form>を使う。
2. コンテンツ(テキスト)はJSPに直接書かず、リソースファイルに書く。
3. 出来る限りスクリプトレット(<% %>タグのこと)を使わず、
StrutsのTagLibを使う。
1番は、Strutsが提供するActionFormの機能を使うのに不可欠です。
<html:form>からsubmitされたフォーム値は自動的にActionFormに格納され、
さらには、エラー画面等から戻ってきた場合に、以前入力した内容を自動的に
復活させます。もちろん<html:form>を使わずに普通にHTMLの<form>を使うこと
も出来ます(メリット減りますが)
2番は、文章をリソースファイルに書くことによって、リソースファイルを切り替える
だけで、日本語のページと英語のページ、中国語のページ等を切り替えることが
出来ます。
3番はスクリプトレットを使うとMVCの役割分担が崩れます。つまりViewであるJSPに
ModelやControllerの役割を持たせてしまう可能性が生まれます。JSPには表示だけを
させるべきだという考えなのです。
それではソース行ってみよう!
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> (1)
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> (2)
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> (3)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<HTML>
<HEAD>
<link rel=stylesheet href="base.css" type="text/css">
<META http-equiv="Content-Language" content="ja">
<META http-equiv="Content-Type" content="text/html; charset=shift_jis">
<META http-equiv="pragma" content="no-cache">
<title>掲示板</title>
<body>
<h1><bean:message key="title.messageboad"/></h1>
<html:errors/>
<html:javascript formName="forumForm"/> (4)
(5)
<html:form action="/sendMessage" onsubmit="return validateForumForm(this);">
<table>
<tr>
<td class="title">
<bean:message key="label.name"/> (6)
</td>
<td class="content">
<html:text property="name" size="20" maxlength="20"/> (7)
</td>
</tr>
<tr>
<td class="title">
<bean:message key="label.message"/>
</td>
<td class="content">
<html:textarea property="message" rows="5" cols="40"/>
</td>
</tr>
</table>
<html:submit property="submit">送信</html:submit> (8)
</html:form>
<html:link page="/loadMessage.do">リロード</html:link> (9)
<logic:present name="messages" scope="request"> (10)
<logic:iterate id="messageObj" name="messages" scope="request"> (11)
<table>
<tr>
<td class="title">
<bean:message key="label.name"/>
</td>
<td class="content">
<bean:write name="messageObj" property="name" /> (12)
</td>
</tr>
<tr>
<td class="title">
<bean:message key="label.message"/>
</td>
<td class="content">
<bean:write name="messageObj" property="message" />
</td>
</tr>
</table>
<br>
</logic:iterate>
</logic:present>
</body>
</html>
(1)〜(3)でタグリブの場所とコード内で使用する名前を設定しています。
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
は、
「/WEB-INF/struts-html.tldにあるタグリブをこのソースコード内では
htmlという接頭辞を付けて使用します」
という意味です。
(4)はStruts1.1の新機能Validatorを使うためのコードです。
Validatorは設定ファイルを元にFormの入力チェックを行うものです。
Validatorは次回とりあげます。
(5)(7)(8)(9)でそれぞれHTMLの
<form>,<input type="text">,<input type="submit">,<a href>
の代わりに
<html:form>,<html:text>,<html:submit>,<html:link>
を使用してます。
(6)で上記2番の国際化対応です。リソースファイルの中のlabel.nameの
プロパティを出力します。
ファイルの中はこんなイメージです。
label.name=名前
でも実際は
label.name=\u540d\u524d
文字化けしてるのはUnicodeに変換しているからです。Strutsは
リソースファイルをUnicodeで読み込むからです。
Unicode変換はJDK付属の
コマンドで出来ます。
それとリソースファイル名をStrutsに知らせる為に、struts-config.xmlに
<message-resources parameter=[リソースファイル名]/>
と言う記述が必要です。
(10)はif文、(11)はfor文の代わりです。
(12)はBeanのプロパティを取り出して出力しています。
プロパティ値に'<', '>'等のクロスサイトスクリプティングが
行われてしまう可能性のある文字列が含まれる場合自動的に
エスケープしてくれます。'<'は'<'にという感じです。
次回はValidatorの入力チェック機能をとりあげます。
んじゃ
やまろう