Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/91.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态表单,带或不带多部分/表单数据_Java_Html_Servlets_File Upload_Multipartform Data - Fatal编程技术网

Java 动态表单,带或不带多部分/表单数据

Java 动态表单,带或不带多部分/表单数据,java,html,servlets,file-upload,multipartform-data,Java,Html,Servlets,File Upload,Multipartform Data,我正在用java设计一个简单的CRUD框架,在我的HTML页面中,我有一个动态表单(2个有多部分用于创建和更新文件上载,1个没有文件上载,多部分用于删除)。服务器端,请求调制器使用request.getParameterMap()检查所有参数并从该隐藏类型输入检查其是否为创建、更新或删除操作。基于此,它将调用必要的处理程序 注意:我的表单类型和编码设置为多部分/表单数据 注意:我的paramMap.size()在这里返回0,returnType为null,因此我得到null指针异常 如果我根本不

我正在用java设计一个简单的CRUD框架,在我的HTML页面中,我有一个动态表单(2个有多部分用于创建和更新文件上载,1个没有文件上载,多部分用于删除)。服务器端,请求调制器使用
request.getParameterMap()检查所有参数
并从该隐藏类型输入检查其是否为创建、更新或删除操作。基于此,它将调用必要的处理程序

注意:我的表单类型和编码设置为多部分/表单数据 注意:我的paramMap.size()在这里返回0,returnType为null,因此我得到null指针异常

如果我根本不使用enctype和编码,它运行得很好,但是我的文件上传给我一个例外,编码类型应该是多部分/表单数据。有谁能帮助我创建一个积垢的动态表单吗?或者为什么我不能使用
request.getParameterMap()带有多部分/表单数据(谢谢)

下面给出了请求调制器的代码

public String identifyNow()throws ServletException, java.io.IOException
{
    UploadXmlAgent uploadAgent;
    paramMap=request.getParameterMap();
    if (paramMap == null)
        throw new ServletException(
          "getParameterMap returned null in: " + getClass().getName());

    iterator=paramMap.entrySet().iterator();
    System.out.println(paramMap.size());
    while(iterator.hasNext())
    {
        Map.Entry me=(Map.Entry)iterator.next();
        if(me.getKey().equals("returntype"))
        {
            String[] arr=(String[])me.getValue();
            returnType=arr[0];
        }
    }

    //Identified based on returnType, instantiate appropriate Handler

    if(returnType.equals("Create"))
    {
        uploadAgent=new UploadXmlAgent(realPath,request,paramMap);
        uploadAgent.retrieveXml();
                    //SOME MORE OPERATIONS  
        return uploadAgent.uploadXml();
    }
    else if(returnType.equals("Update"))
    {
        System.out.println("Update");
        uploadAgent=new UploadXmlAgent(realPath,request,paramMap);
        uploadAgent.retrieveXml();
                    //SOME MORE OPERATIONS
        return uploadAgent.uploadXml();
    }
    else if(returnType.equals("Delete"))
    {
        //SOME OPERATIONS
    }
    return returnType;
}

也许你应该看看

要改变提交的表单类型,可以使用隐藏的输入字段

 <input type="hidden" name="formAction" value="uploadSomething">
就这样。
希望这有帮助。

嗨,我设法解决了。 我使用2个请求和一个会话变量

第一次请求提交不包含多部分的表单,并将请求类型存储在会话变量中


发送第一个请求后,转到相同形式的第二个请求,但这次使用multipart并检查会话变量值并执行相应的处理程序。

根据另一个答案上的注释:

我可以使用
request.getParameterMap()吗以任何方式使用多部分


如果这是您唯一的需求,那么只需创建一个
过滤器
,它执行解析工作并准备包含所有解析的多部分项的请求参数映射,这样您就可以继续使用
getParameter()
getParameterMap()
,并以JSP/Servlet中的常规方式进行关联。你可以找到这样一个过滤器的完整示例。

@Achim:我编辑了我的问题,以显示我的隐藏输入类型,我试图从中找到它是什么类型的操作。你是否检查了你的请求是多部分/文件上传<代码>布尔isMultipart=ServletFileUpload.isMultipartContent(请求)@Achim:我修改并检查了。这是真的,多部分看看我的第一个回复,我加了几行。你应该看看我提供的文件上传链接。就这些there@Achim:谢谢:)我知道DiskFileItemFactory和ServletFileUpload>我在适当的处理程序类(创建和更新)中使用它们来上载文件,并使用
item.isFormField()
item.getFieldName()
我可以得到我想要的,但我想把它们分开。所以问题是我可以使用
request.getParameterMap()吗以任何方式使用多部分?我还研究了oreilly多部分解析器,这可能也会有所帮助。
String act = request.getParameter("formAction");
if(act.equals("uploadSomething")
{ 
// EDIT
if(ServletFileUpload.isMultipartContent(request))
{

// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);

// Parse the request
List /* FileItem */ items = upload.parseRequest(request);
}
}