多部分表单:如何在JSP中的隐藏输入中发送和获取参数

多部分表单:如何在JSP中的隐藏输入中发送和获取参数,jsp,input,hidden,multipartform-data,Jsp,Input,Hidden,Multipartform Data,我有一个包含几个字段的多部分表单,这些字段的值需要发送到jsp文件 这是multipart表单,这是我发送参数的方式(在非multipart中,它可以完美地工作) 但是参数${param.name}与其他参数一起为null 我做错了什么?在JSP中使用MultipartData时,您可以执行以下操作 1) 声明web.xml webapp版本3.0 2) 使用@MultiPartConfig配置控制器 3) 将JSP中的Java代码移动到控制器servlet 4) 如果您想在servlet中获得

我有一个包含几个字段的多部分表单,这些字段的值需要发送到jsp文件

这是multipart表单,这是我发送参数的方式(在非multipart中,它可以完美地工作)

但是参数
${param.name}
与其他参数一起为
null


我做错了什么?

在JSP中使用MultipartData时,您可以执行以下操作

1) 声明web.xml webapp版本3.0
2) 使用@MultiPartConfig配置控制器
3) 将JSP中的Java代码移动到控制器servlet
4) 如果您想在servlet中获得该部分,请执行以下操作

Part mypart=request.getPart("Your Name Here")
mypart.getInputStream();
通过这种方式,您可以从JSP访问部件数据到servlet


如果您没有使用servlet 3.0及更高版本,则可以使用apache CommonFileUpload,我尝试使用
getPart()
,但它不起作用。我去了,它说我应该对上传的文件使用
getPart()
,但对其他输入字段使用
request.getParameter()
。 成功了! 我添加了以下代码:

final String name = request.getParameter("name");
        final String startdate = request.getParameter("startdate");
        final String deadline = request.getParameter("deadline");
        final String website = request.getParameter("website");
        final String termsnconds = request.getParameter("termsnconds");
并将其添加到查询中,以便在
insert to

<c:forEach var="picture" items="${pictures.rows}">
                <c:set var="competiname" value="<%= name %>"></c:set>
                <c:set var="competistartdate" value="<%= startdate %>"></c:set>
                <c:set var="competideadline" value="<%= deadline %>"></c:set>
                <c:set var="competiwebsite" value="<%= website %>"></c:set>
                <c:set var="competitermsnconds" value="<%= termsnconds %>"></c:set>
                <sql:update>
                    INSERT INTO Competition (name, id_picture, id_sponsor, start_date, deadline, websiteURL, termsnconds) VALUES (?, ?, ?, ?, ?, ?, ?);
                    <sql:param value="${competiname}" />
                    <sql:param value="${picture.id}" /> 
                    <sql:param value="${sessionScope.userid}" /> 
                    <sql:param value="${competistartdate}" />
                    <sql:param value="${competideadline}" />
                    <sql:param value="${competiwebsite}" />
                    <sql:param value="${competitermsnconds}" />
                </sql:update>   
            </c:forEach>

在竞赛中插入(姓名、id图片、id赞助商、开始日期、截止日期、网站URL、期限等)值(?,,,,,,,,,?);

但是我遇到了一个新问题,
type=“date”
的输入返回空值。。。我要检查一下,看看能不能买到什么东西。

我找到了一种方法,现在它工作得很好

显然,当我上传.parseRequest时,
多部分表单的所有参数都在里面,但我只得到上传的文件

为了获得其余的参数,我必须,首先,将它们插入到
迭代器
对象中,然后,按照表单中先前给定的名称获取它们中的每一个

<%
    String name = null ;
    String startdate = null;
    String deadline = null;
    String website = null;
    String termsnconds = null;
    //Create a factory for disk-based file items
    DiskFileItemFactory factory = new DiskFileItemFactory();
    //Configure a repository (to ensure a secure temp location is used)
    ServletContext servletContext = this.getServletConfig().getServletContext();
    File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
    factory.setRepository(repository);
    //Create a new file upload handler
    ServletFileUpload upload = new ServletFileUpload(factory);
    //Parse the request
    List<FileItem> items = upload.parseRequest(request);
    Iterator<FileItem> iter = items.iterator();
    while (iter.hasNext()) {
        FileItem item = iter.next();
        if (item.isFormField()) {
            InputStream input = item.getInputStream();
            if(item.getFieldName().equals("name")){
                byte[] str = new byte[input.available()];
                input.read(str);
                name = new String(str,"UTF8");
            }
            if(item.getFieldName().equals("startdate")){
                byte[] str = new byte[input.available()];
                input.read(str);
                startdate = new String(str,"UTF8");
            }
            if(item.getFieldName().equals("deadline")){
                byte[] str = new byte[input.available()];
                input.read(str);
                deadline = new String(str,"UTF8");
            }
            if(item.getFieldName().equals("website")){
                byte[] str = new byte[input.available()];
                input.read(str);
                website = new String(str,"UTF8");
            }
            if(item.getFieldName().equals("termsnconds")){
                byte[] str = new byte[input.available()];
                input.read(str);
                termsnconds = new String(str,"UTF8");
            }
        } else {
                item.write(new File("C:\\indigo\\eclipse\\workspace\\JSPyDB\\WebContent\\images\\competitions\\salida.png"));
        }
    }
        //File.createTempFile(arg0, arg1)


    %>
    <sql:transaction dataSource="jdbc/PuzzleDB">
        <sql:update>
            INSERT INTO picture_competition (name, url) VALUES (?, ?)
            <sql:param value="salida.png" />
            <sql:param value="/competitions/" />                
        </sql:update>
        <sql:query var="pictures">
            SELECT id FROM picture_competition WHERE name=? 
            <sql:param value="salida.png" />
        </sql:query>
        <c:if test="${!empty pictures.rows}">
            <c:forEach var="picture" items="${pictures.rows}">
                <c:set var="competiname" value="<%= name %>"></c:set>
                <c:set var="competistartdate" value="<%= startdate %>"></c:set>
                <c:set var="competideadline" value="<%= deadline %>"></c:set>
                <c:set var="competiwebsite" value="<%= website %>"></c:set>
                <c:set var="competitermsnconds" value="<%= termsnconds %>"></c:set>
                <sql:update>
                    INSERT INTO Competition (name, id_picture, id_sponsor, start_date, deadline, websiteURL, termsnconds) VALUES (?, ?, ?, ?, ?, ?, ?);
                    <sql:param value="${competiname}" />
                    <sql:param value="${picture.id}" /> 
                    <sql:param value="${sessionScope.userid}" /> 
                    <sql:param value="${competistartdate}" />
                    <sql:param value="${competideadline}" />
                    <sql:param value="${competiwebsite}" />
                    <sql:param value="${competitermsnconds}" />
                </sql:update>
            </c:forEach>
        </c:if> 
    </sql:transaction>

在图片中插入竞争(名称、url)值(?,)
从图片_竞赛中选择id,其中名称=?
在竞赛中插入(姓名、id图片、id赞助商、开始日期、截止日期、网站URL、期限等)值(?,,,,,,,,,?);

您必须使用apache commons fileupload库获取所有参数,而不仅仅是文件。您不能混合使用
request.getParameter
${param.competitermsnconds}
因为您使用的是
multipart/form data
…如果您尝试像普通方式一样获取参数,那么它将是
null
,因为您只能通过fileupload库或
请求来获取它。如果您使用的是servlet API 3.0,那么您确实应该将其设置为servlet。您不应该在jsp中进行数据库更新。谢谢develioerwjk,我知道用它来创建servlet更好,但我必须在低于3.0的版本中完成,在整个过程中使用apache commons文件上传的servlet。i、 e.
if(item.isFormField()){
那里有您的非文件字段。
<c:forEach var="picture" items="${pictures.rows}">
                <c:set var="competiname" value="<%= name %>"></c:set>
                <c:set var="competistartdate" value="<%= startdate %>"></c:set>
                <c:set var="competideadline" value="<%= deadline %>"></c:set>
                <c:set var="competiwebsite" value="<%= website %>"></c:set>
                <c:set var="competitermsnconds" value="<%= termsnconds %>"></c:set>
                <sql:update>
                    INSERT INTO Competition (name, id_picture, id_sponsor, start_date, deadline, websiteURL, termsnconds) VALUES (?, ?, ?, ?, ?, ?, ?);
                    <sql:param value="${competiname}" />
                    <sql:param value="${picture.id}" /> 
                    <sql:param value="${sessionScope.userid}" /> 
                    <sql:param value="${competistartdate}" />
                    <sql:param value="${competideadline}" />
                    <sql:param value="${competiwebsite}" />
                    <sql:param value="${competitermsnconds}" />
                </sql:update>   
            </c:forEach>
<%
    String name = null ;
    String startdate = null;
    String deadline = null;
    String website = null;
    String termsnconds = null;
    //Create a factory for disk-based file items
    DiskFileItemFactory factory = new DiskFileItemFactory();
    //Configure a repository (to ensure a secure temp location is used)
    ServletContext servletContext = this.getServletConfig().getServletContext();
    File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
    factory.setRepository(repository);
    //Create a new file upload handler
    ServletFileUpload upload = new ServletFileUpload(factory);
    //Parse the request
    List<FileItem> items = upload.parseRequest(request);
    Iterator<FileItem> iter = items.iterator();
    while (iter.hasNext()) {
        FileItem item = iter.next();
        if (item.isFormField()) {
            InputStream input = item.getInputStream();
            if(item.getFieldName().equals("name")){
                byte[] str = new byte[input.available()];
                input.read(str);
                name = new String(str,"UTF8");
            }
            if(item.getFieldName().equals("startdate")){
                byte[] str = new byte[input.available()];
                input.read(str);
                startdate = new String(str,"UTF8");
            }
            if(item.getFieldName().equals("deadline")){
                byte[] str = new byte[input.available()];
                input.read(str);
                deadline = new String(str,"UTF8");
            }
            if(item.getFieldName().equals("website")){
                byte[] str = new byte[input.available()];
                input.read(str);
                website = new String(str,"UTF8");
            }
            if(item.getFieldName().equals("termsnconds")){
                byte[] str = new byte[input.available()];
                input.read(str);
                termsnconds = new String(str,"UTF8");
            }
        } else {
                item.write(new File("C:\\indigo\\eclipse\\workspace\\JSPyDB\\WebContent\\images\\competitions\\salida.png"));
        }
    }
        //File.createTempFile(arg0, arg1)


    %>
    <sql:transaction dataSource="jdbc/PuzzleDB">
        <sql:update>
            INSERT INTO picture_competition (name, url) VALUES (?, ?)
            <sql:param value="salida.png" />
            <sql:param value="/competitions/" />                
        </sql:update>
        <sql:query var="pictures">
            SELECT id FROM picture_competition WHERE name=? 
            <sql:param value="salida.png" />
        </sql:query>
        <c:if test="${!empty pictures.rows}">
            <c:forEach var="picture" items="${pictures.rows}">
                <c:set var="competiname" value="<%= name %>"></c:set>
                <c:set var="competistartdate" value="<%= startdate %>"></c:set>
                <c:set var="competideadline" value="<%= deadline %>"></c:set>
                <c:set var="competiwebsite" value="<%= website %>"></c:set>
                <c:set var="competitermsnconds" value="<%= termsnconds %>"></c:set>
                <sql:update>
                    INSERT INTO Competition (name, id_picture, id_sponsor, start_date, deadline, websiteURL, termsnconds) VALUES (?, ?, ?, ?, ?, ?, ?);
                    <sql:param value="${competiname}" />
                    <sql:param value="${picture.id}" /> 
                    <sql:param value="${sessionScope.userid}" /> 
                    <sql:param value="${competistartdate}" />
                    <sql:param value="${competideadline}" />
                    <sql:param value="${competiwebsite}" />
                    <sql:param value="${competitermsnconds}" />
                </sql:update>
            </c:forEach>
        </c:if> 
    </sql:transaction>