1.问题描述:
jsp页面中常常有表单元素,有时候需要在该<form>中使用文件上传标签,为了实现文件上传功能,需要将<form>元素进行二进制封装,此时如果该form中还有普通类型的表单元素,使用request.getParameter(“**”)是无法获取普通表单元素的值的,必须使用smartupload.getRequest().getParameter()才可以获取普通表单元素的值,并且要注意该句话一定要在smartupload.upload()之后执行,否则即使使用smartupload获取,得到的也是null值。
2.debug过程:
Test.jsp
<!--由于要实现文件上传功能,所以必须将form封装成“multipart/form-data” 这样一来整个表单的内容都变成二进制形式向下传送 --> <form action="receive.jsp" method="post" enctype="multipart/form-data"> <input name="modelName" type="text"> <input type="file" name="avatar"><div>允许上传的文件类型:zip,tar,gz</div> <input type="submit" value="提交"> </form>
由于<form enctype="multipart/form-data">,表单中所有内容都变成二进制形式向后传送,
在目的页面receive.jsp中直接使用request.getParameter()获取的值是null
receive.jsp
<!--直接使用request.getParameter()获取封装成二进制形式的普通表单元素的值,结果=null--> <body> model:<%=request.getParameter("model")%> </body> 运行结果: model: null
由上面的运行结果可以看到,直接使用request.getParameter("model")获取封装成二进制形式的表单元素,结果=null
所以想到应该借助于smartupload对象来获取混合表单中的普通表单标签的值,如下程序所示:
<!--错误的示范:-->
<body> <h1>接收上述封装成二进制的普通表单元素</h1> <% SmartUpload upload=new SmartUpload(); String modelName=upload.getRequest().getParameter("model"); %> <h2>model:<%=modelName %></h2> </body> 结果: 接收上述封装成二进制的普通表单元素 model:null
咦?不是说使用smartupload对象可以获取封装成二进制的普通表单元素吗?为什么得到的结果也是null?
哈哈,下面我们就来看看到底是为什么?
答:你只是声明了一个smartupload对象而已,并没有执行上传操作,所以获得的值当然是null啦,正确的编程方法如下:
<!--正确的示范:
上面的例子虽然用了smartupload接收封装成二进制的表单元素的值,但是接受的结果仍然是错误的
下面才是正确的编程
声明smartupload对象之后,还应该执行“初始化” “上传准备” 等操作
在upload()之后使用smartupload.getRequest().getParameter("model")才能获得普通表单标签model的值
-->
<body> <h1>接收上述封装成二进制的普通表单元素</h1> <% SmartUpload upload=new SmartUpload(); upload.initialize(pageContext);//初始化上传操作 // 3.设定允许上传的文件(通过扩展名限制),仅允许doc,txt文件。 upload.setAllowedFilesList("zip,tar,gz"); // 4.设定禁止上传的文件(通过扩展名限制),禁止上传带有exe,bat,jsp,htm,html扩展名的文件和没有 //扩展名的文件。 // su.setDeniedFilesList("exe,bat,jsp,htm,html,,"); upload.upload();//上传准备 String modelName=upload.getRequest().getParameter("model"); %> <h2>model:<%=modelName %></h2> </body>
运行结果:
接收上述封装成二进制的普通表单元素
model: modelname用户输入的值