- PR -

携帯ブラウザで初期入力モードを設定するための、strutsタグの拡張について

1
投稿者投稿内容
わか
常連さん
会議室デビュー日: 2003/12/14
投稿数: 47
お住まい・勤務地: 広島市
投稿日時: 2006-01-16 12:16
お世話になります、ワカです。

struts1.2で携帯向けのサイトを構築しています。

携帯ブラウザで
電話番号などを入力させる場合、<html:text>タグを使用するかと思いますが、
これに「istyle」「mode」属性を併せて使いたいと考えています。

標準のstrutsタグに上記属性が存在しないため、
struts-html.tldに定義を追記し、
org.apache.struts.taglib.html.TextTagをextendsしたクラスを作りましたが、
うまく「istyle」で設定したモードが有効とならないようです。

恐らくstrutsタグを拡張したクラスの作り方に問題があると思うのですが、
ソースを読み解く時間的・技術的余裕がなく、大変困っています。

同様のことを実現された方、アドバイスいただけませんでしょうか。


■struts-html.tldへの追記
コード:
<tag>
<name>extext</name>
<tagclass>jp.renrakumail.utils.ExTextTag</tagclass>
<body-content>EMPTY</body-content>
<attribute>
<name>istyle</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>mode</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
〜以下 <name>text</name> と同様〜




■strutsタグを拡張したクラス
コード:
public class ExTextTag extends org.apache.struts.taglib.html.TextTag {
	
	/** ドコモ/vodafoneの携帯電話で入力モードを設定する */
	private String istyle;
	/** auの携帯電話で入力モードを設定する */
	private String mode;

	public String getIstyle() {
		return istyle;
	}

	public void setIstyle(String istyle) {
		this.istyle = istyle;
	}

	public String getMode() {
		return mode;
	}

	public void setMode(String mode) {
		this.mode = mode;
	}
}



■jspへの記述
コード:
<html:extext property="telno" size="20" maxlength="11" istyle="4" mode="numeric" accesskey="1"/>

かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-01-16 12:39
試していないですが、
renderInputElementメソッドもオーバーライドする必要がある気がします。
もしかしたら、getElementCloseをオーバーライドするって方が楽かも。

コード:
protected String getElementClose(){
    StringBuffer buf = new StringBuffer();
    buf.append("istyle=¥"");
    ...省略
    buf.append(super.getElementClose());
    return buf.toString();
}



「タグの閉じ」を返すメソッドをオーバーライドして、
「追加した属性」+「タグの閉じ」を返すように変更すれば、
必ずgetElementCloseが呼ばれるので、「追加した属性」がレンダリングされるでしょう。
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2006-01-16 13:10
引用:

かつのりさんの書き込み (2006-01-16 12:39) より:
試していないですが、
renderInputElementメソッドもオーバーライドする必要がある気がします。
もしかしたら、getElementCloseをオーバーライドするって方が楽かも。


というか、そういう用途のために
prepareOtherAttributes(StringBuffer handlers)
というメソッドが既に用意されていますよ。
わか
常連さん
会議室デビュー日: 2003/12/14
投稿数: 47
お住まい・勤務地: 広島市
投稿日時: 2006-01-16 13:40
かつのりさま、yamasaさま 書き込みありがとうございます。

アドバイスいただいた内容を元に

■strutsタグを拡張したクラス
コード:
public class ExTextTag extends org.apache.struts.taglib.html.TextTag {
	
	/** ドコモ/vodafoneの携帯電話で入力モードを設定する */
	private String istyle;
	/** auの携帯電話で入力モードを設定する */
	private String mode;

	public String getIstyle() {
		return istyle;
	}

	public void setIstyle(String istyle) {
		this.istyle = istyle;
	}

	public String getMode() {
		return mode;
	}

	public void setMode(String mode) {
		this.mode = mode;
	}

    // 「istyle」「mode」を有効とするため、次のメソッドをオーバーライドする
    protected void prepareOtherAttributes(StringBuffer handlers) {        
        prepareAttribute(handlers, "istyle", getIstyle());
        prepareAttribute(handlers, "mode", getMode());
    }
}



としたところ、目的の動作を得ることができました。

なるほど、うまくできているのですね!!
ありがとうございました。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-01-16 21:52
>yamasaさん

おー、そんなメソッドがあったんですね。
勉強になります。
1

スキルアップ/キャリアアップ(JOB@IT)