我对ui:composition
和h:form
参数enctype="multipart/form-data"
有疑问。
当h:form
嵌套在ui:compostion
时,h:inputFile
会抛出:
javax.servlet.ServletException: The request content-type is not a multipart/form-data
当我将h:inputFile
放在没有ui:composition
的JSF页面上时,它可以正常工作。
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head>
<title>Power Consumption</title>
</h:head>
<h:body>
<ui:composition template="./resources/templates/dashboardTemplate.xhtml">
<ui:define name="content">
<h:form id="pcForm" enctype="multipart/form-data">
<h2>
Power Consumption
</h2>
<br/>
<h:outputLabel value="Upload CSV"/>
<h:inputFile id="file" value="#{powerConsumption.file}"/>
<h:commandButton value="Upload" action="#{powerConsumption.upload()}"/>
<br/>
<h:inputTextarea value="#{powerConsumption.fileContent}" rows="30" cols="80"/>
</h:form>
</ui:define>
</ui:composition>
</h:body>
dashboardTemplate.xhtml
<h:body>
<div id="top">
<ui:insert name="top">Welcome to Information Resource Manager 2</ui:insert>
</div>
<div id="content" class="center_content">
<ui:insert name="content">Content</ui:insert>
</div>
<div id="bottom">
<ui:insert name="bottom">Powered by Java</ui:insert>
</div>
</h:body>
答案 0 :(得分:0)
当h:form嵌套在ui:compostion中时,h:inputFile抛出:
javax.servlet.ServletException:请求内容类型不是multipart / form-data
此代码段不在MVCE flavor中,因此问题的原因在目前发布的信息中不可见,但症状至少强烈暗示主模板周围有另一个<h:form>
<ui:insert>
。这反过来意味着你的JSF组件树最终在Facelets模板完成它的工作之后组成(即当你想到所有那些在这方面实际上不相关的<ui:xxx>
模板标签时):
<h:form>
<h:form enctype="multipart/form-data">
<h:inputFile />
</h:form>
</h:form>
因此是嵌套表格。嵌套表单在HTML中为illegal。浏览器行为未指定。在您的特定情况下,浏览器显然使用外部表单来处理POST请求。这不是JSF / Facelets问题。您自己负责以编写JSF代码的方式生成合法的HTML输出(可以通过右键单击,浏览器中的查看源来查看)。 E.g。
<h:form enctype="multipart/form-data">
<h:inputFile />
</h:form>
<h:form>
[another content here which requires a form]
</h:form>