デジタルチャイルド日記

コンピュータ関連のいろいろメモを残していく子供部屋です。

Strutsの独自taglib

Strutsの独自のtaglibを作る方法について、検証したのでメモメモ。

 

Strutsでtaglibを作成する場合、すでにある既存クラスを継承して作成するほうが楽ですね。一から作るとめんどくさいし、バグも生み出しそうですし。

 

作ってみた感想としては、うまく利用すれば、かなり使えるものができあがりそう・・でした。

 

taglib用のクラスを作成

taglibの基本的な動きは、JavaでHTMLを成形して出力する!ということになりますので、HTML出力用のクラスを作成します。

Strutsにはもともと、いろいろなtaglibクラスがあるのでそれを継承して、クラスを作成します。今回元にしたのは、html:textのクラス(TextTagクラス)になります。

【DateTextTag.java

package jp.co.test.taglib;
import javax.servlet.jsp.JspException;
import org.apache.struts.taglib.TagUtils;
import org.apache.struts.taglib.html.TextTag;

public class DateTextTag extends TextTag {

  @Override
  public int doStartTag() throws JspException {

    // セッションの状態により有効無効の切り替え
    if("30".equals(pageContext.getSession().getAttribute("roleid"))) {
      this.setDisabled(true);
    } else {
      this.setDisabled(false);
    }
    // 元のテキストボックス表示
    super.doStartTag();
    // テキストボックスのblur用のJavaScriptを出力
    if (pageContext.getAttribute(TextTag.class.getName()) == null){
      TagUtils.getInstance().write(this.pageContext,
          "\n"
          + "<script type=\"text/javascript\">\n"
          + "function _toSlash(obj) {\n"
          + "  if(new RegExp(/^[0-9]{8}$/).test(obj.value)) {"
          + "    var str = obj.value.trim();\n"
          + "    var y = str.substr(0,4);\n"
          + "    var m = str.substr(4,2);\n"
          + "    var d = str.substr(6,2);\n"
          + "    obj.value = y + \"/\" + m + \"/\" + d; } }\n"
          + "</script>\n");
          
      pageContext.setAttribute(TextTag.class.getName(), Boolean.TRUE);
    }
    
    return SKIP_BODY;
  }
    
  @Override
  public String getOnblur() {
    String org = super.getOnblur();
    return "_toSlash(this);" + (org == null ? "" : org);
  }
}

taglibの設定ファイルを作成

今回は、struts-html.tldの中から、textの設定だけをコピーして、sample.tldを作成しました。変更箇所は以下

属性名 設定値
name tag名を指定。今回は、datetextにしました。
tag-class 先の手順で作成したクラスを指定。

 

【sample.tld

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib 
    PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
    "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
     
  <taglib>
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>sample</short-name>
    <tag>
      <name>datetext</name>
      <tag-class>jp.co.test.taglib.DateTextTag</tag-class>
      <description>
      <![CDATA[ 

JSPにtaglibの設定を追加

最後にJSPに新規に作成したtldJSPを追加して完成です。

 

追加分 設定値
taglib設定追加 @taglibに上記で作成したtldファイルを追加
tagを追加 sample:datetextとして、新規作成したtaglibを追加

【input.jsp

<%@ taglib uri="WEB-INF/tld/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="WEB-INF/tld/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="WEB-INF/tld/struts-html.tld" prefix="html" %>
<%@ taglib uri="WEB-INF/tld/struts-html.tld" prefix="tiles" %>
<%@ taglib uri="WEB-INF/tld/sample.tld" prefix="sample" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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">
    <title>INPU WORLD サンプル</title>
  </head>
  <body>
    <html:errors/>
    <html:form action="inputworld.html?action_id=regist" method="POST">
      ■入力チェック用<br />
      <sample:datetext name="inputworld" property="inputValue" errorStyle="background-color:#ff0000"></sample:datetext><br />
      <br />
      <html:submit></html:submit>
    </html:form>
  </body>
</html>

 

 上記以外にも、テキストボックスのエラースタイルが決まっているなら、要素ごとにJSPで指定するよりも、taglibで一気に変更するほうが手っ取り早いですし、いろいろと加工することも可能です。

 

結構使えそうなので、今後は使っていきたいと思います。(使う機会があればですがw

 

以上。メモメモでした。