سؤال

لنفترض لدي العلامة المخصصة التي تأخذ على قائمة من الجمل:

<%@ attribute name="thelist" type="java.util.List&lt;java.lang.String&gt;"
    required="true" %>

وكيف يمكنني إنشاء هذه السمة في التخطيط الاستراتيجي المشترك الذي يستدعي العلامة؟ I يمكن استخدام scriptlet

<tags:list thelist='<%= java.util.Arrays.asList("blah","blah2") %>' />

ولكن هل هناك أي طريقة للقيام بذلك باستخدام لغة التعبير، لأن الذي يبدو أنه يفضل؟

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

المحلول

وإذا كان كل ما تريد القيام به هو إنشاء قائمة، ثم يمكنك استخدام [<jsp:useBean>][1] لإنشاء الكائن في نطاق المطلوب:

<jsp:useBean id="thelist" scope="request" class="java.util.ArrayList" />

وهذا يعمل لديه ArrayList منشئ عدم وسائط. ومع ذلك، فإن القائمة ليس لديها أي شيء في ذلك. وبقدر ما أعرف، لا EL ولا JSTL توفير آلية داخلية لإضافة عناصر إلى مجموعة - انهم ركز على حد سواء على حق الوصول للقراءة فقط. أفترض أنك يمكن أن تعريف ظيفة رسم الخرائط EL لتمكين طريقة add().

ومع ذلك، أعتقد أنك أفضل حالا لا تحاول فرض JSP أن تفعل شيئا أنه لا يريد القيام به. في هذه الحالة، وهذا يعني أنه بدلا من استخدام tagfile JSP، يجب أن تكتب معالج بطاقة الفعلي في جاوة.

نصائح أخرى

kdgregory يقول ، هل يمكن أن تفعل ذلك مع <ل أ href = "http://java.sun.com/javaee/5/docs/tutorial/doc/bnahq.html#bnaio" يختلط = "نوفولو noreferrer"> وظائف مكتبة العلامة المخصصة ، على الرغم من أنها لن كن جميلا. على سبيل المثال، شيء من هذا القبيل:

#{foo:add(foo:add(foo:add(foo:newList(), 'One'), 'Two'), 'Three')}

وأنت مجرد الوقوع في حدود ما اصطلح على تسميته في أبسط من الممكن التعبير اللغة .

وسيكون من الأسهل القيام بذلك عن طريق بعض آلية أخرى، مثل الفول.

إذا كنت ترغب في تجنب scriptlet أو وظائف EL قبيحة، هل يمكن استخدام لكم باني الخاصة وخداع مترجم EL:

...

<jsp:useBean id="listBuilder" class="com.example.ELListBuilder"/>

<ul>
  <c:forEach var="item" items="${listBuilder['red']['yellow']['green'].build}">
      <li>${item}</li>
  </c:forEach>
</ul>

...

وتحقق المثال هنا: https://gist.github.com/4581179

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top