पहुँच Enum JSTL


95

साथ ईएल का उपयोग कर मूल्य मैं एक Enum बुलाया स्थिति ऐसी के रूप में परिभाषित किया है:

public enum Status { 

    VALID("valid"), OLD("old"); 

    private final String val; 

    Status(String val) { 
     this.val = val; 
    } 

    public String getStatus() { 
     return val; 
    } 

} 

मैं एक JSTL टैग से VALID का मूल्य का उपयोग करना चाहते हैं। विशेष रूप से <c:when> टैग की विशेषता। जैसे

<c:when test="${dp.status eq Status.VALID"> 

मुझे यकीन नहीं है कि यह संभव है या नहीं।

102

स्ट्रिंग के खिलाफ एक साधारण तुलना काम करता है:

<c:when test="${someModel.status == 'OLD'}"> 
+11

उन लोगों के लिए जो स्रोत की आवश्यकता है: यह "अभिव्यक्ति भाषा विशिष्टता, संस्करण 2.2" की धारा 1.17 में निर्दिष्ट है (उदाहरण के लिए), जो [जेएसआर -245] (http://www.jcp.org/en/ का हिस्सा है) JSR/विस्तार? id = 245)। 06 aug. 102010-08-06 16:57:43

+4

जावासेवर पेज ™ विशिष्टता, संस्करण 2.0 जेएसपी.2.3.5.7 में कहता है: "• यदि ए या बी स्ट्रिंग को ए और बी दोनों स्ट्रिंग कर रहा है, तो लीक्सिक रूप से तुलना करें" 13 apr. 112011-04-13 08:29:31

+8

लेकिन आप एक enum होने का लाभ खो देते हैं: यह नेतृत्व कर सकता है अगर एक दिन में enum बदल जाता है तो बोझिल गलतफहमी के लिए। आम तौर पर, अगर मुझे लगता है कि मैं खुद को एक enum बदल रहा हूं, तो मुझे बहुत सुरक्षित लगता है, और शायद मुझे उस दृश्य में स्ट्रिंग-टू-एनम-रेफरेंस याद नहीं होगा ... 19 sep. 142014-09-19 14:31:51

  0

ठीक है, निर्णय लेने वाले कोड को बाहर रखना बेहतर है दृश्य फिर भी कभी-कभी किसी को भी करना पड़ता है। 22 sep. 142014-09-22 06:57:39

  0

क्या यह enum के toString के खिलाफ तुलना कर रहा है? तो यदि आप ToString को ओवरराइड करते हैं (उदा। आप एक दोस्ताना डिस्प्ले नाम चाहते हैं), तो आपको यह सुनिश्चित करना होगा कि आप उस मान को भी बदल दें जो मिलान किया जा रहा है। 07 jul. 172017-07-07 08:26:01


21

तो मेरी समस्या पूरी तरह से हल मैं निम्न कार्य करने के लिए आवश्यक प्राप्त करने के लिए:

<% pageContext.setAttribute("old", Status.OLD); %> 

तो मैं ऐसा करने में सक्षम था:

<c:when test="${someModel.status == old}"/>...</c:when> 

जो अपेक्षा के अनुरूप काम किया।

+10

स्क्रिप्टलेट का उपयोग करना खराब शैली है। 16 aug. 132013-08-16 15:54:24


9

इस प्रयोजनों मैं निम्न कार्य के लिए:

<c:set var="abc"> 
    <%=Status.OLD.getStatus()%> 
</c:set> 

<c:if test="${someVariable == abc}"> 
    .... 
</c:if> 

यह बदसूरत है, लेकिन काम करता है!

  0

हालांकि टैगडिर्स का उपयोग करते समय यह काम नहीं करेगा। 12 jul. 132013-07-12 08:42:37


-1

मैं आमतौर पर जावा कोड को जेएसपीएस/टैग फ़ाइलों में मिलाकर खराब अभ्यास मानता हूं।

<c:if test="${dp.Status eq 'OLD'}"> 
    ... 
</c:if> 
+3

तो 'eq' के बजाय' == 'का उपयोग करना एक बुरा अभ्यास है? वे दोनों बिल्कुल वही करते हैं, इसलिए "चाल" का कोई साधन नहीं है। 24 nov. 092009-11-24 11:08:50

  0

बेशक, मैं eq बनाम == के उपयोग के संबंध में कोई बयान नहीं दे रहा था। इस प्रश्न के कई उत्तरों में जावा कोड डालने में जेएसपी या टैग फाइलें शामिल हैं जो एक क्रैच हो सकती है। मैं जेएसपी में डिस्प्ले लॉजिक से अलग जावा कोड (जहां इसे आसानी से और पूरी तरह से परीक्षण किया जा सकता है) में व्यावसायिक तर्क रखने का पक्ष लेता हूं। 25 nov. 092009-11-25 08:25:40

+7

मेरे लिए यह आपके जेएसपी में जादू तारों को डालने के लिए एक समान रूप से खराब प्रथा प्रतीत होता है जिसे संकलक द्वारा चेक नहीं किया जा सकता है जब आप अपने enums को दोबारा बनाना चाहते हैं। ऐसा लगता है कि किसी भी तरफ इसका कोई अच्छा समाधान नहीं है। 19 jan. 112011-01-19 22:48:37


2

enum करने के लिए एक विधि जोड़ें की तरह:

public String getString() { 
    return this.name(); 
} 

उदाहरण

public enum MyEnum { 
    VALUE_1, 
    VALUE_2; 
    public String getString() { 
     return this.name(); 
    } 
} 

तब के लिए आप उपयोग कर सकते हैं:

<c:if test="${myObject.myEnumProperty.string eq 'VALUE_2'}">...</c:if> 
'eq' का उपयोग चाल करना चाहिए

3

मुझे कॉर्नेल के सवाल का जवाब नहीं है, लेकिन मैं हूं ई अन्य स्क्रिप्ट उदाहरणों के बारे में एक टिप्पणी। अधिकांश अभिव्यक्ति ट्रस्ट toString() पर निहित रूप से विश्वास करते हैं, लेकिन Enum.valueOf()Enum.name() संपत्ति से मेल खाने वाले/मान से अपेक्षा करता है। तो एक जैसे उपयोग करना चाहिए:

<% pageContext.setAttribute("Status_OLD", Status.OLD.name()); %> 
... 
<c:when test="${someModel.status == Status_OLD}"/>...</c:when> 

52

वसंत MVC का उपयोग कर, स्प्रिंग अभिव्यक्ति भाषा (स्पेल) सहायक हो सकता है, तो:

<spring:eval expression="dp.status == T(com.example.Status).VALID" var="isValid" /> 
<c:if test="${isValid}"> 
    isValid 
</c:if> 
+1

लगता है कि यह आंतरिक enums के लिए काम नहीं करता है? कारण: org.springframework.expression.spel.SpelEvaluationException: EL1005E: (pos 0): टाइप नहीं मिला 'my.package.model.EngagementRequest.EngagementStatus' 02 sep. 112011-09-02 16:37:04

+4

'my.package.model.EngagementRequest $ का उपयोग करने का प्रयास करें EngagementStatus ' 08 sep. 112011-09-08 13:53:10

  0

इस समाधान के बारे में एक अच्छी बात यह है कि अगर आपकी अभिव्यक्ति में कोई गलती हो तो आपको एक त्रुटि संदेश मिलता है, जो हमेशा '<c:if>' और '<c:when>' (वे चुपचाप विफल हो जाते हैं) के साथ नहीं होता है। 14 oct. 152015-10-14 08:19:56


33

आप यहाँ 3 विकल्प, जिनमें से कोई भी सही है:

  1. आप test विशेषता में एक स्क्रिप्टलेट उपयोग कर सकते हैं:

    <c:when test="<%= dp.getStatus() == Status.VALID %>">

    यह enum का उपयोग करता है, लेकिन यह एक स्क्रिप्टलेट का भी उपयोग करता है, जो जेएसपी 2.0 में "सही तरीका" नहीं है।लेकिन सबसे महत्वपूर्ण बात यह है कि जब आप ${} का उपयोग कर when पर एक और शर्त जोड़ना चाहते हैं तो यह काम नहीं करता है। और इसका मतलब यह है कि आप जिन सभी चरों का परीक्षण करना चाहते हैं उन्हें स्क्रिप्टलेट में घोषित किया जाना चाहिए, या अनुरोध में रखा जाना चाहिए, या सत्र (pageContext वैरिएबल .tag फाइलों में उपलब्ध नहीं है)।

  2. आप स्ट्रिंग के खिलाफ तुलना कर सकते हैं:

    <c:when test="${dp.status == 'VALID'}">

    यह साफ दिखता है, लेकिन आप एक स्ट्रिंग है enum मूल्य डुप्लिकेट और संकलक द्वारा मान्य नहीं किया जा सकता शुरू कर रहे हैं। इसलिए यदि आप उस मान को enum से हटाते हैं या उसका नाम बदलते हैं, तो आप नहीं देखेंगे कि कोड का यह हिस्सा अब और उपलब्ध नहीं है। आपको मूल रूप से प्रत्येक बार कोड के माध्यम से खोज/प्रतिस्थापन करना होता है।

  3. आप पेज संदर्भ में उपयोग करने enum मूल्यों में से प्रत्येक में जोड़ सकते हैं:

    <c:set var="VALID" value="<%=Status.VALID%>"/>

    और फिर आप यह कर सकते हैं:

    <c:when test="${dp.status == VALID}">

मैं पसंद अंतिम विकल्प (3), भले ही यह एक स्क्रिप्टलेट का भी उपयोग करता है। ऐसा इसलिए है क्योंकि जब आप मान सेट करते हैं तो यह केवल इसका उपयोग करता है। बाद में आप इसे अन्य ईएल स्थितियों के साथ, अधिक जटिल ईएल अभिव्यक्तियों में उपयोग कर सकते हैं। विकल्प (1) में आप test में एक when टैग की विशेषता में एक स्क्रिप्टलेट और ईएल अभिव्यक्ति का उपयोग नहीं कर सकते हैं।

+1

विकल्प 2 के संबंध में, कंपाइलर इसे सत्यापित नहीं कर सकता है, लेकिन रनटाइम पर स्ट्रिंग को 'Enum.valueOf (कक्षा <T> enumType, स्ट्रिंग नाम) का उपयोग करके एक enum में परिवर्तित कर दिया जाएगा, जो enum के पास स्थिर नहीं होने पर' ELException' को ट्रिगर करेगा ' उस नाम के साथ। अभिव्यक्ति हमेशा झूठी नहीं होगी। 13 jun. 142014-06-13 13:55:34


-2

जावा क्लास में:

public class EnumTest{ 
    //Other property link 
    private String name; 
    .... 

     public enum Status { 
       ACTIVE,NEWLINK, BROADCASTED, PENDING, CLICKED, VERIFIED, AWARDED, INACTIVE, EXPIRED, DELETED_BY_ADMIN; 
      } 

     private Status statusobj ; 

    //Getter and Setters 
} 

तो अब POJO और enum obj बनाई गई है। अब EnumTest आप सर्वलेट या नियंत्रक वर्ग session.setAttribute ("enumTest", EnumTest) में सत्र ऑब्जेक्ट में सेट करेंगे;

JSP पृष्ठ में

<c:if test="${enumTest.statusobj == 'ACTIVE'}"> 

//TRUE??? THEN PROCESS SOME LOGIC 

5

यहाँ दो अधिक संभावनाएं हैं:

JSP ईएल 3.0 स्थिरांक

जब तक आप कम से कम संस्करण ईएल की 3.0 का उपयोग कर रहे तो आप कर सकते हैं निम्नानुसार आपके पृष्ठ में आयात स्थिरांक:

<%@ page import="org.example.Status" %> 
<c:when test="${dp.status eq Status.VALID}"> 

हालांकि, कुछ आईडीई अभी तक यह नहीं समझते हैं (उदा। IntelliJ) इसलिए यदि आप रनटाइम तक टाइपो बनाते हैं तो आपको कोई चेतावनी नहीं मिलेगी।

उचित आईडीई समर्थन मिलने के बाद यह मेरी पसंदीदा विधि होगी।

हेल्पर तरीके

आप बस अपनी enum करने के लिए ही टिककर खेल जोड़ सकते हैं।

public enum Status { 
    VALID("valid"), OLD("old"); 

    private final String val; 

    Status(String val) { 
    this.val = val; 
    } 

    public String getStatus() { 
    return val; 
    } 

    public boolean isValid() { 
    return this == VALID; 
    } 

    public boolean isOld() { 
    return this == OLD; 
    } 
} 
फिर अपने JSP में

:

<c:when test="${dp.status.valid}"> 

यह सब IDEs में समर्थित है और यह भी अगर आप अभी तक ईएल 3.0 उपयोग नहीं कर सकते काम करेंगे। इस समय मैं यही करता हूं क्योंकि यह मेरे तर्क में लपेटकर सभी तर्क रखता है।

यह भी सावधान रहें कि एनम को नल रखने के लिए यह संभव है या नहीं। आपको लगता है कि पहले की जांच करने के यदि आपका कोड गारंटी नहीं है कि यह शून्य नहीं है की आवश्यकता होगी:

<c:when test="${not empty db.status and dp.status.valid}"> 

मुझे लगता है कि इस विधि उन जहां JSP में एक मध्यस्थ के मूल्य निर्धारित करने के लिए बेहतर है, क्योंकि आप क्या करना है कि प्रत्येक पृष्ठ पर जहां आपको enum का उपयोग करने की आवश्यकता है। हालांकि, इस समाधान के साथ आपको केवल एक बार गेटटर घोषित करने की आवश्यकता है।

+1

"जेएसपी ईएल 3.0 कॉन्स्टेंट्स" भाग स्वीकार्य उत्तर होना चाहिए क्योंकि यह अंतर्निहित कार्यक्षमता का उपयोग करके आवश्यक परिणाम प्राप्त करने का मानक तरीका है। एक तरफ ध्यान दें, इंटेलिज आईडीईए (कम से कम अंतिम संस्करण 2017.2.4) बॉक्स के बाहर इसका समर्थन करता है और जब आप '$ {MyEnum।} टाइप करते हैं तो उपलब्ध स्थिरांक की सूची दिखाता है, डॉट के बाद दाएं दाएं रखें और 'Ctrl + स्पेस 'सुझाव दिखाने के लिए। 13 sep. 172017-09-13 22:59:22


1

एक एमवीसी ढांचे का उपयोग करते समय मैंने अपने नियंत्रक में निम्नलिखित डाल दिया।

request.setAttribute(RequestParameterNamesEnum.INBOX_ACTION.name(), RequestParameterNamesEnum.INBOX_ACTION.name()); 

यह मुझे मेरे जेएसपी पेज में निम्नलिखित का उपयोग करने की अनुमति देता है।

<script> var url = 'http://www.nowhere.com/?${INBOX_ACTION}=' + someValue;</script> 

यह भी अपनी तुलना

<c:when test="${someModel.action == INBOX_ACTION}"> 

कौन सा मैं एक स्ट्रिंग शाब्दिक में डालने से अधिक पसंद करते हैं में इस्तेमाल किया जा सकता है।