Jav*_*avi 42 jsp jstl jsp-tags
我有一些扩展超类的类,在JSP中我想展示这些类的一些属性.我只想制作一个JSP,但我事先并不知道该对象是否具有属性.所以我需要一个JSTL表达式或一个标签来检查我传递的对象是否具有此属性(类似于javascript中的运算符,但在服务器中).
<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>
Run Code Online (Sandbox Code Playgroud)
我怎么能得到这个?
谢谢.
Bal*_*usC 59
利用JSTL c:catch
.
<c:catch var="exception">${myObject.myAttribute}</c:catch>
<c:if test="${not empty exception}">Attribute not available.</c:if>
Run Code Online (Sandbox Code Playgroud)
sbk*_*sbk 15
根据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;
}
}
Run Code Online (Sandbox Code Playgroud)
...并在您的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>
Run Code Online (Sandbox Code Playgroud)
...并在JSP中调用它
<c:if test="${myTld:hasProperty(myObject, 'myAttribute')}">
<c:set var="foo" value="${myObject.myAttribute}" />
</c:if>
Run Code Online (Sandbox Code Playgroud)
当我只想测试对象是否有字段但不想输出字段的值时,接受的答案可能会产生一些副作用。在上述情况下,我使用下面的代码片段:
<c:catch var="exception">
<c:if test="${object.class.getDeclaredField(field) ne null}">
</c:if>
</c:catch>
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。