检查属性存在于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>
希望这可以帮助。
- 如何将JavaScript值传递给JSP中的Scriptlet?
- 在IntelliJ IDEA中debuggingJSP
- 在JSP页面中使用MVC和DAO模式在HTML中显示JDBC ResultSet
- org.apache.jasper.JasperException:当没有指定默认命名空间时,函数test必须和前缀一起使用
- 将string的Java ArrayList转换为JavaScript数组
- 没有HTML代码的JSP页面,用于将数据导出到Excel工作表
- 用于提供静态内容的Servlet
- getOutputStream()已经被调用了这个响应
- javax.servlet.ServletException:javax.servlet.jsp.JspTagException:不知道如何迭代<forEach>中提供的“items”