<t:PanelTabbedPane> 内で <t:inputFileUpload> を使用すると、<t:message> が正しく表示されません。

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

  •  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 ページをメイン ページにコピーして戻します。

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

他のヒント

強制ID トマホーク コンポーネントの属性により、この問題は解決されるはずです。

何かのようなもの:

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

ページの最初のビューで、inputText に何も入力せず、ファイルもアップロードしない状態で [CREATE TICKET] ボタンを押した場合、inputText に対してメッセージ タグは機能しますか?(すなわち。required = true) inputTexts のメッセージは機能しているが、inputFileUpload のメッセージは機能していないのかどうかが気になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top