概要 †
- DBに格納されているコード系(0/1)をJSPで表示するときに文字列(No/Yes)に変換するタグです
- Screen Shot
- JSP
<%@ page contentType="text/html;charset=UTF-8" session="true"%>
<%@ page import="java.util.*"%>
<%@ taglib uri="/tags/struts-bean" prefix="bean"%>
<%@ taglib uri="/tags/snail" prefix="snail"%>
<% Map<String, String> order = new HashMap<String, String>();
order.put("customer", "Taro");
order.put("productNo", "105678-24");
order.put("express order", "1");
order.put("bundle other", "0");
order.put("status", "2");
request.setAttribute("order", order);
%>
<html>
<head>
<title>TAGLIB_EXAMPLE</title>
</head>
<body>
<table border="1">
<tr>
<td>発注者</td>
<td><bean:write name="order" property="customer" /></td>
</tr>
<tr>
<td>商品ID</td>
<td><bean:write name="order" property="productNo" /></td>
</tr>
<tr>
<td>特急モード</td>
<td><snail:code name="order" property="express order" type="OnOff" /></td>
</tr>
<tr>
<td>同梱品</td>
<td><snail:code name="order" property="bundle other" type="YesNo" /></td>
</tr>
<tr>
<td>状態</td>
<td><snail:code name="order" property="status" type="OrderStatus" /></td>
</tr>
</table>
</body>
</html>
関連するファイル †
- CodeTag?.java
- Code.properties
- コード系と対応する文字列が記録されたファイル。CodeTag?.javaが参照する。
- snail.tld
- CodeTag?をJSPから使えるように外部仕様を定義する
- web.xml
タグライブラリのソースコード †
- CodeTag?.java
package com.snail.taglib;
import java.util.ResourceBundle;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.commons.beanutils.PropertyUtils;
/**
* コード系を文字列に変換するタグ.
* <pre>
* 0/1などのコードをYes/Noなどの文字列に変換するタグです。
* ------------------------------------------------------------------------
* 利用方法:
* <snail:code name=" " property=" " scope=" " type=" "/>
* name : 必須 ${scope} に格納されているオブジェクト名。Mapも可。
* property : 任意 ${name} のフィールド変数名。省略時は name で指定した
* オブジェクトをコードと見なします。
* scope : 任意 コードが格納されているスコープ。省略時はREQUEST,SESSION
* の順で${name}が有るかどうか調べます
* type : 必須 コード系
* ------------------------------------------------------------------------
* コード系の定義:
* Code.properties に、"コード系.コード" の形で格納します
* ------------------------------------------------------------------------
* ライブラリ等:
* 内部的にorg.apache.commons.beanutils.PropertyUtilsを使っています。
* </pre>
* 注意事項
* @author kagyuu
*/
@SuppressWarnings( { "serial", "unused" })//JDK1.5の警告を消すため
public final class CodeTag
extends TagSupport {
/**
* スコープ名とスコープを表す数字を格納するHashMap
*/
private static final Map SCOPES = new HashMap();
/**
* スコープ名とスコープを表す数字を角のする
*/
static {
SCOPES.put("page", new Integer(PageContext.PAGE_SCOPE));
SCOPES.put("request", new Integer(PageContext.REQUEST_SCOPE));
SCOPES.put("session", new Integer(PageContext.SESSION_SCOPE));
SCOPES.put(
"application", new Integer(PageContext.APPLICATION_SCOPE));
}
/**
* オブジェクト名
*/
private String name = null;
/**
* プロパティ名
*/
private String property = null;
/**
* スコープ指定
*/
private String scope = null;
/**
* コード体系
*/
private String type = null;
/**
* コンストラクタ
*/
public CodeTag() {
super();
}
/**
* @param param オブジェクト名
*/
public void setName(final String param) {
this.name = param;
}
/**
* @param param プロパティ名
*/
public void setProperty(final String param) {
this.property = param;
}
/**
* @param param スコープ指定
*/
public void setScope(final String param) {
this.scope = param.toUpperCase();
}
/**
* @param param コード体系
*/
public void setType(final String param) {
this.type = param;
}
/**
* タグが閉じられるときに呼ばれるメソッドです
*
* @return 処理続行(EVAL_PAGE)
* @throws JspException 何らかの理由でタグを解釈できなかった
*/
public int doEndTag() throws JspException {
try {
JspWriter out = pageContext.getOut();
Object target = null;
if (scope == null) {
target = pageContext.findAttribute(name);
if (target == null) {
throw new JspException(
"Attribute " + name + " is not in any scopes.");
}
} else {
target =
pageContext.getAttribute(
name,
((Integer) SCOPES.get(scope.toLowerCase())).intValue());
if (target == null) {
throw new JspException(
"Attribute " + name + " is not in " + scope + " scopes.");
}
}
if (property != null) {
target = PropertyUtils.getProperty(target, property);
}
out.println(
PropUtil.getProperty(type + "." + target.toString()));
} catch (Exception e) {
throw new JspException(e);
}
return EVAL_PAGE;
}
}
- Code.properties
OnOff.0=OFF
OnOff.1=ON
YesNo.0=NO
YesNo.1=YES
OrderStatus.0=Order Accepted
OrderStatus.1=Producting
OrderStatus.2=Shipping
OrderStatus.3=Delivered
snail.tldファイル †
- snail.tld
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>snail</shortname>
<uri>http://hondou.homedns.org/taglibs/</uri>
<tag>
<name>code</name>
<tagclass>com.snail.taglib.CodeTag</tagclass>
<bodycontent>empty</bodycontent>
<attribute>
<name>name</name>
<required>true</required>
</attribute>
<attribute>
<name>property</name>
</attribute>
<attribute>
<name>type</name>
<required>true</required>
</attribute>
<attribute>
<name>scope</name>
</attribute>
</tag>
</taglib>
web.xmlへの追記 †
...
<taglib>
<taglib-uri>/tags/snail</taglib-uri>
<taglib-location>/WEB-INF/snail.tld</taglib-location>
</taglib>
</web-app>
Java#JavaEE