لا يتم عرض <t:message> بشكل صحيح عند استخدام <t:inputFileUpload> داخل <t:PanelTabbedPane>

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

  •  09-06-2019
  •  | 
  •  

سؤال

في صفحة JSP، قمت بإنشاء ملف <h:form enctype="multipart/form-data"> مع بعض العناصر: <t:inputText>, <t:inputDate>, ، إلخ.وأيضا أضفت بعض <t:message for="someElement"> وأردت السماح للمستخدم بتحميل عدة ملفات (ملفًا تلو الآخر) داخل النموذج (باستخدام <t:inputFileUpload> ) في هذه المرحلة يعمل الكود الخاص بي بشكل جيد.


يأتي الصداع عندما أحاول وضع النموذج داخل ملف <t:panelTabbedPane serverSideTabSwitch="false"> (وبالتالي بالطبع، داخل أ <t:panelTab> )

لقد قمت بنسخ البنية الموضحة في الكود المصدري لمثال TabbedPane من أمثلة على توماهوك, ، وذلك باستخدام <f:subview> العلامة ووضع علامة PanelTab داخل صفحة jsp جديدة (باستخدام <jsp:include page="somePage.jsp"> التوجيه)

أولا وقبل كل شيء، <t:inputFileUpload> فشل في تحميل الملف بالقيمة المعينة في سمة Managed Bean UploadedFile #{myBean.upFile}

ثم، البحث في جوجل عن فكرة, ، علمت ذلك <t:panelTabbedPane> ينشئ نموذجًا يسمى "النموذج التلقائي"، لذلك كنت أحصل على نماذج متداخلة.حسنًا، لقد أصلحت أن إنشاء <h:form> خارج ال <t:panelTabbedPane> ويوريكا!عمل إدخال الملف مرة أخرى!(لا يتم إنشاء النموذج التلقائي)

ولكن يا للمفاجأة!يا لقانون ميرفي الرهيب!كل ما عندي <h:message> يبدأ بالفشل.يُظهر لي مخرجات وحدة تحكم Eclipse كل ذلك <t:message> يبحثون عن معرفات العناصر غير الموجودة (الذين لديهم معرفاتهم جزئيًا تساوي ما يبحثون عنه، ولكن في نهاية المعرف تتغير أسمائهم)

في هذه المرحلة، أضع <t:mesagges> العلامة (لاحظ الحرف "s" في النهاية) لتظهر لي جميع أخطاء التحقق مرة واحدة في بداية اللوحة، وهي تعمل بشكل جيد.لذا، توجد أخطاء في التحقق وتظهر بشكل صحيح في بداية اللوحة.

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

¿كيف يمكنني الحصول على <t:message for="xyz"> تعمل بشكل صحيح؟


أنا أستخدم Tomahawk-1.1.6 مع myFaces-impl-1.2.3 في مشروع Eclipse Ganymede مع Geronimo كخادم تطبيق (يعطيني Geronimo تطبيق myFaces jar بينما أضع جرة tomahawk في المجلد WEB-INF/lib الخاص بـ طلب)


"تم حلها":تم الإبلاغ عن هذه المشكلة إلى منتدى myFaces.

شكرًا لكايل رينفرو على الاستجابة والمعلومات السريعة.(عمل جيد كايل!)انظر هذه القضية


تحرير 1

1.- شكرًا لكايل رينفرو على استجابته السريعة.لا تعمل سمة forceID المستخدمة داخل عنصر الإدخال في المرة الأولى، ولكن من خلال إجراء بعض التعديلات الصعبة للغاية، يمكنني إجراء <t:message for="xyz"> تعمل العلامات.

ما فعلته هو:
1.وجود علامتي <inputText id="name" forceId="true" required="true"> ال <t:message> لا يعمل.
2.بعد ذلك، بعد البحث عن رسائل الخطأ على وحدة تحكم Eclipse، قمت بإعادة تسمية السمة "id" الخاصة بي إلى هذا:<معرف نص الإدخال = "namej_id_1"forceId = "true" مطلوب = "صحيح">
3.ثم <t:message> عمل!!ولكن بعد الضغط على زر "إرسال" الخاص بالنموذج للمرة الثانية.المره الثانيه!(أظن أن شيئًا ما يحدث في دورة حياة JSF)
4.وهذا يعني أنه يتعين على المستخدم الضغط مرتين على زر الإرسال للحصول على رسائل الخطأ على الصفحة.
5.واستخدام عبارة "j_id_1" في نهاية المعرفات أمر غريب جدًا.


تحرير 2

حسنًا، إليك الرمز، آمل ألا يكون مزعجًا.

1.- mainPage.jsp (هنا <t:panelTabbedPane> و <f:subview> العلامات)

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>  
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>  
<%@ taglib prefix="t" uri="http://myfaces.apache.org/tomahawk"%>  
<html>  
<body>  
<f:view>  
<h:form enctype="multipart/form-data">  
<t:panelTabbedPane serverSideTabSwitch="false" >  

            <f:subview id="subview_tab_detail">  
                <jsp:include page="detail.jsp"/>  
            </f:subview>  

        </t:panelTabbedPane>  
    </h:form>  

</f:view>  
</body>  
</html>  


2.- التفاصيل.jsp (هنا <t:panelTab> بطاقة شعار)

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>  
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>  
<%@ taglib prefix="t" uri="http://myfaces.apache.org/tomahawk"%>  

<t:panelTab label="TAB_1">  
        <t:panelGrid columns="3">  
            <f:facet name="header">  
                <h:outputText value="CREATING A TICKET" />  
            </f:facet>  

            <t:outputLabel for="ticket_id" value="TICKET ID" />  
            <t:inputText id="ticket_id" value="#{myBean.ticketId}" required="true" />  
            <t:message for="ticket_id" />  

            <t:outputLabel for="description" value="DESCRIPTION" />  
            <t:inputText id="description" value="#{myBean.ticketDescription}" required="true" />
            <t:message for="description" />  

            <t:outputLabel for="attachment" value="ATTACHMENTS" />  
            <t:panelGroup>  
                <!-- This is for listing multiple file uploads -->  
                <!-- The panelGrid binding make attachment list grow as the user inputs several files (one at a time) -->  
                <t:panelGrid columns="3" binding="#{myBean.panelUpload}" />  
                <t:inputFileUpload id="attachment"  value="#{myBean.upFile}" storage="file" />  
                <t:commandButton value="ADD FILE" action="#{myBean.upload}" />  
            </t:panelGroup>  
            <t:message for="attachment" />  

            <t:commandButton action="#{myBean.create}" value="CREATE TICKET" />  
        </t:panelGrid>  
</t:panelTab>  

تحرير 3

ردًا على متابعة كايل رينفرو:

كايل يقول:

"في العرض الأول للصفحة، إذا ضغطت على الزر "إنشاء تذكرة" مع عدم وجود أي شيء في أي من نصوص الإدخال ولم يتم تحميل أي ملفات، فهل تعمل علامات الرسائل مع نصوص الإدخال؟(أي.مطلوب = صحيح) أشعر بالفضول فقط لمعرفة ما إذا كانت الرسائل الخاصة بنصوص الإدخال تعمل ولكن الرسالة الخاصة بـ inputFileUpload لا تعمل."

هنا هو السلوك وجدت:
1.- لا تظهر أي رسائل خطأ في التحقق على الإطلاق (علامات الرسائل لا تعمل) حتى عندما أحاول اختبار رسالة خطأ واحدة فقط في التحقق (على سبيل المثال، اختبار الرسالة لنص الإدخال الأول) لا يظهر أي منها .
2.- تظهر لي وحدة تحكم Eclipse هذه الأخطاء الداخلية:

ERROR [HtmlMessageRendererBase] Could not render Message. Unable to find component 'ticket_id' (calling findComponent on component 'j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:j_id_jsp_1716158401_5j_id_1'). If the provided id was correct, wrap the message and its component into an h:panelGroup or h:panelGrid.  
ERROR [HtmlMessageRendererBase] Could not render Message. Unable to find component 'description' (calling findComponent on component 'j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:j_id_jsp_1716158401_8j_id_1'). If the provided id was correct, wrap the message and its component into an h:panelGroup or h:panelGrid.  
ERROR [HtmlMessageRendererBase] Could not render Message. Unable to find component 'attachment' (calling findComponent on component 'j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:j_id_jsp_1716158401_14j_id_1'). If the provided id was correct, wrap the message and its component into an h:panelGroup or h:panelGrid.  

وهنا عندما رأيت "j_id_1" كلمة في المعرفات التي تم إنشاؤها، على سبيل المثال، للمعرف "ticket_id":

j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:j_id_jsp_1716158401_5j_id_1

وعند عرض صفحة HTML الناتجة، رأيت أن أسماء المعرفات هي مثل هذا (بدون استخدام سمة "ForceId"):

<input id="j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:ticket_idj_id_1" name="j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:ticket_idj_id_1">  

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

المحلول

يبدو أنه قد يكون مرتبطًا بخلل في myfaces.هناك إصدار أحدث من myfaces وtomahawk يمكنك تجربته.أود إزالة وظيفة العرض الفرعي كاختبار سريع - انسخ صفحةdetail.jsp مرة أخرى إلى الصفحة الرئيسية.

https://issues.apache.org/jira/browse/MYFACES-1807?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12567158#action_12567158

نصائح أخرى

ال معرف القوة سمة مكونات توماهوك يجب أن تحل هذه المشكلة.

شيء مثل:

&lt;t:outputText id="xyz" forceId="true" value="#{mybean.stuff}"/&gt;

في العرض الأول للصفحة، إذا ضغطت على الزر "إنشاء تذكرة" مع عدم وجود أي شيء في أي من نصوص الإدخال ولم يتم تحميل أي ملفات، فهل تعمل علامات الرسائل مع نصوص الإدخال؟(أي.مطلوب = صحيح) أشعر بالفضول فقط إذا كانت الرسائل الخاصة بنصوص الإدخال تعمل ولكن الرسالة الخاصة بـ inputFileUpload لا تعمل.

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