تعيين سمة بشكل مشروط على عنصر باستخدام مستندات JSP (JSPX)

StackOverflow https://stackoverflow.com/questions/157005

  •  03-07-2019
  •  | 
  •  

سؤال

في نماذج HTML، يمكن تعطيل الأزرار عن طريق تحديد السمة "معطل" عليها بأي قيمة:

<button name="btn1" disabled="disabled">Hello</button>

إذا تم تمكين زر ما، فيجب ألا تكون السمة موجودة لأنه لا توجد قيمة محددة يمكن تعيين السمة المعطلة عليها مما يؤدي إلى ترك الزر ممكنًا.

هذا يسبب لي مشاكل عندما أرغب في تمكين/تعطيل الأزرار عند استخدام مستندات JSP (jspx).نظرًا لأن مستندات JSP يجب أن تكون مستندات XML جيدة الصياغة، لا أستطيع رؤية أي طريقة لتضمين هذه السمة بشكل مشروط، لأن شيئًا مثل ما يلي غير قانوني:

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

بينما يمكنني تكرار العلامة مرتين باستخدام علامة JSTL if للحصول على التأثير المطلوب، في حالتي المحددة لدي أكثر من 15 سمة معلنة على الزر (الكثير من سمات معالج أحداث جافا سكريبت لـ AJAX) لذا فإن تكرار العلامة سيؤدي إلى JSP فوضوي للغاية.

كيف يمكنني حل هذه المشكلة دون التضحية بسهولة قراءة JSP؟هل هناك أي علامات مخصصة يمكنها إضافة سمات إلى الأصل من خلال معالجة مخرجات DOM؟

هل كانت مفيدة؟

المحلول

وأنا استخدم مخصص JSP العلامة مع المواصفات الديناميكية. يمكنك استخدام مثل هذا:

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

وأساسا، ما هذه العلامة يفعله هو توليد عنصر XML مع elementName ويضع كل الصفات موجودة في العلامة، ولكن يتخطى تلك فارغة.

العلامة نفسها من السهل جدا لتنفيذ وتطبيق بلدي هو مجرد خطوط 44 طويلة.

نصائح أخرى

يمكنك استخدام ال <jsp:text> علامة لحل هذه المشكلة باستخدام XML صالح:

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

من الواضح أن هذا أكثر تفصيلاً من بعض الحلول الأخرى.ولكنها مكتفية ذاتيا تماما:لا توجد علامات مخصصة مطلوبة.كما أنه المقاييس بسهولة إلى العديد من السمات التي تحتاج إليها.

وalex حل كبير لاستخدام مشغل الثلاثي. أود أن أضيف بعض بلدي على سبيل المثال، أنه بفضل لكم، وأنا مجرد تغيير النتيجة من الشرط، إذا كان هذا صحيحا، ويكتب السمة، وإلا لم أكتب شيئا

ولملء القائمة وحدد القيمة المستخدمة، وتجنب ج: إذا

<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' : ''} />

وأعتقد لقد مر بعض الوقت منذ آخر مشاركة في هذا، ولكن خطرت لي مقابل نفس المشكلة بالضبط مع به <select><option selected="selected">، أي إعلان حيوي الخيار الذي تم تحديده. لحل هذا واحد قدم لي ل Tagx مخصص؛ نشرت لي تفاصيل أكثر في الإجابة هنا

وجئت إلى استنتاج مفاده أن لا يوجد طريق مختصر لطيف؛ يمكن EL وJSP تعبيرات موجودة فقط داخل سمات عنصر XML (وفي محتوى الجسم). ولذلك عليك أن تفعل ما يلي؛

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

وعن طريق تدوين scriptlet لن تعمل لوثائق JSP (.jspx)

وقراءة حول التخطيط الاستراتيجي المشترك لjspx تحويل جئت عبر <jsp:element> و<jsp:attribute> العلامات. إذا فهمت ذلك بشكل صحيح يجب أن تكون قادرة على القيام شيء من هذا القبيل

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

وولها قوة المحرك التخطيط الاستراتيجي المشترك

<button someAttribute="value"/>

وأو شيء من هذا القبيل. المشكلة الوحيدة، وأشار في الصفحة أعلاه، هو أن هذا لا يبدو أن تعمل بشكل جيد مع ثوابت الشرطية. عمل مؤلف من تحويل حول أن خلق بعض العلامات المساعد، والتي يمكنك إلقاء نظرة على تحميل الشفرة المصدرية أعتقد. نأمل أن يساعد.

تأكد مكتبة العلامة (.tagx) ثم استخدام علامة scriptlet.

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>

نعم هذا هو الغش ... لكنه يحصل على هذه المهمة. بالإضافة يمكنك القيام العودية معقدة سيئة حقا لهياكل شجرة بهذه الطريقة.

وأنا أيضا نشر حل آخر على بلدي بلوق وgist.github يستخدم مجموعة من المكتبات ل Tagx: <لأ href = "http://adamgent.com/post/8083703288/conditionally-set-an-attribute-on- و-عنصر مع jspx "يختلط =" نوفولو "> http://adamgent.com/post/8083703288/conditionally-set-an-attribute-on-an-element-with-jspx

بناء الجملة <%= blah %> ليس XML قانونيًا مطلوبًا لمستندات JSP.لديك خياران:

  1. استبدال <%= (معطل)؟"عاجز" :"" %> مع <jsp.expression>(isDisabled) ؟"عاجز" :""</jsp.expression>
  2. استخدم Core taglib وEL (تأكد من وضع isDisabled في نطاق الصفحة) كما يلي:
<c:choose>
  <c:when test="${isDisabled}">"disabled"</c:when>
  <c:otherwise>""</c:otherwise>
</c:choose>

امل ان يساعد :)

ولقد تم للتو تعاني من نفس المشكلة. حاولت استخدام <jsp:attribute name="disabled"/> داخل <c:if>، ولكن المترجم يحاول إرفاق السمة المعوقين إلى العنصر 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" أو لا شيء على الإطلاق.

وسوف يعمل ذلك إلا إذا كنت تستخدم نوعا من taglib لتوليد زر، وعنصر العلامة يجب أن يدعم السمة المعوقين (يمر من خلال لعنصر HTML الأساسي). لا يمكنك استخدام jsp:attribute لإضافة سمة لعنصر HTML الخام.

وأنا لا حقا استخدام JSP (وقلت مرة واحدة، ثم حذفه عندما فهمت شيء "يجب كتبها XML صالح"). أنظف أستطيع الخروج مع هذا:

<% if (isDisabled) { %>
  <button name="btn1" disabled="disabled">Hello</button>
<% } else { %>
  <button name="btn1">Hello</button>
<% } %>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top