Search on the blog

2013年1月25日金曜日

Learn Struts(5)

strutsのhtmlタグ使うと、formに入力した文字を自動で表示してくれるので便利です。

例えば「戻る」ボタンを押したときにユーザーが前回入力していた値を表示するとか、検索ボタンを押して遷移した検索結果画面の検索文字欄にユーザーが入力した値を表示するとか、使いどころはいろいろあります。
内部ではどういう動きをしているのか気になったので、ソースを読んでみました。
org.apache.struts.taglib.html.BaseFieldTagクラスの以下のメソッドでinputタグを作っています。
protected String renderInputElement()
        throws JspException {
        StringBuffer results = new StringBuffer("<input");

        prepareAttribute(results, "type", this.type);
        prepareAttribute(results, "name", prepareName());
        prepareAttribute(results, "accesskey", getAccesskey());
        prepareAttribute(results, "accept", getAccept());
        prepareAttribute(results, "maxlength", getMaxlength());
        prepareAttribute(results, "size", getCols());
        prepareAttribute(results, "tabindex", getTabindex());
        prepareValue(results);
        results.append(this.prepareEventHandlers());
        results.append(this.prepareStyles());
        if (!isXhtml()) {
            prepareAttribute(results, "autocomplete", getAutocomplete());
        }
        prepareOtherAttributes(results);
        results.append(this.getElementClose());

        return results.toString();
    }
value要素を生成しているのは、prepareValueの部分です。
protected void prepareValue(StringBuffer results)
        throws JspException {
        results.append(" value=\"");

        if (value != null) {
            results.append(this.formatValue(value));
        } else if (redisplay || !"password".equals(type)) {
            Object value =
                TagUtils.getInstance().lookup(pageContext, name, property, null);

            results.append(this.formatValue(value));
        }

        results.append('"');
    }
TagUtils#lookup()を使って指定された名前のBeanの指定されたプロパティ値を取り出しています。なるほど。
いやそれにしても、フレームワークのソース読むのはなかなか楽しいですね。競技プログラミングとはまた違った楽しみがあります。

0 件のコメント:

コメントを投稿