まとめてみる。
■目的
Struts2では、Sタグの属性の中に、<%= %>や、EL式をかけない
(実際に書いてみると、500内部エラー
org.apache.jasper.JasperException:
TLD又はタグファイル中のattribute指示子に従って
属性valueはどんな式も受け付けません
をエラーとして返す)
そこで、Struts2の中のタグで、Actionの中にある属性や、セッションの
値を使いたい場合(一部加工もOK)に用いる・・・らしい
※なお、
・後述するように、Actionの中にある属性や、セッションの値そのものを、
表示することもできるが、その場合もsタグを用いる
・JSPの中で作成した変数を<%= %>みたいな形で使えるかどうか、
よくわかっていない。
ただし、後述するように、JSPの中で作った変数を、session.setAttribute
してしまえば、セッションの変数として、利用できる。
・OGNL式の中に、以下のサイト
http://www.techdoctranslator.com/struts2/tag-developers-guide/ognl
の「ラムダ表現式」に示されるように、フィボナッチ数列を生成
する式を書き、「どうだ、俺ってすごいだろう!」と自慢することはできるが、
たぶん、それは、目的ではないと思われる。
■EL式との違い
OGNL式が%{}で書くのに対し、EL式が${}で記述するので、とてもよく似ているが、
決定的に違うのは、
EL式は
S式内で書くと、エラーになる
OGNL式は
S式の外で%{abc}とかかくと、そのまま%{abc}と表示される。
EL式は、展開される
※なお、
OGNL式で、Actionの中にある属性や、セッションの値そのものを、表示したい場合は、
s:propertyを使う
<s:property value='abc'/>
■基本的な書き方
基本的に'%{ ここにいろいろかく }'で書く
ただし、value='属性値やセッションの値等'のように%{}でくくらず、直接書くことも
■書く場所
S式の中なら、好きなところに書いていいんでしょうかね?
<s:submit type="button" id='%{"id_" + #session.password}' value='%{#session.password}' />
<s:submit type="input" cssClass='%{"class_" + #session.password}' value="実行" />
|
って書くと、(パスワードには、"1234567"と入っている)
<button type="submit" id="id_1234567" value="1234567">
1234567
</button>
<input type="submit" id="exe_0" value="実行" class="class_1234567"/>
|
って展開されます。
■表示できるものと書き方
まず、actionクラスの属性の値が、そのままかけます
たとえば、いま、ExeActionというアクションの中に、abcという属性が有り、
(abcはExeAction内でセッター、ゲッターが記述されている)
これを利用したい場合は、
%{abc}
でOK。
次に、セッション、request,response,applicationなどなど・・・
頭に#をつけます。たとえば、セッションの中に、passwordというのが入っていたら、
%{#session.password}
でOK
■変数の処理加工
●変数そのものでなく、前後に何かつけたりして、処理加工できる。
ふつうに、足し算する。
'%{"id_" + #session.password}'
は、セッションに入っているpasswordが1234567なら、id_1234567
になる。
●もちろん、変数を2つ足すことも出来る。
セッションの中に、ユーザー名(user)とパスワード(password)が入っていたら、
%{#session.user + ":" + #session.password}
なども、書ける。
●論理式も書ける。s:ifタグのtestできじゅつする
パスワードが1234567かどうかのチェック
'%{#session.password == "1234567"}
文字列でも、==で比較してしまって大丈夫。
""か''かについては、
Struts2 s:ifタグの条件判定文(OGNL式)がうまくいかない場合
http://mofuken.blogspot.jp/2009/07/struts2-sifognl.html
を参考にしてね!
●さらに、この値は、stringなので、それに、メソッドを適用
することも出来たりする。
#session.password.length()
とか。そのサンプルは、このあとすぐ・・・じゃないかな、
ちょっと先(「変わったサンプル」参照)
●再帰させた関数を作って、それを実行するということも、
できなくはないけど、技巧的すぎるので、やめておく。
(「目的」のところ参照)
■変わったサンプル
パスワードの文字数文、****に置き換えるプログラム
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>処理メッセージ</title>
</head>
<%
// パスワード
session.setAttribute("password","1234567");
// パスワード上、考えられる最大文字数を入れる
session.setAttribute("dummyword","**************************************");
%>
<body>
<s:property value='%{#session.dummyword.substring(0,#session.password.length())}'/>
</body>
</html>
|
これが変換されると、こんなHTMLになる
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>処理メッセージ</title>
</head>
<body>
*******
</body>
</html>
|
次回は、ArrayListとかについて・・・