JSFの覚書

outputTextタグの拡張

1. 概要

outputTextタグにattributeとしてtrimLengthを追加する。
表示する文字列がこの長さを超えている場合は
この長さにカットし、"..."を追加して表示する。

2. 各クラス名、タイプを決める。

  • タグハンドラ
    クラス名タグ名
    com.ziqoo.faces.taglib.OutputTextTagoutputText
  • コンポーネント
    クラス名タイプ名
    com.ziqoo.faces.component.HtmlOutputTextcom.ziqoo.faces.HtmlOutputText
  • レンダラ
    クラス名タイプ名Family
    com.ziqoo.faces.renderkit.OutputTextRenderercom.ziqoo.faces.OutputTextRenderercom.ziqoo.faces.Output

3. TLDファイル

ziqooTag.tldという名前で以下内容のファイルを作成し、WEB-INF/tldsへ配置する。

<?xml version="1.0" encoding="UTF-8"?>
<taglib xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   version="2.1">
   <tlib-version>1.2</tlib-version>
   <short-name>z</short-name>
   <uri>/WEB-INF/tlds/ziqooTag</uri>
   <tag>
       <name>outputText</name>
       <tag-class>com.ziqoo.faces.taglib.OutputTextTag</tag-class>
       <body-content>JSP</body-content>
       <attribute>
           <name>converter</name>
           <required>false</required>
           <deferred-value>
               <type>javax.faces.convert.Converter</type>
           </deferred-value>
       </attribute>
       <attribute>
           <name>id</name>
           <required>false</required>
           <rtexprvalue>true</rtexprvalue>
       </attribute>
       <attribute>
           <name>rendered</name>
           <required>false</required>
           <deferred-value>
               <type>boolean</type>
           </deferred-value>
       </attribute>
       <attribute>
           <name>value</name>
           <required>false</required>
           <deferred-value>
               <type>java.lang.Object</type>
           </deferred-value>
       </attribute>
       <attribute>
           <name>dir</name>
           <required>false</required>
           <deferred-value>
               <type>java.lang.String</type>
           </deferred-value>
       </attribute>
       <attribute>
           <name>escape</name>
           <required>false</required>
           <deferred-value>
               <type>boolean</type>
           </deferred-value>
       </attribute>
       <attribute>
           <name>lang</name>
           <required>false</required>
           <deferred-value>
               <type>java.lang.String</type>
           </deferred-value>
       </attribute>
       <attribute>
           <name>style</name>
           <required>false</required>
           <deferred-value>
               <type>java.lang.String</type>
           </deferred-value>
       </attribute>
       <attribute>
           <name>styleClass</name>
           <required>false</required>
           <deferred-value>
               <type>java.lang.String</type>
           </deferred-value>
       </attribute>
       <attribute>
           <name>title</name>
           <required>false</required>
           <deferred-value>
               <type>java.lang.String</type>
           </deferred-value>
       </attribute>
       <attribute>
           <name>binding</name>
           <required>false</required>
           <deferred-value>
               <type>javax.faces.component.UIComponent</type>
           </deferred-value>
       </attribute>
       <attribute>
           <name>trimLength</name>
           <required>false</required>
           <deferred-value>
               <type>java.lang.Integer</type>
           </deferred-value>
       </attribute>
   </tag>
</taglib>

4. faces-config.xml

以下を追加する。

   <component>
       <component-type>com.ziqoo.faces.HtmlOutputText</component-type>
       <component-class>com.ziqoo.faces.component.HtmlOutputText</component-class>
   </component>
   <render-kit>
       <renderer>
           <component-family>com.ziqoo.faces.Output</component-family>
           <renderer-type>com.ziqoo.faces.OutputTextRenderer</renderer-type>
           <renderer-class>com.ziqoo.faces.renderkit.OutputTextRenderer</renderer-class>
       </renderer>
   </render-kit>

5. OutputTextTag.java

package com.ziqoo.faces.taglib;
import 省略
/**
 */
public class OutputTextTag extends UIComponentELTag {
   private ValueExpression converter;
   private ValueExpression value;
   private ValueExpression dir;
   private ValueExpression escape;
   private ValueExpression lang;
   private ValueExpression style;
   private ValueExpression styleClass;
   private ValueExpression title;
   private ValueExpression trimLength;
   //
   public String getRendererType() {
       return "com.ziqoo.faces.OutputTextRenderer";
   }
   //
   public String getComponentType() {
       return "com.ziqoo.faces.HtmlOutputText";
   }
   @Override
   protected void setProperties(UIComponent component) {
       super.setProperties(component);
       UIOutput output = (UIOutput) component;
       //
       if (converter != null) {
           if (!converter.isLiteralText()) {
               output.setValueExpression("converter", converter);
           } else {
               Converter conv = FacesContext.getCurrentInstance().getApplication().createConverter(converter.getExpressionString());
               output.setConverter(conv);
           }
       }
       if (value != null) {
           output.setValueExpression("value", value);
       }
       if (dir != null) {
           output.setValueExpression("dir", dir);
       }
       if (escape != null) {
           output.setValueExpression("escape", escape);
       }
       if (lang != null) {
           output.setValueExpression("lang", lang);
       }
       if (style != null) {
           output.setValueExpression("style", style);
       }
       if (styleClass != null) {
           output.setValueExpression("styleClass", styleClass);
       }
       if (title != null) {
           output.setValueExpression("title", title);
       }
       if (trimLength != null) {
           output.setValueExpression("trimLength", trimLength);
       }
   }
   // RELEASE
   @Override
   public void release() {
       super.release();
       this.converter = null;
       this.value = null;
       this.dir = null;
       this.escape = null;
       this.lang = null;
       this.style = null;
       this.styleClass = null;
       this.title = null;
       this.trimLength = null;
   }
   // setter 省略
}

6. HtmlOutputText.java

package com.ziqoo.faces.component;
import 省略
/**
 */
public class HtmlOutputText extends javax.faces.component.html.HtmlOutputText {
   private Integer trimLength;
   private Object[] values;
   //
   public Integer getTrimLength() {
       if (trimLength != null) {
           return trimLength;
       }
       ValueExpression ve = getValueExpression("trimLength");
       if (ve != null) {
           return (Integer)ve.getValue(getFacesContext().getELContext());
       } else {
           return null;
       }
   }
   //
   public void setTrimLength(Integer trimLength) {
       this.trimLength = trimLength;
   }
   @Override
   public String getFamily() {
       return "com.ziqoo.faces.Output";
   }
   @Override
   public Object saveState(FacesContext _context) {
       if (values == null)
           values = new Object[2];
       values[0] = super.saveState(_context);
       values[1] = trimLength;
       return values;
   }
   @Override
   public void restoreState(FacesContext _context, Object _state) {
       values = (Object[])_state;
       super.restoreState(_context, values[0]);
       trimLength = (Integer)values[1];
   }
}

7. OutputTextRenderer.java

package com.ziqoo.faces.renderkit;
import 省略
/**
 */
public class OutputTextRenderer extends Renderer {
   @Override
   public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
       if (!component.isRendered()) {
           return;
       }
       // idを取得
       String id = component.getClientId(context);
       if (id.startsWith("j_id"))
           id = null;
       // valueを取得。コンバータ指定があれば適用する。
       ValueHolder vh = (ValueHolder)component;
       Object value = vh.getValue();
       String valueStr = null;
       Converter converter = vh.getConverter();
       if (converter != null) {
           valueStr = converter.getAsString(context, component, value);
       } else if (value != null) {
           // コンバータ指定が無い場合は適切なコンバータを取得するようにすると完璧。
           // ここでは省略。
           valueStr = value instanceof String ? (String)value: value.toString();
       }
       //
       ResponseWriter writer = context.getResponseWriter();
       Map<String, Object> attributes = component.getAttributes();
       String style = (String) attributes.get("style");
       String styleClass = (String) attributes.get("styleClass");
       String dir = (String) attributes.get("dir");
       String lang = (String) attributes.get("lang");
       String title = (String) attributes.get("title");
       Boolean escape = (Boolean)attributes.get("escape");
       Integer trimLength = (Integer) attributes.get("trimLength");
       //
       if (style != null || styleClass != null ||  dir != null || lang != null || title != null
               || id != null) {
           writer.startElement("span", component);
           if (id != null) {
               writer.writeAttribute("id", id, "id");
           }
           if (null != styleClass) {
               writer.writeAttribute("class", styleClass, "styleClass");
           }
           RenderKitUtils.renderPassThruAttributes(context, writer, component);
       }
       if (valueStr != null) {
           if (trimLength != null) {
               if ( valueStr.length() > trimLength)
                   valueStr = valueStr.substring(0, trimLength)+"...";
           }
           if (escape) {
               writer.writeText(valueStr, component, "value");
           } else {
               writer.write(valueStr);
           }
       }
       if (style != null || styleClass != null ||  dir != null || lang != null || title != null
               || id != null) {
           writer.endElement("span");
       }
   }
}

8. 利用例

  • jspファイル
    以下で"#{bean1.date}"はDate型の値とする。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@taglib prefix="z" uri="/WEB-INF/tlds/ziqooTag"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<f:view>
   <html>
       <head>
           <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
       </head>
       <body>
           <z:outputText id="out1" value="#{bean1.date}" trimLength="7">
               <f:convertDateTime pattern="yyyy/MM/dd"/>
           </z:outputText>
       </body>
   </html>
</f:view>
  • 実行結果
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
   <html>
       <head>
           <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
       </head>
       <body>
           <span id="out1">2010/11...</span>
       </body>
   </html>

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-11-30 (火) 19:47:52 (3067d)