<t:message> отображается неправильно при использовании <t:inputFileUpload> внутри <t:PanelTabbedPane>
-
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 обратно на главную страницу.
Другие советы
А идентификатор силы Атрибут компонентов томагавка должен решить эту проблему.
что-то вроде:
<t:outputText id="xyz" forceId="true" value="#{mybean.stuff}"/>
При первом просмотре страницы, если вы нажмете кнопку «СОЗДАТЬ БИЛЕТ» без каких-либо входных текстов и без загруженных файлов, работают ли теги сообщений для входных текстов?(т.е.требуется = true) Мне просто интересно, работают ли сообщения для inputTexts, а сообщение для inputFileUpload — нет.