Java 动态表单,带或不带多部分/表单数据
我正在用java设计一个简单的CRUD框架,在我的HTML页面中,我有一个动态表单(2个有多部分用于创建和更新文件上载,1个没有文件上载,多部分用于删除)。服务器端,请求调制器使用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指针异常 如果我根本不
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);
}
}