- PR -

Struts の html:checkbox をデフォルトで有効にしたい

1
投稿者投稿内容
espomax
会議室デビュー日: 2003/06/03
投稿数: 7
投稿日時: 2003-06-03 13:20
Jakarta Struts を利用して web のフォームを作成しています。
Struts タグライブラリの html:checkbox を使った場合に、チェックボックス
にデフォルトでチェックを入れる方法を調べているのですが、
ちょっと煮詰まっています。

要は、展開される HTML の input タグに checked 属性が振られれば
良いのですが、

http://jakarta.apache.org/struts/userGuide/struts-html.html#checkbox

を見ても html:checkbox にそれらしき属性は見当たりません。

FAQ なのかなと思って検索をかけてみましたが、なかなか解答には
至りません。

ポインタでも構いませんので、何か情報がありましたらご教示ください。
latte
常連さん
会議室デビュー日: 2002/11/07
投稿数: 38
投稿日時: 2003-06-03 13:46
こんにちは。
対応するFormBeanのプロパティに、
checkedとなる値をセットして
おくのではだめでしょうか。
espomax
会議室デビュー日: 2003/06/03
投稿数: 7
投稿日時: 2003-06-03 14:52
latte さん

返信ありがとうございます。

現在は start.jsp -> action.do -> end.jsp という流れになっています。
この start.jsp で checkbod にチェックを入れておきたいのですが、
FormBean に値をセットしておいてそれを実現するとなると、

init.do -> start.jsp -> action.do ->end.jsp

として、init.do で FormBean に値をセット、と考えたのですが
この解釈で間違いないでしょうか?
latte
常連さん
会議室デビュー日: 2002/11/07
投稿数: 38
投稿日時: 2003-06-03 15:23
ActionFormにはresetメソッドがありますので、
その中でデフォルト値を設定するといいのではと思います。

ActionServletがActionFormにアクセスする時、
一番最初に呼ばれるメソッドだったと思います。(確か。。)
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2003-06-04 13:00
<html:checkbox>タグにvalue属性を設定した場合は、その値をActionFormの変数宣言部分で設定してあげると、チェックが付いた状態のHTMLになるようです。例えばespomaxさんの場合は
start.jspで

<html:checkbox property="state" value="set_staste"/>

と書いて、ActionFormのメンバ変数(呼び方はこれでいいんだっけかな?)に

private String state = "set_state";

としてあげると、チェックが付いた状態のHTMLになりますよ。value属性を設定しない場合は、"on"がデフォルトで使われます。面倒くさがりなんで私はvalueを設定してません。(あまり人様には勧められないですが)
Strutsのカスタムタグって、「この場合はこれとこれ」みたいない属性の組み合わせがあるので、カスタムタグの解説を見てもよく分からないことがありますねー。日々新化している物だから仕方がないんでしょうが。
久々の書き込みに緊張緊張。



[ メッセージ編集済み 編集者: 小僧 編集日時 2003-06-04 13:01 ]
のぶ
会議室デビュー日: 2003/01/09
投稿数: 11
お住まい・勤務地: とちぎ
投稿日時: 2003-06-04 13:55
ちょっとStrutsをかじったことのある「のぶ」です。

小僧さんの回答のように
> と書いて、ActionFormのメンバ変数(呼び方はこれでいいんだっけかな?)に
> private String state = "set_state
はよいと思うのですが、
> start.jspで
> <html:checkbox property="state" value="set_staste"/>
をやってしまうと、ActioFormのvalidateでエラーが発生しstart.jspに戻したときに
もエラーが発生したときの内容でなく常にvalueで設定した内容になってしまいます。

あと、latteさんの回答のresetメソッドで行うと確かに書かれているとおりActionServlet
のかなり初期に呼ばれますが、start.jspが動くときはタグLIBだけの機能で動いて
おりActionServletが動くわけでないのでresetは実行されず初期値の設定には使えません。

なので、初期値の設定は小僧さんの言うとおりインスタンス変数の初期化「private String state = "set_state」で行うか、コンストラクタで行うかしか思いつきません。


[ メッセージ編集済み 編集者: のぶ 編集日時 2003-06-04 14:01 ]
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2003-06-04 17:15
ああ、ちょっと説明不足でしたかね。JSPを最初に呼ぶ方法だと、確かにのぶさんの言うように例外メッセージがブラウザにドドーーっと吐き出されますね。今回の件に限らず、何らかの初期化処理を行ってから処理を行いたい場合が多々ありまして、私も先月悩みました。んで、私なりはこんな方法で解決しました。
struts-cconfig.xmlで同じアクションサーブレットに対して異なるパスを定義してあげます。こんあ風に

<action path="/add.init"
type="AddInitAction"
name="addActionForm"
scope="request"
validate="false">
<forward name="success" path="/jsp/add.jsp"/>
</action>
<action path="/add"
type="AddAction"
name="addActionForm"
scope="request"
validate="true"
input="/jsp/add.jsp">
<forward name="success" path="/jsp/addComplete.jsp"/>
<forward name="failed" path="/jsp/addError.jsp"/>
</action>

初期化専用のアクションサーブレット作り、関連付けしてあげます。この初期化専用アクションサーブレットは、何もしないダミーを使うとか、トランザクショントークンを設定するだけの物を一つ作るだけで済む場合が多いようです。アクションサーブレットの作り方次第では、同じアクションサーブレットで済む場合もありますが。こうするとadd.initに対するバリデーションはされないので、JSPに

<html:form action="/do/add">

と書いてあげると、フォーム入力して送信してから初めてバリデーションを行わせる動作をさせられます。あとは先ほど私が説明したように変数を初期化すればできますよ。このダミー用アクションサーブレットを思いつくまでが長くかかっちゃってねー。espomaxさんの場合でも使えないかな?。

/doを頭に書いているのは、単に.doをお尻に付けるのは嫌なのでweb.xmlをいじっているためなんで、適当に読み替えてください。


あとresetメソッドは、アクセスする度に毎回コールされるので、毎回初期化を行いたい場合に使うといいですよ。












[ メッセージ編集済み 編集者: 小僧 編集日時 2003-06-04 17:17 ]
espomax
会議室デビュー日: 2003/06/03
投稿数: 7
投稿日時: 2003-06-06 15:49
みなさん返信ありがとうございます。

みなさんの返信からヒントを得まして、とりあえず

initAction.do -> start.jsp -> startAction.do -> end.jsp

という形にしてやってみました。initAction.do と start.jsp、startAction.do
にはすべて同じ Action Form Bean を関連付けました。initAction.do で、
Form Bean を取得して、setter で checkbox に対応するプロパティに true
をセットさせ、アプリケーションの起動の URL を initAction.do にすることで
一応事なきを得ています。

特に開始が .jsp でなければならないということはないため、この方法で
とりあえず落ち着いてます。

みなさんがご教示くださったほかのやり方とも比較して、どちらが better か
考えてみようと思います。
1

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