- PR -

JSPスクリプトレット内でのスコープ変数の使用について

1
投稿者投稿内容
naito
常連さん
会議室デビュー日: 2007/08/07
投稿数: 36
投稿日時: 2007-11-29 17:15
こんばんは。

既存のJSPファイルをカスタマイズしながら、勉強しているのですが、スコープ変数とそのJSPファイル内でのスクリプトレットとの関係について教えていただきたく思っています。

コードを以下に示します。

ーーーーJSPファイル一部抜粋ーーーーー

<jsp:useBean id="cp" class="java.lang.String" />
<c:set var="cp" value="${requestScope['article'].exp_date}" />

<%//以下、スクリプトレット
文字列から年月日を分割して取得する
String year = cp.substring(0, 3);
String month = cp.substring(5, 6);
String date = cp.substring(8, 9);
%>

この部分において、java.lang.StringIndexOutOfBoundsException
例外メッセージ
String index out of range: 3
が表示されてしまいます。

スクリプトレットに入る前に${cp}で確認してみたところ、値はうまく表示されていました。

何かスクリプトレットに入るところで問題があるのでしょうか?


よろしくおねがいいたします。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-11-29 17:41
スクリプトレット内でcpをSystem.out.printlnしてみるとなんと表示されますか?
naito
常連さん
会議室デビュー日: 2007/08/07
投稿数: 36
投稿日時: 2007-11-29 17:44
nagise様、御返答ありがとうございます。


試してみましたところ、どうやらcpには何も格納されていないようです。
例外メッセージの意味はわかったのですが、スクリプトレット内では代入されたsetタグの式は無効なのでしょうか??
GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2007-11-29 18:02
IndexOutOfBoundsExceptionは実際配列数よりインデックスのほうが大きい場合に発生します。

ところで、${cp}で表示される文字列はどのような形式でしょうか?
たとえば、1月1日の場合、文字列が「2007/1/1」となっていれば、文字数が少なくなるため該当の例外が出る可能性があります。
naito
常連さん
会議室デビュー日: 2007/08/07
投稿数: 36
投稿日時: 2007-11-29 18:08
GENZO様ありがとうございます。

はい、格納される値は”????年??月??日”という文字列です。

スクリプトレットに入る前にはしっかりcpの値は確認いたしました。
インデックスの方が大きくなるのは間違いないです。

やはりsetで代入した時の値が実際にスクリプトレットで表示されないことから、この前後が原因なのではないかと思うのですが。
GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2007-11-29 18:17
スクリプトレットとJSTLで見てるものが違うことに今気がつきました。

String year = cp.substring(0, 3);
じゃなくて
((String)pageContext.getAttribute("cp")).substring(0, 3);
ですね。

・・・でもcpはなぜコンパイルエラーにならないんだろう。
naito
常連さん
会議室デビュー日: 2007/08/07
投稿数: 36
投稿日時: 2007-11-29 18:25
GENZO様、御早い返答ありがとうございます。

うまく動作いたしました。ありがとうございました。
調べてみましたところ、基本的なことができていなかったようです。

ありがとうございました。

cpはそのファイル内では使用していないのですが、エラーがでなかったのはよくわかりません。
1

スキルアップ/キャリアアップ(JOB@IT)