1

在一个 JSP 页面中,我用一些元素创建<h:form enctype="multipart/form-data">了一个:.<t:inputText><t:inputDate><t:message for="someElement"><t:inputFileUpload>


当我尝试将表单放入 a <t:panelTabbedPane serverSideTabSwitch="false">(因此当然是放入 a <t:panelTab>) 时,头痛就来了

我从Tomahawk 的示例中复制了 TabbedPane 示例的源代码中显示的结构,方法是使用<f:subview>标签并将 panelTab 标签放在新的 jsp 页面中(使用<jsp:include page="somePage.jsp">指令)

首先,<t:inputFileUpload>无法以托管 Bean UploadedFile 属性中分配的值加载文件#{myBean.upFile}

然后,谷歌搜索线索,我知道它会<t:panelTabbedPane>生成一个名为“autoform”的表单,所以我得到了嵌套表单。<h:form>好的,我修复了创建<t:panelTabbedPane>和尤里卡的问题!文件输入再次起作用!(自动表单不生成)

但是,哦,惊喜!哦,可怕的墨菲定律!我的一切<h:message>开始失败。Eclipse 控制台的输出显示所有人<t:message>都在寻找不存在的元素 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 实现,而我将 tomahawk jar 放在应用)


“已解决”:此问题是向 myFaces 论坛报告的问题。

感谢 Kyle Renfro 的快速响应和信息。(干得好,凯尔!) 查看问题


编辑 1

1.- 感谢 Kyle Renfro 的快速回复。输入元素内使用的 forceID 属性第一次不起作用,但做一些非常棘手的调整可以使<t:message for="xyz">标签工作。

我所做的是:
1. 让我的标签<inputText id="name" forceId="true" required="true">The<t:message>不起作用。
2. 然后,在 Eclipse 控制台上查看错误消息后,我将我的“id”属性重命名为:<inputText id=" namej_id_1 " forceId="true" required="true">
3. 然后成功了<t:message>!但在第二次按下表单的“提交”按钮后。¡第二次!(我怀疑 JSF 生命周期中发生了一些事情)
4. 这意味着用户必须按两次提交按钮才能在页面上获取错误消息。
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.- detail.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

回应 Kyle Renfro 的后续行动:

凯尔 说:

“在页面的第一个视图中,如果您在任何 inputTexts 中都没有任何内容且没有上传文件的情况下按下“CREATE TICKET”按钮,那么消息标签是否适用于 inputTexts?(即,必需 = 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"在生成的 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">  

4

2 回答 2

1

战斧组件的forceId属性应该可以解决这个问题。

就像是:

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

在页面的第一个视图中,如果您在任何 inputTexts 中都没有任何内容且没有上传文件的情况下按下“CREATE TICKET”按钮,那么消息标签是否适用于 inputTexts?(即 required = true)我只是好奇 inputTexts 的消息是否正常,但 inputFileUpload 的消息是否正常。

于 2008-09-16T13:36:35.533 回答
0

看起来它可能与 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

于 2008-09-22T14:33:34.340 回答