ui:组合隐藏h:表单参数enctype

时间:2015-07-16 10:08:45

标签: jsf facelets multipartform-data composition

我对ui:compositionh: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>

1 个答案:

答案 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>