2010-03-26 12 views
34

में विशेषता जांच मौजूद है मेरे पास कुछ कक्षाएं हैं जो सुपरक्लास को बढ़ाती हैं, और जेएसपी में मैं इन वर्गों के कुछ विशेषताओं को दिखाना चाहता हूं। मैं केवल एक जेएसपी बनाना चाहता हूं, लेकिन अगर ऑब्जेक्ट में कोई विशेषता है या नहीं, तो मुझे पहले से पता नहीं है। तो मुझे एक जेएसटीएल अभिव्यक्ति या एक टैग चाहिए जो जांचता है कि मेरे द्वारा पास की गई वस्तु में यह विशेषता है (जावास्क्रिप्ट में ऑपरेटर के समान, लेकिन सर्वर में)।जेएसपी

<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> 

मैं इसे कैसे प्राप्त कर सकता हूं?

धन्यवाद।

उत्तर

50

उपयोग करें कर सकते हैं।

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

क्या यह सिर्फ मुझे है? मुझे लगता है कि यह देखने के लिए एक बदसूरत तरीका है कि कोई चर मौजूद है या नहीं। इसके बजाय जावा में नलपोइंटर अपवाद को पकड़ने की तरह? '(अगर! = शून्य)' –

+5

@ शेरविन: यह वास्तव में एक खराब डिजाइन है। लेकिन यह अजीब आवश्यकता को हासिल करने का एकमात्र तरीका है। – BalusC

+0

@ शेरविन असगारी मुझे लगता है कि "अगर शून्य" बदसूरत हैं। जब तक आप इसे तीसरे पक्ष एपीआई नहीं करते। आपको सभी अपवाद-मार्ग क्लीनर का ख्याल रखना चाहिए। – magulla

1

आप कुछ इस तरह का मतलब है:

<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> 

यदि यह एक सूची आप JSTL c:catch की

<c:if test="#{not empty myObject.myAttribute}"> 
+3

नहीं, अगर मैं myObject.myAttribute और myObject को myAttribute के लिए गेटटर नहीं मिला है तो मुझे एक PropertyNotFoundException मिलेगा। यह वही नहीं है कि किसी ऑब्जेक्ट में एक संपत्ति है जिसमें शून्य मान है कि इसमें यह संपत्ति नहीं है। – Javi

+0

लेकिन आप संपत्ति को कैसे एक्सेस करना चाहते हैं? जहां तक ​​मुझे पता है, यह केवल गेटर्स के माध्यम से पहुंच सकता है। भले ही परिवर्तनीय सार्वजनिक है, मुझे विश्वास है कि आपको एक गेटर की आवश्यकता है। आप सिर्फ गेटटर क्यों नहीं बना सकते? –

+3

संपत्ति प्रत्येक सबक्लास में मौजूद नहीं है, इसलिए जब संपत्ति मौजूद है तो मेरे पास इसके लिए एक गेटटर है। समस्या यह है कि मुझे नहीं पता कि कौन से सबक्लास पास किए जा रहे हैं। – Javi

13

vivin's blog post के अनुसार, आप संपत्ति की जांच के लिए आसानी से एक कस्टम फ़ंक्शन बना सकते हैं।

संक्षेप में, आप पहले से ही अपने स्वयं के 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; 
    } 
} 

... और अपने टीएलडी के लिए पांच लाइनों को जोड़ने ...

<function> 
    <name>hasProperty</name> 
    <function-class>my.package.MyUtilClass</function-class> 
    <function-signature>boolean hasProperty(java.lang.Object, 
     java.lang.String) 
    </function-signature> 
</function> 

... और BalusC महान जवाब के अपने JSP

<c:if test="${myTld:hasProperty(myObject, 'myAttribute')}"> 
    <c:set var="foo" value="${myObject.myAttribute}" /> 
</c:if> 
2

बस एक अधिक विस्तृत (विशिष्ट?) के उपयोग में यह बुला

<%-- 
    [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 "अब तक एक ही रास्ता अजीब आवश्यकता हासिल करने के लिए है कि" द्वारा उत्तर नहीं है।

संसाधन

1

स्वीकार किए जाते हैं जवाब कुछ दुष्प्रभाव हो सकते हैं जब मैं सिर्फ अगर वस्तु क्षेत्र है परीक्षण करना चाहते हैं, लेकिन क्षेत्र के मूल्य को आउटपुट नहीं करना चाहते हैं। उल्लिखित मामलों में, मैं स्निपेट झटका का उपयोग करता हूं:

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

उम्मीद है कि इससे मदद मिलती है।