<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 предоставляет мне реализацию jar myFaces, в то время как я помещаю jar томагавка в папку WEB-INF/lib приложение)


«РЕШЕНО»:Об этой проблеме сообщили на форуме myFaces.

Спасибо Кайлу Ренфро за скорый ответ и информацию.(Хорошая работа, Кайл!)Посмотреть проблему


РЕДАКТИРОВАТЬ 1

1.- Спасибо Кайлу Ренфро за быстрый ответ.Атрибут ForceID, используемый внутри элемента ввода, поначалу не работает, но, проделав несколько очень хитрых настроек, я смог сделать <t:message for="xyz"> теги работают.

Я сделал следующее:
1.Имея свой тег <inputText id="name" forceId="true" required="true"> А <t:message> не работает.
2.Затем, просмотрев сообщения об ошибках на консоли eclipse, я переименовал свой атрибут «id» в это:<inputText id="namej_id_1"forceId="true" требуется="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

Об ответе на комментарий Кайла Ренфро:

Кайл говорит:

«При первом просмотре страницы, если вы нажмете кнопку «СОЗДАТЬ БИЛЕТ» без каких-либо входных текстов и без загруженных файлов, работают ли теги сообщений для входных текстов?(т.е.требуется = true) Мне просто интересно, работают ли сообщения для inputTexts, а сообщение для 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 и томагавка.Я бы удалил функцию подпредставления в качестве быстрого теста — скопируйте страницу 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;

При первом просмотре страницы, если вы нажмете кнопку «СОЗДАТЬ БИЛЕТ» без каких-либо входных текстов и без загруженных файлов, работают ли теги сообщений для входных текстов?(т.е.требуется = true) Мне просто интересно, работают ли сообщения для inputTexts, а сообщение для inputFileUpload — нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top