检查属性存在于JSP中

我有一些扩展超类的类,在JSP中,我想显示这些类的一些属性。 我只想做一个JSP,但事先不知道对象是否有属性。 所以我需要一个JSTLexpression式或者一个标签来检查我传递的对象是否有这个属性(类似于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> 

我怎样才能得到这个?

谢谢。

利用JSTL c:catch

 <c:catch var="exception">${myObject.myAttribute}</c:catch> <c:if test="${not empty exception}">Attribute not available.</c:if> 

根据vivin的博客文章 ,您可以随时创build自定义函数来检查属性。

总之,如果你已经有自己的taglib只是创build一个静态的'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; } } 

…并添加五行到您的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> 

只是一个更详细的(典型?)使用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的回答中所指出的那样,这可能不是最干净的解决scheme,而是由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}"> 

接受的答案可能会有一些副作用,当我只是想testing对象是否有字段,但不想输出字段的值。 在提到的情况下,我使用snippet打击:

  <c:catch var="exception"> <c:if test="${object.class.getDeclaredField(field) ne null}"> </c:if> </c:catch> 

希望这可以帮助。