[Seasar-user:12706] Renderer内部で指定したActionMethodが呼ばれない
[E-MAIL ADDRESS DELETED]
[E-MAIL ADDRESS DELETED]
2008年 1月 31日 (木) 19:49:10 JST
お疲れ様です、加祥です。
参考資料のソースのように、HtmlCommandButtonRendererを
extendしたカスタムタグを作成し、Renderer内部でActionMethodを
設定(ソース内の−−−→の箇所)しています。
ですが、このアクションメソッドが呼び出されないケースが
あります。
以下、調査状況とご教示頂きたい観点をまとめています。
よろしくお願いしますm(__)m
【調査状況】
どういうケースの時に発生するか絞込みはまだできていない
状態です。
ただ、このカスタムタグを使用した画面を表示する時のRender
Response の After Phase で
viewroot.childrenList.list.elementData[].action に
SimpleMethodBindingのオブジェクトが生成され、メンバの
outcome,transientには下記の様に値が入っていることを確認
しました。
・outcome="ENDMOBILE"
・transient=false
ですが、このボタンを押下した最初のRestore View の
After Phase で上記の値を参照すると、SimpleMethodBinding
がなくなりnullになっています。
【ご教示頂きたい観点】
・ビューの保管は Render Response Phase で行うと思い、Renderer
の中でActionMethodを指定しているが、手法に問題ないか。
(下記の場所でのActionMethodの指定は問題ないか?)
・こういうケースが発生する要因はどいういうものがあるか。
【参考資料】
public class CmnMobileEndBtnRenderer extends HtmlCommandButtonRenderer {
/** COMPONENT_FAMILY */
public static final String COMPONENT_FAMILY = "CsMbEndBtnFamily";
/** RENDERER_TYPE */
public static final String RENDERER_TYPE = "CmnMobileEndBtnRenderer";
/** ignoreComponent */
private final IgnoreAttribute ignoreComponent = new IgnoreAttribute();
{
ignoreComponent.addAttributeName(JsfConstants.ID_ATTR);
ignoreComponent.addAttributeName(JsfConstants.NAME_ATTR);
ignoreComponent.addAttributeName(JsfConstants.TYPE_ATTR);
ignoreComponent.addAttributeName(JsfConstants.VALUE_ATTR);
ignoreComponent.addAttributeName(JsfConstants.IMAGE_ATTR);
ignoreComponent.addAttributeName(JsfConstants.ACTION_ATTR);
ignoreComponent.addAttributeName(JsfConstants.IMMEDIATE_ATTR);
}
/**
* encodeHtmlCommandButtonEnd
* @param context FacesContest
* @param htmlCommandButton HtmlCommandButton
* @throws IOException IOException
*/
protected void encodeHtmlCommandButtonEnd(FacesContext context,
HtmlCommandButton htmlCommandButton) throws IOException {
ResponseWriter writer = context.getResponseWriter();
writer.startElement(JsfConstants.INPUT_ELEM, htmlCommandButton);
final String image = htmlCommandButton.getImage();
final boolean isImageType = StringUtil.isNotBlank(image);
String type;
if (isImageType) {
type = JsfConstants.IMAGE_VALUE;
} else {
type = htmlCommandButton.getType();
}
RendererUtil.renderAttribute(writer, JsfConstants.TYPE_ATTR, type);
RendererUtil.renderAttribute(writer, JsfConstants.VALUE_ATTR, "終了");
final String id = getIdForRender(context, htmlCommandButton);
RendererUtil
.renderIdAttributeIfNecessary(writer, htmlCommandButton, id);
RendererUtil.renderAttribute(writer, JsfConstants.NAME_ATTR,
htmlCommandButton.getClientId(context));
if (isImageType) {
RendererUtil.renderAttribute(writer, JsfConstants.SRC_ATTR, image,
JsfConstants.IMAGE_ATTR);
} else {
renderValueAttribute(context, htmlCommandButton, writer);
}
htmlCommandButton.setValue("終了");
−−−→htmlCommandButton.setAction(new SimpleMethodBinding("ENDMOBILE"));
renderRemainAttributes(htmlCommandButton, writer, ignoreComponent);
writer.endElement(JsfConstants.INPUT_ELEM);
}
}
Seasar-user メーリングリストの案内