SSブログ
-| 2018年09月 |2018年10月 ブログトップ

【タグライブラリ】設定したFormBeanのフィールドをhiddenタグに展開して表示 [JSP]

package spring.app.tag;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class BeanHiddenTagHandler extends TagSupport {
/** Beanが格納されている属性名 */
private String beanName = "";

/**
* @param beanName セットする beanName
*/
public void setBeanName(String beanName) {
this.beanName = beanName;
}

@Override
public int doEndTag() throws JspException {
// 出力
try {
Object targetBean = pageContext.findAttribute(beanName);
if(targetBean == null) {
return EVAL_PAGE;
}

// Class<?> cls = Class.forName(targetBean);
Class<?> cls = targetBean.getClass();
Field[] fieldArray = cls.getDeclaredFields();
StringBuilder retStr = new StringBuilder();

for (Field field : fieldArray) {
// 値取得のため
field.setAccessible(true);

Object beanValue = field.get(targetBean);
// 値がない場合は項目名だけでhiddenタグ作成。配列とリストは
if (beanValue == null) {
retStr.append(getHiddenTag(field.getName(), ""));
continue;
}

// List型の場合、配列にしてhiddenタグ作成
if (beanValue instanceof List<?>) {
List<?> list = (List<?>) field.get(targetBean);

for (int i = 0; i < list.size(); i++) {
String name = field.getName() + "[" + i + "]";
Object value = (String) list.get(i); // 要素がtoString出来ない可能性
retStr.append(getHiddenTag(name, value));
}
// 配列型の場合
} else if (beanValue.getClass().isArray()) {
Object[] list = (Object[]) beanValue;

for (int i = 0; i < list.length; i++) {
String name = field.getName() + "[" + i + "]";
Object value = list[i]; // 要素がtoString出来ない可能性
retStr.append(getHiddenTag(name, value));
}

} else {
// プリミティブ型だけにしたい。特定のインターフェースだったらネスト
// List型以外の場合
retStr.append(getHiddenTag(field.getName(), field.get(targetBean)));
}
}

// hiddenタグを出力
pageContext.getOut().print(retStr.toString());

} catch (IOException | IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
// 残りのページを評価する値を返して終了
return EVAL_PAGE;
}

private String getHiddenTag(String name, Object value) {
return String.format("<input type=\"hidden\" name=\"%s\" value=\"%s\">", name, value);
}

}

nice!(0)  コメント(0) 

タグライブラリの作成方法

■用意するファイル
(例)Webアプリケーション名=springApp
1. tldファイルを用意
/springApp/WebContent/WEB-INF/apptaglib.tld

2. タグハンドラーJavaクラスを作成
spring.app.tag.BeanHiddenTagHandler.java

3. JSPから呼び出す

■詳細
1. tldファイル(/WEB-INF/apptaglib.tld)
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
<tlib-version>1.0</tlib-version>
<!-- タグライブラリの名称とtldファイルの紐づけ -->
<short-name>apptaglib</short-name>
<uri>/WEB-INF/apptaglib</uri>

<!-- タグの定義 -->
<tag>
<!-- タグの名前 -->
<name>SampleTag</name>
<!-- タグハンドラクラス -->
<tag-class>spring.app.tag.BeanHiddenTagHandler</tag-class>
<!-- bodyを持つかどうか -->
<body-content>empty</body-content>
<!-- 属性の定義。attributeを複数並べられる。 -->
<attribute>
<!-- 属性名 -->
<name>beanName</name>
<!-- 必須属性かどうか -->
<required>true</required>
<!-- 実行時評価属性かどうか -->
<rtexprvalue>true</rtexprvalue>
<!-- 属性の型 -->
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>


2. タグハンドラーJavaクラス
・属性が必要な場合はsetterが必要
・スコープからオブジェクト取得する場合、pageContext.findAttribute("属性名");で取得可能

spring.app.tag.BeanHiddenTagHandler.java

package spring.app.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class BeanHiddenTagHandler extends TagSupport {
/** Beanが格納されている属性名 */
private String beanName = "";

/**
* @param beanName セットする beanName
*/
public void setBeanName(String beanName) {
this.beanName = beanName;
}

@Override
public int doEndTag() throws JspException {
// 出力
try {
pageContext.getOut().print("タグに設定した入力値=" + beanName);
} catch (IOException e) {
e.printStackTrace();
}
// 残りのページを評価する値を返して終了
return EVAL_PAGE;
}
}

3. JSP
TLDファイルの読み込みと、呼び出し。

<%@taglib prefix="app" uri="/WEB-INF/apptaglib" %>


nice!(1)  コメント(0) 

-|2018年09月 |2018年10月 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。