スーパークラスを拡張するクラスがいくつかあり、JSPではこれらのクラスの属性をいくつか表示したいと思います。 JSPを1つだけ作成したいのですが、オブジェクトに属性があるかどうかが事前にわかりません。そのため、渡したオブジェクトにこの属性があることを確認するJSTL式またはタグが必要です(javascriptのin operatorに似ていますが、サーバーにあります)。
<c:if test="${an expression which checks if myAttribute exists in myObject}">
<!-- Display this only when myObject has the atttribute "myAttribute" -->
<!-- Now I can access safely to "myAttribute" -->
${myObject.myAttribute}
</C:if>
どうすれば入手できますか?
ありがとう。
JSTL c:catch
。
<c:catch var="exception">${myObject.myAttribute}</c:catch>
<c:if test="${not empty exception}">Attribute not available.</c:if>
vivinのブログ投稿 のように、プロパティを確認するカスタム関数を簡単に作成できます。
つまり、独自のtaglibを既にお持ちの場合は、静的な「hasProperty」メソッドを作成するだけです...
import Java.beans.PropertyDescriptor;
import org.Apache.commons.beanutils.PropertyUtils;
...
public static boolean hasProperty(Object o, String propertyName) {
if (o == null || propertyName == null) {
return false;
}
try
{
return PropertyUtils.getPropertyDescriptor(o, propertyName) != null;
}
catch (Exception e)
{
return false;
}
}
...そして5行をTLDに追加します...
<function>
<name>hasProperty</name>
<function-class>my.package.MyUtilClass</function-class>
<function-signature>boolean hasProperty(Java.lang.Object,
Java.lang.String)
</function-signature>
</function>
...そしてあなたのJSPでそれを呼び出す
<c:if test="${myTld:hasProperty(myObject, 'myAttribute')}">
<c:set var="foo" value="${myObject.myAttribute}" />
</c:if>
オブジェクトにフィールドがあるかどうかをテストしたいだけで、フィールドの値を出力したくない場合、受け入れられた答えにはいくつかの副作用があります。上記の場合、以下のスニペットを使用します。
<c:catch var="exception">
<c:if test="${object.class.getDeclaredField(field) ne null}">
</c:if>
</c:catch>
お役に立てれば。
BalusCのより詳細な(典型的な?)使用法
<%--
[1] sets a default value for variable "currentAttribute"
[2] check if myObject is not null
[3] sets variable "currentAttribute" to the value of what it contains
[4] catches "property not found exception" if any
- if exception thrown, it does not output anything
- if not exception thrown, it outputs the value of myObject.myAttribute
--%>
<c:set var="currentAttribute" value="" /> <%-- [1] --%>
<c:if test="${not empty myObject}"> <%-- [2] --%>
<c:set var="currentAttribute"> <%-- [3] --%>
<c:catch var="exception">${myObject.myAttribute}</c:catch> <%-- [4] --%>
</c:set>
</c:if>
<%-- use the "currentAttribute" variable without worry in the rest of the code --%>
currentAttribute is now equal to: ${currentAttribute}
BalusCの答えのコメントでShervinが指摘したように、これはおそらく最もクリーンなソリューションではなく、BalusCが「これまでのところ奇妙な要件を達成する唯一の方法」と答えたようです。
リソース
次のような意味ですか?
<c:if test="${not null myObject.myAttribute}">
<!-- Now I can access safely to "myAttribute" -->
</C:if>
または他のバリアント
<c:if test="${myObject.myAttribute != null}">
<!-- Now I can access safely to "myAttribute" -->
</C:if>
それがあなたができるリストなら
<c:if test="#{not empty myObject.myAttribute}">