在一个 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">