2012-04-25 15 views

उत्तर

43

आप एक String करने के लिए Class#getName() तुलना कर सकते हैं या, हो सकता है बेहतर, Class#getSimpleName()

<h:link rendered="#{model['class'].simpleName eq 'ClassA'}">  
    #{errorMessage1} 
</h:link> 
<h:link rendered="#{model['class'].simpleName eq 'ClassB'}">  
    #{errorMessage2} 
</h:link> 

नोट ब्रेस अंकन क्योंकि ['class']class साथ Object#getClass() निर्दिष्ट करने के महत्व को एक जावा शाब्दिक जो अन्यथा ईएल में एक ईएल अपवाद फेंक 2.2+ आरक्षित है।

प्रकार सुरक्षित विकल्प मॉडल के सामान्य बेस वर्ग में public abstract Type getType() के साथ public enum Type { A, B } जोड़ने के लिए है।

<h:link rendered="#{model.type eq 'A'}">  
    #{errorMessage1} 
</h:link> 
<h:link rendered="#{model.type eq 'B'}">  
    #{errorMessage2} 
</h:link> 

कोई भी अवैध मान ईएल 2.2+ में रनटाइम के दौरान ईएल अपवाद फेंक देगा।

+0

इंटरफेस के लिए काम नहीं करेगा ... इसके लिए कोई सुझाव? – Lucas

+0

@ लुकास: यदि कार्यान्वयन एक इंटरफेस है तो यह असंभव है :) यदि आपको इसके साथ कोई समस्या है, तो यह किसी और चीज के कारण होता है। – BalusC

+0

क्लास स्ट्रिंग टेस्ट सुझाव कुछ परिस्थितियों में उपयोगी है, लेकिन यह इंटरफेस या उप-वर्गों के लिए काम नहीं करता है। उदाहरण के लिए एक वास्तविक और तत्काल आवश्यकता है। कृपया यहां वोट दें: http://java.net/jira/browse/JSP_SPEC_PUBLIC-113। संबंधित समस्या भी देखें, 'रेंडर' के अलावा किसी प्रकार के परीक्षण का उपयोग करके किसी मिलान प्रकार के लिए केवल एक प्रकार के लिए बाध्य एक समग्र घटक को कॉल करें, जो निर्माण चरण के दौरान काम नहीं करता है (http: // stackoverflow के नीचे टिप्पणी। कॉम/प्रश्न/16665705/जेएसएफ-कैसे-रोक-स्टैक ओवरफ्लो-देय-टू-रिकर्सन-फॉर-बिल्ड-चरण-बावजूद-रेंडर) –

7

यह EL में काम नहीं करता है। इस के लिए समर्थन सेम का उपयोग करें:

public class MyBean { 

    public boolean getIsClassA() { 
     if(model instanceof ClassA) { 
      return true; 
     } 
     return false; 
    } 


} 

और फिर जांच कर समर्थन की फलियों को फोन करके:

<h:link outcome="#{PageNameA}?faces-redirect=true&amp;" rendered="#{myBean.isClassA}">  
    #{errorMessage} 
</h:link> 

+0

यह वास्तव में एक अच्छा जवाब है। मैंने कैसे एक और समाधान अपनाया: rendered = "# {listRow.rowData.getClass()। GetName() == 'कक्षाबी'}" (कक्षाबी पूरी तरह से quelified होना चाहिए)। क्या इस "गैर-सुरुचिपूर्ण" समाधान के खिलाफ कुछ मजबूत है? – Francesco

+1

मुझे लगता है कि यह समाधान बेहतर है क्योंकि इसे समझना आसान है, लेकिन यह इरादे पर कुछ हद तक निर्भर करता है। यदि आपका इरादा केवल एक लिंक या दूसरे को प्रदर्शित करना है, तो दृश्य में केवल एक लिंक डालें और _business logic_ के लिए बैकिंग बीन का उपयोग करें जो निर्णय लेता है कि परिणाम क्या होना चाहिए। यह भी अधिक टेस्टेबल है। यदि आप संभवतः दोनों लिंक प्रदर्शित करना चाहते हैं, तो दूसरा समाधान ठीक काम करता है, लेकिन मैं अभी भी टेस्टेबिलिटी और स्पष्टता के लिए बैकिंग बीन पसंद करूंगा। आपके पास पूरी तरह से अच्छी भाषा है (जावा) इसलिए ईएल में पागल चीजें और हार्ड-कोड क्लास नाम करने की कोई आवश्यकता नहीं है। – Brian

+0

यह बाल्सस द्वारा सुझाए गए ईएल-आधारित क्लास स्ट्रिंग परीक्षण की तुलना में अधिक सामान्य समाधान है (क्योंकि इंटरफेस और उप-वर्गों के लिए काम कर सकता है, लेकिन यह हर समय ऐसा करना दर्द होता है, और यह अक्सर दोनों को प्रदूषित करता है बैकिंग सेम और/या इकाइयां (या जहां भी कोई परीक्षण करता है)। हमें JSF2.x a.s.a.p में उदाहरण की आवश्यकता है! –

2

एक तरीका होता है, को देखने के

JSF EL: instanceof reserved but not yet implemented?

हालांकि, instanceof ऑपरेटर अभी भी लागू नहीं है, कम से कम Mojarra 2.1 में। यहाँ बग के लिए वोट करें:

http://java.net/jira/browse/JSP_SPEC_PUBLIC-113

सबसे अच्छा समाधान का वर्तमान में एक समर्थन सेम में वर्ग के नाम को स्टोर करने के शायद बजाय प्रत्येक वर्ग के लिए एक बूलियन परीक्षा पद्धति बनाने के मनुष्य:

public String getSelectedNodeClassName() 
{ 
    return selectedNode.getClass().getSimpleName(); 
} 

तो यह बलुस और फ्लैश के समाधान का मिश्रण होगा। हालांकि यह BalusC की तुलना में JSF में और अधिक पढ़े जा सकेंगे प्लस यह काफी मिलता-जुलता भविष्य instanceof ऑपरेटर उपयोग:

rendered="#{nodeManager.selectedNodeClassName eq 'ChapterNode'}" 

इस रूप में फ्लैश सुझाव दिया समर्थन सेम पर कक्षा की परीक्षा में एक विधि का उत्पादन नहीं होगा। हालांकि फ्लैश की तुलना में यह धीमा हो सकता है।

4

यह काम करता है:

rendered="#{node.getClass().getSimpleName() == 'Logt_anno'}" 
2

की तरह एक स्थिर समारोह को परिभाषित करें:

public boolean isInstanceOf(Object obj, Class targetClass) { 
     return targetClass.isInstance(obj); 
    } 

इसके लिए एक कस्टम ईएल फ़ंक्शन निर्धारित करें, और उस का उपयोग करें। हम एक स्ट्रिंग नाम भी पास कर सकते हैं और विधि के अंदर forName() कर सकते हैं।

0

बहुत ही सुंदर नहीं के रूप में यह घुलमिल JSP ईएल और पहले अभिव्यक्ति वाक्य रचना, लेकिन किसी भी अतिरिक्त जावा कोड की आवश्यकता नहीं है:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 

<c:set var="interfaceClass" value="<%=com.example.ClassA.class%>"/> 
<c:set var="implementationClass" value="${model['class']}"/> 
<c:if test="${interfaceClass.isAssignableFrom(implementationClass)}"> 
    <%-- Your logic here. --%> 
</c:if> 
संबंधित मुद्दे