[[FAQ]] *S2JSF [#j0955499] #contents **formのdisabled指定でsessionコンポーネントが破壊される [#e42a4eaa] >[[S2サポーター]] (2006-04-29 (土) 19:54:01)~ ~ ''Question''~ instance="session" としたコンポーネントのデータを~ form の input タグで disbaled指定して表示すると、~ 表示そのものは元々の値が表示されるのですが、~ その後、submit するとそのデータが壊されてしまいます。~ ~ 表示している元々の内容にかかわらず、セッターが null で~ 呼ばれてしまうのが原因ですが、これは仕様でしょうか?~ ~ また、仕様だとすると回避する方法はありませんでしょうか?~ ~ セッターが呼ばれないか、せめて表示している値で再度~ 呼ばれればいいのですが、~ null で呼ばれて壊されてしまうと~ 困ってしまいます。~ ~ − hoge.html −−−−−−−−−− <html xmlns:m="http://www.seasar.org/maya"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" /> <title>Hoge</title> </head> <body> <form> <input type="text" disabled="true" m:value="#{hogeDto.hoge}"/> <input type="submit" value="submit"/> </form> </body> </html> − hoge.java −−−−−−−−−− package examples.jsf.dto; public class HogeDto { private String hoge; public String getHoge() { return hoge; } public void setHoge(String hoge) { System.out.println(hoge); this.hoge = hoge; } } − hoge.dicon −−−−−−−−−− <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components> <component name="hogeDto" class="examples.jsf.dto.HogeDto" instance="se ssion"> <property name="hoge">"foo"</property> </component> </components> ~ ~ ''Answer''~ S2JSFを修正完了しました。~ S2JSF 1.0.10から反映されています。~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2005-November/000367.html~ http://ml.seasar.org/archives/seasar-user/2005-November/000428.html~ // **ファイルダウンロード後にIllegalStateExceptionエラー発生 [#n49c5150] >[[S2サポーター]] (2006-04-29 (土) 19:47:12)~ ~ ''Question''~ ダウンロードのプログラムを下記のように実装しファイルのダウンロードは問題なく行えましたが、~ その後の処理でIllegalStateExceptionエラーが発生して落ちてしまいます。~ ~ ・環境~ Java 1.5.0 Update5~ Tomcat 5.5.12~ ~ Seasar2 2.2.11~ S2JSF 1.0.28~ Myfaces 1.0.8~ ~ ~ ・ソース~ ~ static public void download(HttpServletResponse response, String[] line, String fileName) throws IOException{ response.setContentType("application/octet-stream;charset=Windows-31J"); response.setHeader("Content-Disposition","attachment;filename=\""+fileName+"\""); PrintWriter out = response.getWriter(); try{ // 各行の内容を繰り返し出力 for(int i = 0; i < line.length; i++){ out.print(line[i]); out.print(System.getProperty("line.separator")); } } finally { if(out != null){ out.close(); } } } ~ ~ ''Answer''~ ~ 下記2つの方法で対応可能~ ~ 【Answer1】~ プログラム中で~ response.getWriter();~ している個所を、~ response.getOutputStream();~ へ変更するとどうでしょうか?~ ~ OutputStreamWriter osw = new~ OutputStreamWriter(response.getOutputStream(), encoding);~ PrintWriter out = new PrintWriter(osw);~ ~ といった具合に。~ ~ 【Answer2】~ web.xmlのfilter-mappingを変える方法でもうまくできそうな気が~ します。~ ~ 現状はs2filterの後にextensionsFilterが適用されるようになって~ いますが、extensionsFilterの後にs2filterが適用されるよう順序~ を変更してみて頂けますか?~ ~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2005-November/000440.html~ http://ml.seasar.org/archives/seasar-user/2005-November/000464.html~ http://ml.seasar.org/archives/seasar-user/2005-November/000471.html~ // **S2JSF1.0.8とmyfaces 1.1.0以降を組み合わせて使うと日付がずれる [#wabc847e] >[[S2サポーター]] (2006-04-29 (土) 19:43:46)~ ~ ''Question''~ ~ S2JSF1.0.8とmyfaces 1.1.0以降を組み合わせて使うと日付がず れて表示されます。~ ~ 例えば~ s2jsf-exampleのmyfacesを1.1.0以降に入れ替えます。~ Employee Managementのcreateを押し、Hire Dateを ~ 2005/12/01で新たに登録します。~ その後、登録したものを検索するとHire Dateを ~ 2005/11/30と表示されます。~ データベースには2005/12/01で登録されています。~ ~ myfaces 1.0.9では問題ありませんでした。~ myfacesの問題なのでしょうか?~ ~ s2jsf-exampleのallconverter.diconに登録されてあるoutputDateTimeConverter~ を指定してみましたが同じ現象でした。~ ~ ちょっと改造し時間まで表示させてみると2005/12/01 00:00:00のはずが、~ 2005/11/30 15:00:00となっています。~ ~ 9時間ほど前の時間が表示されているようです。~ ~ ~ ''Answer''~ ~ ちょっとmyfacesのソースを見てみました。~ myfaces 1.1.1だと、javax.faces.convert.DateTimeConverterのTimeZoneがnull~ だとデフォルトのタイムゾーン(GMT)を返すようです。~ myfaces 1.0.9だと、nullかどうかは判定せずそのまま返しています。~ myfaces 1.0.9がどこでDateTimeConverterにタイムゾーンを設定しているかは追~ いきれていませんが・・・~ ~ diconのConverterに以下のようにデフォルトのタイムゾーンを設定してやれば、~ きちんと表示されるようになりました。~ ~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2005-November/000320.html~ http://ml.seasar.org/archives/seasar-user/2005-November/000323.html~ http://ml.seasar.org/archives/seasar-user/2005-November/000325.html~ // **S2JSF1.0.9でページを継承しないで初期化アクションを実行するとエラーになる [#z9b0cb01] >[[S2サポーター]] (2006-04-29 (土) 19:41:59)~ ~ ''Question''~ S2JSF1.0.9でページを継承しないで初期化アクションを実行するとエラーになります。~ ~ s2jsf-exampleではemployeeSearch.htmlのm:extendsを削除し、~ <html xmlns:m="http://www.seasar.org/maya" m:action="#{employeeSearchInitAction.initialize}"> として実行すると~ [ESSR0065]クラス(examples.jsf.action.impl.EmployeeSearchInitActionImpl$$EnhancedByS2AOP$$ce2c57)のプロパティ(initialize)が見つかりません というエラーが出力されます。~ ~ とりあえず初期化アクションが必要なものは、必ず何かのページを継承すれば回避できるようです。~ ~ ''Answer''~ ~ 問題に対応しました。~ 次バージョンから反映されます。~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2005-November/000348.html~ http://ml.seasar.org/archives/seasar-user/2005-November/000397.html~ // **message タグでのメッセージ表示時に改行したい。 [#bd913bb3] >[[S2サポーター]] (2006-04-29 (土) 19:41:10)~ ~ ''Question''~ リソースファイルにメッセージを定義した内容を、S2JSFの h:message タグで表示する際に、~ 改行(brタグ)をしたいのですが、URLエンコードされてしまうためにうまく改行できません。~ ~ message タグでのメッセージ表示時に、改行する方法があれば、ぜひご教授ください。~ ~ ''Answer''~ 対象ブラウザがIE5.5以上でしたら、次のようなCSSを指定してみてはいかがでしょうか?~ ~ table { max-width: 100%; table-layout: fixed; } pre{ word-wrap: break-word; } ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2005-November/000344.html~ http://ml.seasar.org/archives/seasar-user/2005-November/000366.html~ // **span m:valueで表示した内容が消える [#t6d846f0] >[[S2サポーター]] (2006-04-29 (土) 19:31:42)~ ~ ''Question''~ S2JSFにおいて、<span m:value>によって表示した内容が消える~ という問題が発生しています。~ ~ ■現象~ ~ select → edit → confirm のような画面の流れがあます。~ ~ ・select画面では、何かしらの項目をドロップダウンリストにより選択する~ ・edit画面では、select画面で選択された値を以下のように表示している~ ~ <span m:value="#{testDto.testValue}"/>~ <input type="hidden" m:value="#{testDto.testValue}"/>~ ~ ・edit画面の他の入力項目にvalidationエラーが存在する場合、~ confirm画面に遷移せずにedit画面を再度表示する~ ~ このような時に、<span m:value>で表示している内容が消えてしまいます。~ #hiddenで持っている値はHTMLのソースには出力されています。~ ~ <input type="text" m:value="#{testDto.testValue}"/>で表示した場合は、~ 内容は消えません。しかし、これでは編集できてしまいます。~ ~ また、<input type="text" m:value="#{testDto.testValue}" m:disabled="true"/>~ とすると内容は消えてしまいます。~ ~ 回避策などありましたら、教えてください。~ ~ ''Answer''~ ※下記はMLの投稿に記載されていたBlogの内容である。~ BlogのUML:http://d.hatena.ne.jp/higayasuo/20051027#1130408672~ ~ ~ JSFでhiddenで保持している項目を表示しているときに、バリデーションでエラーになってしまうと消えてしまうという問題が起きることがあります。~ ここでは、S2JSFをサンプルにして説明しますが、JSFでもあてはまります。~ あるデータの編集画面があり、その画面は、hogeというJavaBeansと関連付けられているとします。また、hogeにaaaというプロパティがあって、表示専用だとします。~ この画面のhtmlは次のように作りがちです。~ ~ <form> <input type="hidden" m:value="#{hoge.aaa}"/> <span m:value="#{hoge.aaa}"/> ... </form> ~ 残念ながら、上記のように作ると、項目のどこかでバリデーションエラーが起きると、hoge.aaaを表示している部分が消えてしまいます。~ なぜなら、hiddenで保持している項目をJavaBeans(hoge)に反映させる処理は、バリデーションがOKの場合にしか実行されないため、バリデーションエラーが起きたときは、hiddenで保持している値はJavaBeans(hoge)に反映されないためです。~ じゃどうすれば良いのかというと、表示用のspanは、hiddenで保持されているリクエストのパラメータを直接参照するようにするのです。~ ~ <form id="hogeForm"> <input type="hidden" id="aaaHidden" m:value="#{hoge.aaa}"/> <span m:value="#{param['hogeForm:aaaHidden']}"/> ... </form> ~ これで、確かに、バリデーションエラーになったときに、hiddenの項目を表示できるようになりました。~ でも、問題があります。画面が最初に表示されるときは、hiddenの値がリクエストで飛んでこないため、表示できないのです。~ 最終的な解決策は、次のようになります。~ ~ <form id="hogeForm"> <input type="hidden" id="aaaHidden" m:value="#{hoge.aaa}"/> <span m:value="#{hoge.aaa != null ? hoge.aaa : param['hogeForm:aaaHidden']}"/> ... </form> ~ 最初に画面が表示されるときは、hoge.aaaが設定されているので、それを使い、バリデーションエラーでhoge.aaaが設定されていないときには、リクエストのパラメータを使うのです。~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2005-October/000589.html~ http://ml.seasar.org/archives/seasar-user/2005-October/000637.html~ // **HttpServletRequest の自動バインディングを行うとエラー [#h1d43515] >[[S2サポーター]] (2006-04-29 (土) 19:28:37)~ ~ ''Question''~ S2JSF-Examples の、ForEach2ListActionImpl に、~ ~ private HttpServletRequest request = null; public void setRequest(HttpServletRequest aRequest) { request = aRequest; } ~ と定義して、サンプルを実行すると、~ ~ java.lang.UnsupportedOperationException: getInstanceMode at org.seasar.framework.container.impl.SimpleComponentDef.getInstanceMode(SimpleComponentDef.java:272) at org.seasar.jsf.util.InvokeUtil.exportVariables(InvokeUtil.java:108) : (以下、省略) ~ と、例外が発生し、画面が遷移しません。~ ~ JDK1.4.2、Tomcat5.0.28、S2JSF1.0.8 です。~ ~ ~ ''Answer''~ 原因わかりました。~ HttpServletRequest に対して、setter だけではなく、getter を定義していたためのようです。~ setter だけにしたら、発生しなくなりました。~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2005-October/000608.html~ http://ml.seasar.org/archives/seasar-user/2005-October/000620.html~ // **ActionへHttpServletRequestがインジェクトされません [#ff8a9e0d] -Q: http://ml.seasar.org/archives/seasar-user/2006-October/006829.html -A: http://ml.seasar.org/archives/seasar-user/2006-October/006838.html **validatorでNGの時のメッセージをalertで出力したい [#n91df65d] >[[S2サポーター]] (2006-04-29 (土) 19:25:07)~ ~ ''Question''~ validatorでNGの時のメッセージをalertで出力したいのですが、どのように~ したらよいでしょうか?~ ~ ''Answer''~ JavaScriptでの入力チェックならalert出力するのは容易ですがサーバ側での入力チェックの結果を~ JavaScriptで出力するとなると少々、力技が必要かなと思います(S2JSFに限った事では無く)~ 考えられるのは、画面のonload処理でバリデーションエラーがあったかどうかを判断しalert表示する。~ ~ バリデーションエラーがあったかどうかの判断はformのhiddenを利用する等になるかと思います。~ ~ 例えば、Action内でsessionに"ErrorMsg"というキーでエラーメッセージを~ 格納した場合、hiddenには以下のように記述し~ ~ <input type="hidden" id="err" m:value="#{sessionScope['ErrorMsg']}"/> ~ onload時に、上記のhidden値をチェックして値があればalert表示。~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2005-December/000269.html~ http://ml.seasar.org/archives/seasar-user/2005-December/000272.html~ // **m:passthrough="true"を指定すると、convert属性が効かなくなる。 [#m5f36a0e] >[[S2サポーター]] (2006-04-29 (土) 19:23:00)~ ~ ''Question''~ ~ m:passthrough="true"でいくつかの属性が無効果になってしまうことはあ~ りませんか?~ 現在、以下の記述(そのまま写したので取り留めの無い形になっていますが)で~ convert属性がききません。m:passthroughをとるとうまくいきます。仕様でしょ~ うか?~ ~ <input type="text" size="15" maxlength="10" m:value="#{xp001_6.code}" m:onchange="changeCode(this, 'name');" id="code" name="code" m:converter="#{rightPad10}" m:passthrough="true" onfocus="this.select();" m:onKeyPress="return Help(this,event,'承認ルート一覧')"/> ~ ''Answer''~ ~ m:passthrough="true"をタグの属性に追加すると~ m:passthrough="true"以外の部分を、そのまま出力するというのが~ 現在の仕様ですね。~ #m:passthorugh="true"にした場合とそうでない場合での~ 出力されたHTMLのソースを見ると分かると思います。~ ~ ちなみに下記ソースでm:passthrough="true"を使用したい目的は~ JavaScriptでformのcode.value等を利用したいからでしょうか?~ そうであれば、formのidがhogeの場合、JavaScriptからは~ 下記textの値は、document.hoge['hoge:yone2'].valueで利用出来ます。~ ~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2005-December/000268.html~ http://ml.seasar.org/archives/seasar-user/2005-December/000271.html~ // **selectボックスのクリックイベントにてm:immediate=trueとするとDTOに値がセットされなくなる [#xe709f7f] >[[S2サポーター]] (2006-04-29 (土) 19:17:05)~ ~ ''Question''~ ~ 以前[seasar-user:2550]で、S2JSFでselectボックスから選択した際~ javascriptでsubmitする方法を教わりました。~ ~ それに対し追加で質問がございます。~ ~ 上記の方法でsubmitした場合、m:immediate="true"とすると値を受け取りません。~ つまり、リストから選択した値がm:valueで指定のプロパティにセットされません。~ なぜこの現象が発生するのか教えてください。~ 画面の挙動としては、submitはされますが選択する前と全く同じ状態で表示されます。~ m:immediate="true"の記述を削除すると正常に受け取れます。~ ~ ''Answer''~ ~ m:immediate="true"の場合、updateModelフェーズがスキップされるので、~ 値を受け取ることはできません。~ これは、JSFの仕様です。~ ~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2006-February/005192.html~ http://ml.seasar.org/archives/seasar-user/2006-February/005195.html~ // **コンポーネントの名前によってactionのセッタが呼ばれない [#bd4f93a7] >[[S2サポーター]] (2006-04-29 (土) 19:11:26)~ ~ ''Question''~ ~ コンポーネントの名前によってactionのセッタが呼ばれなくなるようです。~ ~ s2jsf-example の Add で~ AddDtoのコンポーネントネームを addDto から hogeAddDto に変更した場合、~ ~ 具体的には add.diconの <component name="addDto" class="examples.jsf.dto.AddDto" instance="request"/> AddActionImpl.javaの void setAddDto(AddDto addDto) add.htmlの #{addDto.arg1} などを、それぞれ、~ ~ <component name="hogeAddDto" class="examples.jsf.dto.AddDto" instance="request"/> void setHogeAddDto(AddDto addDto) #{hogeAddDto.arg1} などと変更した場合、~ ~ 問題なく動作しますが、addDto を hAddDto に変更すると動作しなくなります。~ ~ <component name="hAddDto" class="examples.jsf.dto.AddDto" instance="request"/> void setHAddDto(AddDto addDto) #{hAddDto.arg1} ~ setHAddDto()が呼ばれなくなってしまうようなのですが、~ コンポーネント名には、つけてはいけない名前が存在するのでしょうか?~ ~ ~ ''Answer''~ ~ JavaBeansのネーミングルールにより、setHAddDto()のプロパティ名は、~ HAddDtoです。hAddDtoではありません。~ コンポーネントの名前を変える必要があります。~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2006-February/005116.html~ http://ml.seasar.org/archives/seasar-user/2006-February/005117.html~ // **カスタムコンポーネント用tldファイルの配置場所について [#o0660fda] >[[S2サポーター]] (2006-04-29 (土) 19:10:15)~ ~ ''Question''~ ~ 独自に作成した、JSF のカスタムコンポーネントをS2JSF で使用するとき、~ TLDファイルは、どこに置き、どのような宣言をすればいいのでしょうか?~ ~ たとえば、/WEB-INF/tlds/MyTag.tld を作成し、jsf.dicon に、~ ~ <initMethod name="addTaglibUri"> <arg>"my"</arg> <arg>"/WEB-INF/tlds/MyTag.tld"</arg> </initMethod> ~ と宣言したところ、[Seasar-user:2453] でも報告されているような~ エラーとなります。~ [Seasar-user:2454] のように、jar ファイルを作成して配置する、という~ 方法が取れない場合、たとえば、Webアプリケーションの中の一機能として、~ カスタムコンポーネントが存在し、その機能を、繰り返しテストしたい~ といったような場合です。~ ~ ~ ''Answer''~ ~ 1.0.13以前のバージョンは、tldは、jarファイルの中にあるものしか見つけられません。~ 1.0.14で、利用できるようになりました。~ ~ ■利用方法~ ~ 1. WEB-INF/tlds/some.tldへtldファイルを配置~ 2. web.xmlへtaglib要素を追加~ ~ # web.xml~ <taglib> <taglib-uri>/some_uri</taglib-uri> <taglib-location>/WEB-INF/tlds/some.tld</taglib-location> </taglib> ~ taglib-locationは、実際に配置する箇所にします。~ ~ 3. jsf.diconへエントリを追加~ ~ org.seasar.jsf.runtime.JsfConfigImplへinitMethodを追加。~ ~ # jsf.dicon~ <initMethod name="addTaglibUri"> <arg>"some"</arg> <arg>"http://somedomain/"</arg> </initMethod> ~ 第2引数はsome.tldのtaglib/uriとあわせます。~ ~ 4. jsf.diconを修正~ ~ 上部にある記述を変更します。~ ~ # jsf.dicon~ <component class="org.seasar.jsf.runtime.ServletContextTaglibManagerImpl"> <initMethod name="init"/> <destroyMethod name="destroy"/> </component> ~ ↓変更~ ~ <component class="org.seasar.jsf.runtime.CompositeTaglibManager"> <initMethod name="addTaglibManager"> <arg> <component class="org.seasar.jsf.runtime.ServletContextTaglibManagerImpl"> <initMethod name="init"/> <destroyMethod name="destroy"/> </component> </arg> </initMethod> <initMethod name="addTaglibManager"> <arg> <component class="org.seasar.jsf.runtime.WebappConfigTaglibManagerImpl"> <initMethod name="init"/> <destroyMethod name="destroy"/> </component> </arg> </initMethod> </component> ~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2006-January/000164.html~ http://ml.seasar.org/archives/seasar-user/2006-February/005049.html~ http://ml.seasar.org/archives/seasar-user/2006-February/005065.html~ // **validatorタグを利用すると例外が発生する [#a5947b7b] >[[S2サポーター]] (2006-04-29 (土) 19:07:17)~ ~ ''Question''~ ~ s2jsf 1.0.13 でS2ホットスワップモードを有効にしてvalidatorタグを利用するとRu~ ntimeExceptionが発生します。無効だと正常です。S2JSF Example 1.0.13で確認しま~ した。実行環境はWindows XP SP2、J2SDK1.4.2.10、Tomcat5.0.28 です。~ ~ RuntimeException: java.lang.RuntimeException: Could not restore StateHolder of type $Proxy53 (missing no-args constructor?) ~ ~ ''Answer''~ ~ diconファイルにValidatorを登録すると、hotswapは利用できません。~ faces-config.xmlに登録して使う分には大丈夫ですので、~ hotswapを使う場合は、そちらの方法をお試しください。~ ~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2006-February/005144.html~ http://ml.seasar.org/archives/seasar-user/2006-February/005146.html~ // **Firefoxブラウザでプロパティ設定に失敗する [#zf916bea] >[[S2サポーター]] (2006-04-29 (土) 19:00:53)~ ~ ''Question''~ ~ 作成中のシステムで、FireFox を使用したときにプロパティの設定に失敗する場合があります。~ ~ たとえば、html に、~ ~ <input type="button" value="送信" m:action="#{testAction.sendMail}" /> ~ とあり、TestActionBean に、~ ~ private int selectedScheduleTimeID = 0; private int selectedLocationID = 0; (と、それぞれのsetter)~ ~ が定義してあるような場合です。~ この場合、送信ボタンを押すと、sendMail() は実行されるのですが、この画面を再表示する際に、FireFox だと、~ ~ TestActionBean$$EnhancedByS2AOP$$17d2d70)のプロパティ(selectedLocationID)の設定に失敗しました。 理由はjava.lang.NumberFormatException: For input string: "" ~ とのエラーになります。~ ~ リクエスト内容を調べてみると、IE の場合、~ SelectScheduleComplete.html_SUBMIT=1&selectedScheduleTimeID=null&selectedLocationID=null&selectScheduleCompleteViewForm%3A_link_hidden_=null (リクエストの前半は省略しています) と、selectedScheduleTimeID、selectedLocationID に対して、"null" が送られていますが、~ FireFox の場合、~ SelectScheduleComplete.html_SUBMIT=1&selectedScheduleTimeID=&selectedLocationID=&selectScheduleCompleteViewForm%3A_link_hidden_= のように、"" が送信されています。~ これはブラウザに依存するのでどうしようもないと思うのですが、S2JSF側でこの2つを同じ扱いにすることはできないでしょうか?~ ~ ~ ~ ''Answer''~ ~ S2JSFを修正しました。~ S2JSF 1.0.14から反映されています。~ ~ ■修正内容~ hidden値のクリアの際に、明示的に'null'を指定するよう以下のRendererを修正しました。~ ~ org.seasar.jsf.render.html.HtmlCommandLinkRenderer.java~ org.seasar.jsf.render.html.HtmlFormRenderer.java~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2006-February/005041.html~ http://ml.seasar.org/archives/seasar-user/2006-February/005056.html~ // **<body>タグにJavaScriptを埋め込む方法 [#x833b1bf] >[[S2サポーター]] (2006-04-29 (土) 18:58:13)~ ~ ''Question''~ ~ ■出力形式例~ ~ <body onunload=""> ~ s2jsf-exampleに存在するlayout.htmlのbodyタグに「onunload=""」を記載し、layout.htmlを継承しているHTMLファイルを持つサンプルを実行しました。~ 実行したサンプルにて表示しているHTMLを確認したところ、「<body>」のみを出力してしまいます。~ (onunload=""が表示されていない)~ ~ ~ ''Answer''~ ~ <body onunload="a"> のように、属性値があれば出力されます。~ (現状では、属性値がnullや""の場合は属性自体を出力していません)~ ~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2006-February/005060.html~ http://ml.seasar.org/archives/seasar-user/2006-February/005061.html~ // **ページの初期化処理で無限ループ発生 [#r71cfa5a] >[[S2サポーター]] (2006-04-29 (土) 18:49:05)~ ~ ''Question''~ ページの初期化処理で無限ループが発生して困っています。~ ~ s2jsf-example では、完全に再現ができないのですが、次のような感じ~ です。~ ~ 1. EmployeeSearchInitActionImpl#initialize を、以下のように変更. ---------------------------------------------------------------- public String initialize() { System.out.println("初期化処理"); if(1 == 1) { return "errorPage"; } departmentDtoList = employeeLogic.getAllDepartments(); return null; } ---------------------------------------------------------------- 2.faces-config.xml に、以下を追加 ---------------------------------------------------------------- <navigation-rule> <navigation-case> <from-outcome>errorPage</from-outcome> <to-view-id>/employee/errorPage.html</to-view-id> <redirect/> </navigation-case> </navigation-rule> ---------------------------------------------------------------- 3. /employee/errorPage.html を作ります。中身はなんでもいいです。 ~ この状態で、メニューからEmployee Management をクリックすると、~ EmployeeSearchInitActionImpl#initialize が2回実行されています。~ ~ この2回実行されている現象が関係しているのかどうかはわかりませんが、~ こちらの作成中のシステムだと、2回目に同じ処理(上の例だと、もう1度~ Employee Management をクリックする)をすると、ページの初期化処理が~ 無限に実行されてしまいます。~ ~ org.seasar.jsf.runtime.ErrorPageManagerImpl を使っていない理由は、~ エラーログに余計なログを吐きたくないため(log4j で、ERROR の場合は~ 管理者へメールが送信される設定になっている)なのですが、~ ためしに、org.seasar.jsf.runtime.ErrorPageManagerImpl を使った方法~ にしてみると、1回めは正しくエラーページが表示されるのですが、~ 2回目以降はブラウザに例外情報が表示されてしまい、エラーページへ遷移~ されません。~ ~ ちょっと原因も回避方法もわからず困っているのですが、手がかりになる~ ような情報があれば、教えていただけると大変助かります。~ ~ ~ ''Answer''~ ※本件のバグフィックスリリースはS2JSF 1.0.14で行われた。~ ~ 現象を修正しました。~ ~ ■原因~ ~ dispatchでsubmitした画面へ遷移した際に、再度decode処理が行わ~ れていたことでした。~ ~ ■修正内容~ ~ リクエスト内で初回のLifecycleでのみ~ -APPLY_REQUEST_VALUES (2)~ -PROCESS_VALIDATIONS (3)~ -UPDATE_MODEL_VALUES (4)~ -INVOKE_APPLICATION (5)~ >のフェーズを実行するように変更しました。~ (dispatch後のLifecycleではスキップします。)~ 初期化Actionは RENDER_RESPONSE (6) フェーズで行っているため、~ この変更の影響を受けません。~ ~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2006-January/000203.html~ http://ml.seasar.org/archives/seasar-user/2006-January/000204.html~ http://ml.seasar.org/archives/seasar-user/2006-January/000206.html~ // **m:rendered使用時のActionが呼ばれない [#f521f6ab] >[[S2サポーター]] (2006-04-29 (土) 18:43:04)~ ~ ''Question''~ <input type="submit" value="追加" m:action="#{maintenanceProject.confirm}" /> というボタンがあり、押すと、バリデーション → confirm アクションの実行となります。~ ~ これを、~ <span m:rendered="#{projectForm.mode == 'add'}" > <input type="submit" value="追加" m:action="#{maintenanceProject.confirm}" /> </span> とすると、バリデーションは実行されますが、confirm アクションが実行されず、画面が再表示されます。~ ~ ''Answer''~ 原因がわかりました。~ ボタン押下時にActionが実行されないのは、押下のタイミングでは~ 27行目のrenderedがfalseと評価されるためです。~ ~ -viewLogFormはREQUESTスコープにあるので、ボタン表示時と押下時でインスタンスが異なります。~ 押下時にはselectedLogFile属性は初期値""になっています。~ 結果、押下時にはspanのrenderedはfalseになります。~ -renderedがfalseのUIComponent配下は、encodeがスキップされます。~ -ボタンのencodeがスキップされるため、Actionが実行されません。~ >ということが起こっています。~ ~ 回避策としては、viewLogFormをSESSIONスコープへ置くか、hiddenと組み合わせるか(←詳しく検討してい~ ませんが)といった方法があるかと思います。~ ~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2005-November/000400.html~ http://ml.seasar.org/archives/seasar-user/2005-December/000302.html~ http://ml.seasar.org/archives/seasar-user/2006-January/000178.html~ // **S2JSF AOPによるページ遷移の方法 [#hd47ee5d] >[[S2サポーター]] (2006-04-29 (土) 18:34:55)~ ~ ''Question''~ 現在S2JSFでいろいろと試しています。~ やりたい事は、~ ~ AOPでログイン判定~ ログイン未なら~ ページパスを指定して遷移~ ~ を考えているのですが~ S2JSFでは何を呼び出して画面の遷移をしたらいいのかがわかりません。~ ~ ~ ''Answer''~ AspectをActionへ掛けることを想定されているのですよね?~ ~ JSFでの画面遷移は、ActionがreturnするStringで決まります。~ ですので、Aspectで次画面を示すStringをreturnすればOKと思います。~ ~ 簡単な例をあげますと...~ faces-config.xmlへ次のように書いている場合には、Actionへ仕掛~ けたAspectにて"login"をreturnすることで/login.htmlへ遷移でき~ ます。~ ~ <navigation-rule> <navigation-case> <from-outcome>login</from-outcome> <to-view-id>/login.html</to-view-id> </navigation-case> </navigation-rule> ~ 参考になれば幸いです。~ ~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2006-March/005226.html~ http://ml.seasar.org/archives/seasar-user/2006-March/005232.html~ // **formのaction属性を指定したい [#wbe5379e] >[[S2サポーター]] (2006-04-29 (土) 17:59:10)~ ~ ''Question''~ S2JSFでは自動的にform actionを自画面のREQUEST URIか何かを挿入してくれると~ 考えてよろしいでしょうか。~ ~ また、actionを手動で設定することはできるのでしょうか。~ ~ ~ >''Answer''~ m:passthrough="true"を属性に指定する事でHTMLのタグがそのまま出力されます。~ 以下を参考に試して頂けますか?~ ~ <form name="hoge" method="post" action="/add.html" m:passthrough="true"> ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2006-March/005306.html~ http://ml.seasar.org/archives/seasar-user/2006-March/005307.html~ // **<input type="password">のm:value属性で指定されたDtoの値が空で表示される [#k0352eb8] >[[S2サポーター]] (2006-04-29 (土) 16:40:29)~ ~ ''Question''~ -環境~ --S2Container 2.3.7 ~ --S2JSF 1.0.14~ --S2JSF-example 1.0.14~ --Apache-Tomcat-5.5.12~ --JDK1.5.0_03~ ~ -現象~ > <input type="password">のm:value属性で指定されたDtoの値が~ HTMLに反映されず空で表示される。(value属性がHTMLに出力されない)~ ~ -期待する動作~ Dtoの属性値が<input type="password">のvalue属性に設定された状態で~ HTMLが生成される。~ > ''Answer''~ inputの属性に m:redisplay="true" を追加してみていただけます~ か? 値が表示されると思います。~ ~ password値がデフォルトで表示されない(redisplay="false")のは、~ JSFの仕様です。~ ~ ''参考投稿''~ http://ml.seasar.org/archives/seasar-user/2006-April/005416.html'~ http://ml.seasar.org/archives/seasar-user/2006-April/005417.html~ **HTMLを書いたとおりに出力したい [#deaa9c7f] m:passthrough="true" による素のHTML出力 次に示すhtmlを s2jsf-example/test/test.html として作成します。 01:<html xmlns:m="http://www.seasar.org/maya"> 02:<body> 03:<form> 04:Test 05:</body> 06:</html> 実際の出力結果は以下のようになります。 01:<html xmlns:m="http://www.seasar.org/maya"> 02:<body> 03:<form id="_id9" name="_id9" method="post" action="/s2jsf-example/test/test.html" enctype="application/x-www-form-urlencoded"> 04:Test 05:</body> 06:</html> ここで任意にname属性やaction属性を指定したい場合には、次に示すようにm:passthrough="true"をformタグに指定します。 01:<html xmlns:m="http://www.seasar.org/maya"> 02:<body> 03:<form name="testForm" action="hoge.html" method="post" m:passthrough="true"> 04:Test 05:</body> 06:</html> m:passthrough="true"を指定した場合の出力結果は以下のようになります。 01:<html xmlns:m="http://www.seasar.org/maya"> 02:<body> 03:<form action="hoge.html" name="testForm" method="post"> 04:Test 05:</body> 06:</html> m:passthrough="true"を指定した場合は、m:passthrough="true"以外の属性が全てそのまま出力される事が分かります。 formタグだけではなく、他のinputタグ等に関しても同様の指定が可能です。 **JavaScriptから任意のActionを実行したい [#eeb456fd] ラジオボタンやチェックボックスのクリック時に指定したActionメソッドを呼び出す方法をs2jsf-exampleのaddを例にとって見てみましょう。 add.htmlのformタグ以降を以下のように変更します 01:<form id="form1"> 02:<a id="dummy1" m:action="#{addAction.calculate}"/> 03:<input type="checkbox" onclick="doAction();"/>calculate<br/> 04:<script type="text/javascript"> 05:<!-- 06:function doAction() { 07: var f=document.forms['form1']; 08: f.target=''; 09: f.elements['form1:_link_hidden_'].value='form1:dummy1'; 10: f.submit(); 11: return false; 12:} 13://--> 14:</script> 1行目でformタグにid属性を設定します(今回は"form1")。 2行目で呼び出したいactionを設定したダミーのanchorを記述します。この際、anchorにもid属性を設定します(今回は"dummy1")。 4行目から14行目に呼び出したいJavascriptを記述します。 8行目でformのtargetをクリアします。 11行目で呼び出したいactionのidを指定しています。指定方法は formのid:_link_hidden_ となり :_link_hidden_ の部分は固定です。 これによりJavascriptから指定アクションを呼び出す事が可能です。 **カスタムバリデータにおける他の入力値参照方法 [#n0b5519b] TODO **ファイルをアップロードしたい [#o8f96c6b] ファイルアップロードサンプルを紹介します。 jsf.diconに以下のMyFacesの拡張タグを追加します <initMethod name="addTaglibUri"> <arg>"x"</arg> <arg>"http://myfaces.sourceforge.net/tld/myfaces_ext_0_9.tld"</arg> </initMethod> 次にHTMLを作成します 01:<html xmlns:m="http://www.seasar.org/maya"> 02:<head> 03:<meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" /> 04:<title>UploadSample</title> 05:</head> 06:<body> 07:<form enctype="multipart/form-data"> 08:<span m:inject="x:inputFileUpload" m:value="#{hogeDto.uploadedFile}" /> 09:<input type="submit" value="uploadSample"/> 10:</form> 11:</body> 12:</html> 08行目のhogeDtoを定義します package examples.jsf.dto; import java.io.Serializable; import org.apache.myfaces.custom.fileupload.UploadedFile; public class HogeDto implements Serializable { public static final String uploadedFile_BINDING = "bindingType=none"; private UploadedFile uploadedFile; public UploadedFile getUploadedFile() { return this.uploadedFile; } public void setUploadedFile(UploadedFile uploadedFile) { this.uploadedFile = uploadedFile; System.out.println("uploadFileSize["+uploadedFile.getSize()+"]"); } } これでファイルのアップロードが可能です。ファイルを指定してuploadSampleボタンを押すとuploadFileSizeが標準出力に出力されるはずです。 「〜設定をスキップします」のWARNログを出力を出力しないようにBindingアノテーションを指定しています。 詳しくは[[BindingAnnotation:http://s2container.seasar.org/ja/DIContainer.html#BindingAnnotation]]を参考にして下さい。 **ファイルダウンロードをしたい [#g8b1599e] TODO **FacesContextをDIしたい [#eea82682] まず以下のようにdiconファイルにFacesContext#getCurrentInstanceのコンポーネントを登録します。 <component name="facesContext" instance="request"> @javax.faces.context.FacesContext@getCurrentInstance() </component> あとはFacesContextを利用したいコンポーネントでsetFacesContextを定義します private FacesContext facesContext; public void setFacesContext(FacesContext facesContext) { this.facesContext = facesContext; } ※注意事項としましては、FacesContextを利用するコンポーネントでは、 コンポーネントのinstance属性を"request"または"prototype"に設定する必要があります。 **JavaScriptを使用したくない [#r66cf750] ''Question'' ブラウザがJavaScriptをOFFにしている場合でも、アプリケーションを利用できるようにしたい。 ''Answer'' JavaScriptを使用するJSFタグを使用しないようにしましょう。 そのJSFタグはCommandLinkです。 - CommandLinkは使用しない - 画面遷移のLinkはOutputLinkを使用する - formをサブミットする場合は、CommandLinkではなく、CommandButton(inputのtype="image" or type="submit"相当)を使用する とすればOKです。 S2JSFでは <a m:action="fooAction">foo</a> のようにa要素にaction属性があるとCommandLinkとして扱います。 action属性が無い場合↓はOutputLinkとして扱います。 <a href="foo.html">foo</a> **画面から"null"を入力すると、対応するBeanのプロパティにnullがセットされてしまう [#tfb2051f] -Q: http://ml.seasar.org/archives/seasar-user/2006-November/007073.html -A: http://ml.seasar.org/archives/seasar-user/2006-November/007163.html **SerializedViewの数を制限したい [#la3ce434] **メモリ消費量を抑えるためにSessionにキャッシュされるコンポーネントツリーの数を制限したい [#la3ce434] ''Question'' Session上におかれるSerializedViewの数を制限したい。 メモリ消費量を抑えるために Sessionにキャッシュされるコンポーネントツリー(SerializedView)の数を制限したい。 ''Answer'' web.xmlに以下のように設定することで、Session上における数を制限することができます。 web.xmlに以下のように設定することで、Session上にキャッシュされるコンポーネントツリー(SerializedView)の数を制限することができます。 <context-param> <param-name> org.seasar.jsf.UI_VIEW_ROOT_CACHE_SIZE </param-name> <param-value>10</param-value> </context-param>