Strutsの入力制御込みのタグ
Strutsの入力制御に関するメモ。
別にStrutsのってことではないのですが、Strutsを使った画面の入力要素の制御でいろいろ考えてみてるとこれが一番落ち着きそうってことで。
基本的にな考え方は、入力不可要素には、disabledを使って入力不可とする。
ただ、disabledは、POSTされなくなる為、disabledになった要素については、hidden要素を作成して、そちらでPOSTするようにするという方法です。
readonlyも考えたのですが、なんかいろいろ気になる部分があって、こちらほうがいい気してます。
ほんとはこれをTaglibとして作成してそれを使うほうがいいでしょうね。
では、ソース
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="/tags/struts-html" prefix="html" %> <%@taglib uri="/tags/struts-tiles" prefix="tiles" %> <%@taglib uri="/tags/struts-bean" prefix="bean" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html:html> <head> <title>入力要素、TAGLIBテスト</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <html:form enctype="multipart/form-data"> <p>■入力制御</p> 入力不可の場合のhiddenを追加で出力する方法<br/> <% boolean enabled = false; // enabledに有効無効の値をセットする。 %> 1.TEXTBOX<br /> <html:text name="helloworld" property="helloWorldText" disabled='<%=!enabled %>'></html:text><br/> <% if(!enabled) { %> <html:hidden name="helloworld" property="helloWorldText"></html:hidden> <% } %> <br/> 2.TEXTAREA<br /> <html:textarea name="helloworld" property="helloWorldTextarea" disabled='<%=!enabled %>'></html:textarea><br/> <% if(!enabled) { %> <html:hidden name="helloworld" property="helloWorldTextarea"></html:hidden> <% } %> <br/> 3.CHECKBOX<br /> <html:checkbox name="helloworld" property="helloWorldCheckbox1" value="1" disabled='<%=!enabled %>'></html:checkbox><br /> <% if(!enabled) { %> <html:hidden name="helloworld" property="helloWorldCheckbox1"></html:hidden> <% } %> <html:hidden name="helloworld" property="helloWorldCheckbox1" value="0"></html:hidden> <br/> 4.RADIO<br /> <html:select name="helloworld" property="helloWorldSelect" disabled='<%=!enabled %>'> <html:option value="00">値1</html:option> <html:option value="01">値2</html:option> </html:select><br/> <% if(!enabled) { %> <html:hidden name="helloworld" property="helloWorldSelect"></html:hidden> <% } %> <br/> 5.FILE<br /> ファイルは選択できないんだから、この項目からのPOSTを意識する必要がない為、hiddenもなし<br /> <html:file name="helloworld" tabindex="-1" property="helloWorldFile" disabled='<%=!enabled %>'></html:file><br/>
<br /> <html:submit>送信</html:submit> </html:form> </body> </html:html>
アプリによっては若干のアレンジが必要ですが基本的にはこれがいいのかなと思います。
以下はちょっと他とは違う入力項目の説明
1.チェックボックスは、入力可能な状態でも未選択だった場合、パラメータが送られないので、未選択を表すhiddenタグを用意しています。また、入力不可の状態になった場合は未選択状態のタグよりも上に選択状態を表すhiddenを用意しています。
2.ファイルの場合は、選択できない状態であるということは、そもそも送られないので、hiddenも用意していません。実アプリでは、ファイルパスなどをhiddenで保持しておいて、無効になっている場合(つまり、FileFormが送られてこない場合)は、そちらを使うようにAction側で記述するようにしたほうがいいでしょう。
ただ、この方式の場合、変更不可な要素なのですがPOSTされてしまうということになるので、DB更新などが発生する場合は、考慮が必要かもしれません。
昨日、半日以上、会社で悩んだのに、土曜日の朝2時間ぐらいで「はっ!」と解決した・・・どれだけ会社で集中できてないんだ(笑)