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に新規に作成したtldとJSPを追加して完成です。
追加分 | 設定値 |
---|---|
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
以上。メモメモでした。