هل يمكنني استخدام Hashtable في تعبير EL موحد على علامة c:forEach باستخدام JSF 1.2 مع JSP 2.1؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

لدي Hashtable<Integer, Sport> يسمى sportMap وقائمة من معرفات الرياضة (List<Integer> sportIds) من حبة الدعم الخاصة بي.يحتوي كائن الرياضة على قائمة معدات List<String>.هل يمكنني القيام بما يلي باستخدام EL الموحد للحصول على قائمة المعدات الخاصة بكل رياضة؟

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
  <c:forEach items="#{bean.sportMap[_sportId].equipmentList}" var="_eqp">
    <h:outputText value="#{_eqp}"></h:outputText>
    <br/>
  </c:forEach>
</h:dataTable>

أحصل على الاستثناء التالي عند محاولة تشغيل كود JSP هذا.

 15:57:59,438 ERROR [ExceptionFilter] exception root cause
javax.servlet.ServletException: javax.servlet.jsp.JspTagException: 
      Don't know how to iterate over supplied "items" in &lt;forEach&gt;

هذه نسخة مطبوعة من بيئتي

Server: JBossWeb/2.0.1.GA
Servlet Specification: 2.5
JSP version: 2.1
JSTL version: 1.2
Java Version: 1.5.0_14

ملحوظة:ما يلي يعمل باستخدام علامة JSF.يقوم بطباعة قائمة المعدات لكل رياضة محددة في قائمة المعرفات الرياضية.

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
    <h:outputText value="#{bean.sportMap[_sportId].equipmentList}">
    </h:outputText>
</h:dataTable>

أرغب في استخدام العلامة c:forEach.هل يعرف أحد إن كان هذا ممكنا؟إذا لم يكن الأمر كذلك، أي شخص لديه اقتراحات؟في النهاية أريد قائمة مكدسة بدلاً من القائمة المفصولة بفواصل التي توفرها EquipmentList.toString();(أيضًا، لا تريد تجاوز toString()).

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

المحلول

@keith30xi.myopenid.com

غير صحيح في JSF 1.2.بحسب ال الأسئلة الشائعة حول Java.net ويكي يجب أن يعملوا معًا كما هو متوقع.

فيما يلي مقتطف من كل الأسئلة الشائعة:

الأسئلة الشائعة حول JSF 1.1
س.هل تتفاعل علامات JavaServer Faces مع علامات JSTL الأساسية، forEach، إذا، اختر ومتى؟

أ.لا تعمل علامة Foreach مع Javaserver Face Technology ، الإصدار 1.0 و 1.1 علامات بسبب عدم التوافق بين الاستراتيجيات التي تستخدمها JSTL و Javaserver Faces Technology.بدلاً من ذلك، يمكنك استخدام عارض، مثل عارض الجدول الذي تستخدمه علامة dataTable، والذي يقوم بإجراء التكرار الخاص به.تعمل علامات if واختيار ومتى، ولكن يجب أن تحتوي علامات JavaServer Faces المتداخلة ضمن هذه العلامات على معرفات صريحة.

تم إصلاح هذا العيب في JSF 1.2.

الأسئلة الشائعة حول JSF 1.2
س.هل تتفاعل علامات JavaServer Faces مع علامات JSTL الأساسية، forEach، إذا، اختر ومتى؟

أ.نعم.هناك ميزة جديدة في JSP 2.1، تسمى JSP Id Consumer، تسمح لهذه العلامات بالعمل كما هو متوقع.

هل استخدم أي شخص علامات JSF مع علامات JSTL الأساسية خصيصًا لكل منها؟

نصائح أخرى

لقد واجهت نفس المشكلة مرة واحدة، ولم أتمكن من إيجاد حل باستخدام dataTable.المشكلة هي أن فار _sportId يمكن قراءتها فقط بواسطة مكون dataTable.

إذا كنت بحاجة إلى تنفيذ حلقة داخل حلقة، فيمكنك استخدام dataTable داخل dataTable:

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
  <h:dataTable value="#{bean.sportMap[_sportId].equipmentList}" var="_eqp">
    <h:outputText value="#{_eqp}"></h:outputText>
  </h:dataTable>
</h:dataTable>

ولكن في هذه الحالة، تتم طباعة كل عنصر من عناصر قائمة المعدات الخاصة بك داخل صف الجدول.لم يكن حلاً رائعًا مني.

اخترت استخدام جدول html عادي بدلاً من dataTable:

<table>
    <c:forEach items="#{bean.sportIds}" var="_sportId">
      <tr>
        <td>
        <c:forEach items="#{bean.sportMap[_sportId].equipmentList" var="_eqp">
            <h:outputText value="#{_eqp} " />
        </c:forEach>
        </td>
      </tr>
    </c:forEach>
</table>

إنها تعمل.إذا كنت بحاجة إلى بعض وظائف dataTable المحددة مثل الربط وتعيين الصفوف، فيمكنك الحصول عليها بطريقة سهلة باستخدام ملف f:setPropertyActionListener بطاقة شعار.

مسألتان:

  1. يمكن أن يحتوي dataTable على العناصر الفرعية التالية فقط:واجهة الرأس، واجهة التذييل، العمود.أي شيء آخر لن يتم تقييمه بشكل صحيح.
  2. لا يمكن تشابك علامات JSTL مع مكونات JSF.يتم تقييم علامات JSTL عند إنشاء شجرة المكونات.يتم تقييم مكونات JSF عند عرض الصفحة.ومن ثم، يتم تقييم علامة c:forEach مرة واحدة فقط - عند إنشاء شجرة المكونات، وهو ما يحدث على الأرجح قبل توفر "#{bean.sportIds}".

إما أن تستخدم مكتبة مكونات JSF التي توفر التكرار كما تريد، أو أنشئ مكتبة تقوم بالتكرار الذي تريده، أو أعد بناء الفاصوليا بحيث بدلاً من التكرار فوق معرفات الرياضة، قم بالتكرار فوق قائمة الرياضات حيث يكون لكل رياضة معرفها ومعداتها .

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