在上传的文件的时候,前台的html的表单,通常会写出enctype="multipart/form-data"格式的,很多人这时候会困惑。通过request.getparameter()接收请求的时候,接收的参数都是null,后台接收不到。有人直接通过servelt去获取,有人通过struts去获取。我的解决方案是通过jersef的rest来解决的。
表单提交两次,在submit按钮的时候写了个onclick方法。按钮先提交submit,将文件上传到服务器。再通过ajax方法传到映射的后台。
如下:
function sub() { $("#addforms").submit(); /// $.ajax({ cache : true, type : "POST", url : "/XysVersionManager/services/appVersion/postParam", //data : "vercode="+vercode+"&msg="+msgs+"&isFlag="+isFlag,// 你的formid data:$("#addforms").serialize(),// 你的formid async : false, success : function(msg) { if (msg == "1") { alert("修改成功"); } else { alert("修改失败"); } } }); }
ajax提交后台的数据,如果使用request.getParameter()接收的话也是null.这时候就需要使用rest的内置标签了。有两种接收方式。
第一种是:@FormParam。后台java类可以定义方法如
public String postData(@Context HttpServletRequest request,@Context HttpServletResponse response,@FormParam("versionCode") String vercode,@FormParam("msg") String msg,@FormParam("isFlag") String isFlag){ appVersionService=new AppVersionService(); String app; String value=""; try { boolean flag=appVersionService.addAppVersion(vercode,msg,isFlag); value=String.valueOf(flag); } catch (Exception e) { e.printStackTrace(); } return value; }
@FormParam定义的参数可以去接收前台传递的参数。接收的值不再是null.
第二种方式:内置集合MultivaluedMap<String, String>。使用方法如下:
public String postData(@Context HttpServletRequest request,@Context HttpServletResponse response,MultivaluedMap<String, String> parameter){ appVersionService=new AppVersionService(); String app; String value=""; try { String output = " Form parameters :\n"; for (String key : parameter.keySet()) { output += key + " : " + parameter.getFirst(key) +"\n"; System.out.println("key:"+key+",param:"+parameter.getFirst(key)); } } catch (Exception e) { e.printStackTrace(); } return value; }
使用方法parameter.keySet()获取到表单内置标签的id,获取到key,parameter.getFirst(key),根据key可以获取到表单的值。
这样的话就可以接收到表单传递的参数了。可以实现form里面内嵌上传的file标签了。