<t:PanelTabbedPane> 内で <t:inputFileUpload> を使用すると、<t:message> が正しく表示されません。
-
09-06-2019 - |
質問
JSP ページで、 <h:form enctype="multipart/form-data">
いくつかの要素があります: <t:inputText>
, <t:inputDate>
, 、など。また、いくつか追加しました <t:message for="someElement">
そして、ユーザーがフォーム内で複数のファイルを(一度に1つずつ)アップロードできるようにしたいと思いました(使用 <t:inputFileUpload>
)この時点で、私のコードは正常に動作します。
フォームを内部に入れようとすると頭痛が起こります <t:panelTabbedPane serverSideTabSwitch="false">
(したがってもちろん、 <t:panelTab>
)
TabbedPane サンプルのソース コードに示されている構造を次からコピーしました。 トマホークの例, を使用して、 <f:subview>
タグを作成し、panelTab タグを新しい JSP ページ内に配置します (使用 <jsp:include page="somePage.jsp">
指令)
まず第一に、 <t:inputFileUpload>
マネージドBeanのUploadedFile属性に割り当てられた値でファイルをロードできません #{myBean.upFile}
それから、 手がかりを求めてグーグルする, 、それは知っていました <t:panelTabbedPane>
「autoform」と呼ばれるフォームを生成するため、ネストされたフォームが取得されていました。OK、作成を修正しました <h:form>
の外へ <t:panelTabbedPane>
そしてエウレカ!ファイル入力が再び機能しました。(オートフォームは生成されません)
しかし、ああ、驚いた!ああ、恐ろしいマーフィーの法則!全部私の <h:message>
失敗し始めます。Eclipse コンソールの出力には、次のことがすべて表示されます。 <t:message>
存在しない要素 ID を探しています (探している ID と部分的に同じ ID を持っていますが、ID の最後で名前が変わります)。
この時点で、私は <t:mesagges>
タグ (末尾の「s」に注意してください) を使用して、パネルの先頭にすべての検証エラーを一度に表示すると、正常に動作します。したがって、検証エラーが存在し、パネルの先頭に正しく表示されます。
このページで生成されるすべての検証エラー メッセージは、JSF 組み込み検証メッセージです。現時点ではバッキング Bean にはバリデータが定義されていません。
¿どうすれば入手できますか <t:message for="xyz">
正常に動作していますか?
私は、アプリケーションサーバーとして Geronimo を使用した Eclipse Ganymede プロジェクトで、Tomahawk-1.1.6 と myFaces-impl-1.2.3 を使用しています (Geronimo は、myFaces jar 実装を提供し、トマホーク jar を WEB-INF/lib フォルダーに置きます)応用)
「解決済み」:この問題は、myFaces フォーラムに報告された問題です。
すぐに返答と情報を提供してくれた Kyle Renfro に感謝します。(頑張れカイル!)問題を参照してください
編集1
1.- すぐに返答してくれた Kyle Renfro に感謝します。input要素内で使用されるforceID属性は、最初は機能しませんが、非常にトリッキーな調整を行うことで、 <t:message for="xyz">
タグは機能します。
私がやったことは次のとおりです。
1.私のタグを持っている <inputText id="name" forceId="true" required="true">
の <t:message>
機能しません。
2.次に、Eclipse コンソールでエラー メッセージを確認した後、「id」属性の名前を次のように変更しました。<inputText id=名前j_id_1"forceId="true" required="true">
3.そうして <t:message>
うまくいきました!!ただし、フォームの「送信」ボタンを二度押した後です。2回目!(JSFライフサイクルで何かが起こっているのではないかと思われます)
4.これは、ページ上のエラー メッセージを取得するには、ユーザーが送信ボタンを 2 回押す必要があることを意味します。
5.ID の末尾に「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
カイル・レンフロのフォローアップへの反応:
カイルはこう言います。
「ページの最初のビューで、inputText に何も入力せず、ファイルもアップロードしない状態で [CREATE TICKET] ボタンを押した場合、inputText に対してメッセージ タグは機能しますか?(すなわち。required = true) inputText のメッセージは機能しているが、inputFileUpload のメッセージは機能していないのかどうかが気になります。」
見つかった動作は次のとおりです。
1.- 検証エラー メッセージがまったく表示されません (メッセージ タグが機能しません) 検証エラー メッセージを 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"
生成された ID の単語 (たとえば、ID「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 ページを表示すると、ID 名が次のようになっていることがわかりました (「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 ページをメイン ページにコピーして戻します。
他のヒント
の 強制ID トマホーク コンポーネントの属性により、この問題は解決されるはずです。
何かのようなもの:
<t:outputText id="xyz" forceId="true" value="#{mybean.stuff}"/>
ページの最初のビューで、inputText に何も入力せず、ファイルもアップロードしない状態で [CREATE TICKET] ボタンを押した場合、inputText に対してメッセージ タグは機能しますか?(すなわち。required = true) inputTexts のメッセージは機能しているが、inputFileUpload のメッセージは機能していないのかどうかが気になります。