2008-10-01 14 views
15

HTML रूपों में, बटन किसी भी मूल्य के साथ, उन पर "अक्षम" विशेषता को परिभाषित करते हुए निष्क्रिय किया जा सकता के साथ एक तत्व पर एक विशेषता सेट सक्षम होना चाहिए, विशेषता मौजूद नहीं होनी चाहिए क्योंकि कोई परिभाषित मान नहीं है कि अक्षम विशेषता को सेट किया जा सकता है जिससे बटन सक्षम हो जाएगा।सशर्त JSP दस्तावेज (JSPX)

यह मुझे समस्याएं पैदा कर रहा है जब मैं जेएसपी दस्तावेज़ (जेएसपीएक्स) का उपयोग करते समय बटन को सक्षम/अक्षम करना चाहता हूं। JSP दस्तावेज अच्छी तरह से गठित XML दस्तावेज़ों होना जरूरी रूप में, मैं सशर्त इस विशेषता को शामिल की किसी भी तरह से, नहीं देख सकते हैं के रूप में निम्नलिखित की तरह कुछ कानूनी नहीं है:

<button name="btn1" <%= (isDisabled) ? "disabled" : "" %/> >Hello</button> 

मैं टैग को दोहराने सकता है दो बार का उपयोग कर एक जेएसटीएल अगर वांछित प्रभाव प्राप्त करने के लिए टैग, मेरे विशिष्ट मामले में मेरे पास बटन पर घोषित 15 से अधिक गुण हैं (AJAX के लिए जावास्क्रिप्ट ईवेंट हैंडलर विशेषताओं के बहुत सारे) इसलिए टैग को डुप्लिकेट करने से जेएसपी बहुत गन्दा हो जाएगा।

जेएसपी की पठनीयता को बलि किए बिना मैं इस समस्या को कैसे हल कर सकता हूं? क्या कोई कस्टम टैग है जो आउटपुट डीओएम में हेरफेर करके माता-पिता को गुण जोड़ सकता है?

उत्तर

9

मैं गतिशील विशेषताओं के साथ एक कस्टम जेएसपी टैग का उपयोग करता हूं। आप इसे इस तरह का उपयोग करें:

<util:element elementName="button" name="btn1" disabled="$(isDisabled ? 'disabled' : '')"/> 

असल में, क्या इस टैग करता elementName साथ एक XML तत्व उत्पन्न है और टैग में मौजूद सभी विशेषताओं डालता है, लेकिन खाली लोगों को छोड़ देता है।

टैग स्वयं लागू करने के लिए बहुत आसान है, मेरा कार्यान्वयन केवल 44 लाइन लंबा है।

+3

क्या आप इस के लिए कोड पोस्ट कर सकते हैं? मुझे लगता है कि यह बहुत ही निर्देशक होगा। –

+1

ऐसा लगता है कि यह सबसे अच्छा जवाब होगा जो मुझे मिलेगा, यह शर्म की बात है कि कस्टम टैग लिखने के बिना वैध XML वाक्यविन्यास के साथ ऐसा करने का कोई तरीका नहीं है ... – iainmcgin

+0

यदि आप JSP2X टूल देखते हैं, तो यह , , और (तत्व के शरीर के लिए) के लिए टैग छोड़ देता है। यह एक और विकल्प है जिसका उपयोग अधिक जटिल निर्माण के साथ किया जा सकता है। –

-2

मैं वास्तव में जेएसपी का उपयोग नहीं करता (और मैंने एक बार जवाब दिया, फिर मुझे "वैध एक्सएमएल द्वारा आवश्यक" चीज़ को समझने पर हटा दिया गया)। साफ मैं के साथ आ सकते हैं यह है:

<% if (isDisabled) { %> 
    <button name="btn1" disabled="disabled">Hello</button> 
<% } else { %> 
    <button name="btn1">Hello</button> 
<% } %> 
+0

के रूप में सवाल में कहा गया है, जबकि यह काम करेंगे मेसियर की तुलना में मैं चाहते हैं, अपवादभूत है अगर कथन की दो शाखाओं के बीच आम तौर पर 15+ विशेषताओं के साथ ly। – iainmcgin

0

<% = blah%> वाक्य रचना कानूनी JSP दस्तावेज़ के लिए आवश्यक एक्सएमएल नहीं है। आपके पास 2 विकल्प हैं:

  1. <% = (isDisabled) बदलें? "अक्षम": "" > <jsp.expression> (isDisabled) के साथ? मदद करता है कि
 
<c:choose> 
    <c:when test="${isDisabled}">"disabled"</c:when> 
    <c:otherwise>""</c:otherwise> 
</c:choose> 

आशा :)

: "अक्षम": "" </jsp.expression>
  • कोर taglib का प्रयोग करें और ईएल इसलिए की तरह (सुनिश्चित करें कि isDisabled बनाने पेज दायरे में डाल दिया है)
  • +0

    हालांकि इन टैग को कहां रखा जाएगा? आप अभी भी उन्हें बटन टैग के विशेषता अनुभाग में नहीं डाल पाएंगे, क्योंकि यह अभी भी अमान्य एक्सएमएल होगा, और उन्हें तत्व के अंदर रखने के परिणामस्वरूप कुछ सीडीएटीए जोड़े जायेंगे। – iainmcgin

    3

    स्वचालित jsp to jspx converter के बारे में पढ़ना मैं <jsp:element> और <jsp:attribute> टैग पर आया था। अगर मैं सही ढंग से समझते हैं कि आप की तरह

    <jsp:element name="button"> 
        <jsp:attribute name="someAttribute">value</jsp:attribute> 
    </jsp:element> 
    

    कुछ करने में सक्षम हो और jsp इंजन उत्पादन

    <button someAttribute="value"/> 
    

    या ऐसा ही कुछ होना चाहिए। उपरोक्त पृष्ठ में इंगित एकमात्र समस्या यह है कि यह सशर्त संरचनाओं के साथ अच्छी तरह से काम नहीं कर रहा है। कनवर्टर के लेखक ने कुछ सहायक टैग बनाने के लिए काम किया, जिसे आप अनुमान लगाते हुए स्रोत कोड डाउनलोड करने पर एक नज़र डाल सकते हैं। उम्मीद है की वो मदद करदे।

    +0

    वास्तव में, यह शायद और इसी तरह है। जेएसपी 2 एक्स उपकरण उन परिवर्तित जेएसपी फ़ाइलों में उपयोग के लिए आपके वेब-आईएनएफ में कस्टम टैग के रूप में लिखता है। –

    6

    आप इस समस्या को मान्य XML का उपयोग कर हल करने के लिए <jsp:text> टैग का उपयोग कर सकते हैं:

    <jsp:text><![CDATA[<button name="btn1"]]></jsp:text> 
        <c:if test="${isDisabled}"> disabled="disabled"</c:if> 
        > 
        Hello! 
    <jsp:text><![CDATA[</button>]]></jsp:text> 
    

    यह स्पष्ट रूप से कुछ अन्य समाधान की तुलना में अधिक वर्बोज़ है। लेकिन यह पूरी तरह से आत्मनिर्भर है: कोई कस्टम टैग आवश्यक नहीं है। इसके अलावा, यह स्केल आसानी से जितनी आवश्यक हो उतनी विशेषताओं के लिए।

    +0

    पोस्ट कर सकते हैं यदि आप डाउनवोट करते हैं, तो कृपया एक टिप्पणी छोड़ दें कि क्यों। इससे मुझे जवाब सुधारने का मौका मिलता है। –

    +0

    इस उत्तर पर इतने सारे डाउनवॉट्स, लेकिन वास्तव में कोई भी क्यों नहीं कह रहा है। :-( –

    +0

    मुझे नहीं पता कि किसी ने इस जवाब को क्यों कम किया है, लेकिन मुझे लगता है कि यह सबसे अच्छा तरीका है जो मुझे उपयुक्त बनाता है। –

    4

    मुझे लगता है कि इस पर आखिरी पोस्ट के बाद से कुछ समय बीत चुका है, लेकिन मैं <select><option selected="selected"> टैग के साथ एक ही समस्या के खिलाफ आया, यानी गतिशील रूप से यह घोषित किया गया कि कौन सा विकल्प चुना गया है। इसे हल करने के लिए मैंने कस्टम टैगक्स बनाया; मैंने विवरण answer here

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

    <c:choose> 
        <c:when test="${isDisabled}"><button name="btn1" disabled="disabled">Hello</button></c:when> 
        <c:otherwise><button name="btn1">Hello</button></c:otherwise> 
    </c:choose> 
    

    स्क्रिप्टलेट संकेतन का उपयोग JSP दस्तावेजों (.jspx)

    +0

    अहह लेकिन स्क्रिप्टलेट टैग काम करेगा http://code.google.com/p/jatl/wiki/JSPExample ... मैंने लाइब्रेरी को लिखा है (लिंक देखें)। –

    0

    मैं सिर्फ एक ही समस्या के साथ संघर्ष कर रहा है के लिए काम नहीं करेगा। मैंने <c:if> के अंदर <jsp:attribute name="disabled"/> का उपयोग करने का प्रयास किया, लेकिन संकलक अक्षम गुण को c:if तत्व में संलग्न करने का प्रयास करता है जो विफल रहता है। लेकिन मैंने पाया कि यह करता है काम (stripes:submit धारियों में प्रस्तुत प्रकार का एक बटन बनाने के लिए एक तत्व है):

    <stripes:submit name="process" value="Hello"> 
        <jsp:attribute name="disabled"> 
         <c:if test="${x == 0}">disabled</disabled> 
        </jsp:attribute> 
    </stripes:submit> 
    

    ऐसा लगता है कि jsp:attribute बिल्कुल एक विशेषता नहीं बनाएगा अगर शरीर केवल रिक्त स्थान हैं, तो आप ऐसा या तो disabled="disabled" या कुछ भी नहीं मिलता है।

    यह केवल तभी काम करेगा जब आप बटन उत्पन्न करने के लिए कुछ प्रकार के टैगलिब का उपयोग कर रहे हों, और टैग तत्व को अक्षम विशेषता का समर्थन करना चाहिए (इसे अंतर्निहित HTML तत्व से गुजरना)। कच्चे HTML तत्व में एक विशेषता जोड़ने के लिए आप jsp:attribute का उपयोग नहीं कर सकते।

    +1

    मेरे लिए काम नहीं करता है ... विशेषता तब भी बनाई जाती है जब टैग का शरीर खाली होता है। मुझे लगता है कि यह इसके प्रभाव पर निर्भर करता है जेएसपी आप उपयोग कर रहे हैं (मैं राल 3.0.24 का उपयोग कर रहा हूँ) – Shamu

    2

    टैग लाइब्रेरी (.tagx) बनाएं, फिर स्क्रिप्टलेट टैग का उपयोग करें।

    http://code.google.com/p/jatl/wiki/JSPExample

    <?xml version="1.0" encoding="UTF-8" ?> 
    <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"> 
    <jsp:directive.page import="com.googlecode.jatl.Html"/> 
    <jsp:directive.page import="com.evocatus.product.data.AttributeValue"/> 
    <jsp:directive.page import="com.evocatus.domain.Product"/> 
    
    <jsp:scriptlet> 
    //<![CDATA[ 
        final Product p = (Product) request.getAttribute("product"); 
         new Html(out) {{ 
          for (AttributeValue v : p.summaryAttributeValues()) { 
            p(); 
             strong().text(v.getLabel()).end(); 
             text(": " + v.getValue()); 
            endAll(); 
          } 
         }}; 
    //]]> 
    </jsp:scriptlet> 
    
    </jsp:root> 
    

    हाँ यह धोखा दे रही है देखें ... लेकिन यह काम किया जाता है। इसके अलावा आप इस तरह पेड़ संरचनाओं के लिए वास्तव में गंदा जटिल रिकर्सन कर सकते हैं। त्रिगुट ऑपरेटर का उपयोग करने के http://adamgent.com/post/8083703288/conditionally-set-an-attribute-on-an-element-with-jspx

    5

    @alex महान समाधान:

    मैं भी अपने ब्लॉग और gist.github पर एक और समाधान Tagx पुस्तकालयों का एक गुच्छा का उपयोग करता है तैनात।मैं अपना कुछ उदाहरण जोड़ता हूं, धन्यवाद, मैंने स्थिति के परिणाम को बदल दिया है, यदि सही है, तो विशेषता लिखती है, अन्यथा

    सूची को पॉप्युलेट करने और उपयोग किए गए मान का चयन करने के लिए, सी से बचने के लिए कुछ भी नहीं लिखते हैं:

    <select id="selectLang" name="selectLang" > 
    <c:forEach var="language" items="${alLanguages}" > 
        <option value="${language.id}" ${language.code == usedLanguage ? 'selected' : ''} >${language.description}</option> 
    </c:forEach> 
    

    पर ग से परहेज करने के लिए एक रेडियो बटन शुरू की जांच करने के: यदि:

    <input type="radio" id="id0" value="0" name="radio" ${modelVar == 0 ? 'checked' : ''} /> 
    <input type="radio" id="id1" value="1" name="radio" ${modelVar == 1 ? 'checked' : ''} /> 
    <input type="radio" id="id2" value="2" name="radio" ${modelVar == 2 ? 'checked' : ''} />