input type="buttonではなくbuttonタグへの対応:解法1
裏に隠し(display:none;な)ボタンを置いて、JavaScriptからこれをクリック。
って感じでしょうか。
<button type="button" m:onclick="javascript:document.getElementById('calculate').click();"> calculate </button> <input type="submit" id="calculate" value="calculate" m:action="#{addAction.calculate}" style="display:none;" />
input type="buttonではなくbuttonタグへの対応
前回の悩みに続いてUI周りをいろいろと検証しています..
ボタンについては、input type="button" よりもが流行らしい...(ホント?)
で、早速検証すると、エラーがでてしまいました。
現象はS2JSF Example 1.1.2 のAdd.htmlで確認しました。
<input type="submit" value="calculate" m:action="#{addAction.calculate}"/>
を
<button type="button" m:action="#{addAction.calculate}"> calculate </button>
に書き換えて実行すると、
org.seasar.framework.beans.PropertyNotFoundRuntimeException: [ESSR0065]クラス(examples.jsf.action.impl.AddActionImpl$$EnhancedByS2AOP$$1e247e2)のプロパティ(calculate)が見つかりません org.seasar.framework.beans.impl.BeanDescImpl.getPropertyDesc(BeanDescImpl.java:132) org.seasar.jsf.el.S2PropertyResolver.getProperty(S2PropertyResolver.java:202) org.seasar.jsf.el.S2PropertyResolver.getValue(S2PropertyResolver.java:56) org.seasar.teeda.core.util.PropertyResolverUtil.getValue(PropertyResolverUtil.java:32) org.seasar.teeda.core.el.impl.commons.ComplexValueReplacer$JsfPropertySuffix.evaluate(ComplexValueReplacer.java:128) org.apache.commons.el.ComplexValue.evaluate(ComplexValue.java:145) org.seasar.teeda.core.el.impl.commons.CommonsExpressionProcessorImpl.evaluate(CommonsExpressionProcessorImpl.java:94) org.seasar.teeda.core.el.impl.ValueBindingImpl.getValue(ValueBindingImpl.java:68) org.seasar.jsf.util.BindingUtil.getBindingValue(BindingUtil.java:110) org.seasar.jsf.render.html.HtmlElementRenderer.renderAttributes(HtmlElementRenderer.java:105) org.seasar.jsf.render.html.HtmlElementRenderer.encodeBegin(HtmlElementRenderer.java:53) javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:331) org.seasar.jsf.util.RenderUtil.encodeChild(RenderUtil.java:73) org.seasar.jsf.util.RenderUtil.encodeChildren(RenderUtil.java:63) org.seasar.jsf.util.RenderUtil.encodeChild(RenderUtil.java:77) org.seasar.jsf.util.RenderUtil.encodeChildren(RenderUtil.java:63) org.seasar.jsf.render.html.HtmlElementRenderer.encodeChildren(HtmlElementRenderer.java:87) javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:340) org.seasar.jsf.util.RenderUtil.encodeChild(RenderUtil.java:75) org.seasar.jsf.util.RenderUtil.encodeChildren(RenderUtil.java:63) org.seasar.jsf.render.html.HtmlElementRenderer.encodeChildren(HtmlElementRenderer.java:87) javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:340) javax.faces.webapp.UIComponentTag.encodeChildren(UIComponentTag.java:244) javax.faces.webapp.UIComponentTag.doEndTag(UIComponentTag.java:212) org.seasar.jsf.processor.TagProcessorImpl.processTag(TagProcessorImpl.java:249) org.seasar.jsf.processor.TagProcessorImpl.process(TagProcessorImpl.java:239) org.seasar.jsf.processor.ElementProcessor.process(ElementProcessor.java:93) org.seasar.jsf.processor.TagProcessorImpl.processChildren(TagProcessorImpl.java:294) org.seasar.jsf.processor.TagProcessorImpl.processBodyTag(TagProcessorImpl.java:267) org.seasar.jsf.processor.TagProcessorImpl.process(TagProcessorImpl.java:235) org.seasar.jsf.processor.TagProcessorImpl.process(TagProcessorImpl.java:218) org.seasar.jsf.processor.ViewProcessor.process(ViewProcessor.java:198) org.seasar.jsf.processor.ViewProcessor.process(ViewProcessor.java:196) org.seasar.jsf.runtime.ViewRendererImpl.renderView(ViewRendererImpl.java:102) org.seasar.jsf.application.S2ViewHandler.renderView(S2ViewHandler.java:123) org.seasar.jsf.lifecycle.LifecycleImpl.render(LifecycleImpl.java:200) javax.faces.webapp.FacesServlet.service(FacesServlet.java:93) examples.jsf.util.RequestDumpFilter.doFilter(RequestDumpFilter.java:66) org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:62) org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:63) org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:122)
...orz
inputタグのm:required属性やValidtorをボタンによって無効にしたいんですが..
(前振り)S2JSF1.1系では、Validatorをボタンによって有効/無効にする仕組みがあります。
s2jsf-exampleの『Validator ON/OFF』を参考にするといいでしょう。
http://localhost:8080/s2jsf-example/validator/validator2.html
以下にHTMLテンプレートを抜粋します。
<input id="userName" type="text" m:label = "User Name" m:value="#{validatorDto.userName}" m:required="true"> <span m:inject="s:validator" m:binding="#{tuserNameLengthValidator}"/> </input> <span m:inject="h:message" m:for="userName"/><br /> <input id="aaa" type="button" value="validation button" m:action="aaa"/> <input id="bbb" type="button" value="no validation button" m:action="bbb"/>
examples.jsf.dicon.allvalidator.dicon には、ボタン『aaa』の場合だけこのValidatorが有効になるように定義されています。
<component name="tuserNameLengthValidator" class="org.seasar.teeda.extension.validator.TLengthValidator"> <property name="minimum">2</property> <property name="target">"aaa"</property> </component>
上記の方法に関して、欲しい!と思う機能
1.m:required="true" もボタンによって切り替えたい
例えば、ユーザ登録で『郵便番号から住所を補完する』という画面を作りたい場合、
名前が未入力でエラーになってしまったり。。。という悩みが発生します。
例えばこんな感じで、m:target属性を用意し、登録ボタン(doRegist)だけを対象にできるといいと思います。
<input id="userName" type="text" m:value="#{validatorDto.userName}" m:required="true" m:target="doRegist" > </input>
2.targetに正規表現を使えるようにしたい。
遷移系は『goXXX』、実行系は『doXXX』とActionのメソッド名を決めておいて、targetには正規表現で指定しておくことで、
Validatorを再利用しやすくなると思っています。
<component name="tuserNameLengthValidator" class="org.seasar.teeda.extension.validator.TLengthValidator"> <property name="minimum">2</property> <property name="target">"do.*"</property> </component>
3.targetをHTMLで指定できるようにしたい。
HTMLテンプレートでtarget属性を上書きできたりするといいなと思います。
<input id="userName" type="text" m:label = "User Name" m:value="#{validatorDto.userName}" m:required="true"> <span m:inject="s:validator" m:binding="#{tuserNameLengthValidator}" m:target="bbb" /> </input> <input id="aaa" type="button" value="validation button" m:action="aaa"/> <input id="bbb" type="button" value="no validation button" m:action="bbb"/>
なんか上手くまとまっていませんねぇ。。
Teeda Extentionだとこのあたりは解決しているように見えますが、S2JSFな私にも欲しいです。
selectManyCheckboxの出力するlabelタグがIE6で動作しない
S2JSFのselectManyCheckboxでは、チェックボックスに対してlabelタグを出力してくれます。
<label><input name="_id88:_id95" type="checkbox" value="1" />One</label>
ただし、この形式はIE6ではサポートしていないようです。
HTML的には、以下のようにtext値をlabelタグで囲む必要があるようです。
(IEが悪い?)
<input id="_id88:_id95" name="_id88:_id95" type="checkbox" value="1" /><label for="_id88:_id95">One</label>
idを振って、labelのスタートタグをひとつ後ろに持っていく感じですね。
というわけで、selectManyCheckboxがIE対応できなくて困っています..orz
S2JSFのorg.seasar.jsf.render.html.HtmlSelectManyCheckboxRenderer.java あたりなんでしょうか。。
インタフェースが無いクラスにアスペクトする場合
ポイントカットの指定が必須になります。
指定しないとアスペクトが効きません。
下記は”initialize,do.*,go.*”の範囲で、Actionにアスペクトを掛ける例です。
<component class="org.seasar.framework.container.autoregister.AspectAutoRegister"> <property name="interceptor">aop.traceInterceptor</property> <!-- Interfaceが無い場合はPointCut指定必須 --> <property name="pointcut">"initialize,do.*,go.*"</property> <initMethod name="addClassPattern"> <arg>"jp.co.hoge.action"</arg> <arg>".*Action"</arg> </initMethod> </component>
※ハマった。。
S2JSFプラグイン 1.1.1リリース
S2JSFユーザにうれしいニュースです。
プラグインがバージョンアップしました。
S2JSFプラグイン 1.1.1リリース - 新・たけぞう瀕死の日記
http://www3.vis.ne.jp/~asaki/p_diary/diary.cgi?Date=20070618
変更内容を引用しておきます。
・TLDパース処理のバグ修正。 ・HTMLエディタとfaces-config.xmlエディタに自動編集機能を追加。コメントとCDATAセクションの入力が補助されます。 ・内部で使用しているS2JSFのバージョンを1.1.1にアップデート。同時にS2コンテナのバージョンを2.4.7にアップデート。 ・内蔵のs2jsf.tldを最新版に差し替え。 ・WEB-INF/tldsからのTLD読み込みに対応。 ・TLDが見つからない場合はエラーとして表示するようにした。 ・補完時にJavaクラスやプロパティ、メソッドの場合は追加情報としてJavadocをホバー表示するようにした。
ほぼ最新のS2JSFとS2に対応していただいたようです。
というわけで、HTMLに対してプラグインからエラーが大量に出ていた件、一度Eclipse内のプロジェクトを再構築してみようと思います。
あまりに気持ち悪いので。