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>

※ハマった。。

ミラチェア注文しました

こんな理由で選定したミラチェア、やっと思い切って注文しました。

色はカプチーノを選択。コーヒー色ってやつですね。現物見てないのでドキドキです。

総額約11万円!。途中、流行り(?)の『バランスボール』に逃げようかとも思ったのですが(w

最初の難関は組み立てでしょうか?。。到着したらまず写真とか載せてみようと思います。

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内のプロジェクトを再構築してみようと思います。
あまりに気持ち悪いので。