如何设置会话变量

时间:2009-08-20 12:13:05

标签: jsp session enctype

我想在提交表单之前将当前表单对象设置为session参数。是否可能?

<html>
<head>
Title 
</head>
<body>
<FORM method="test" name="test" enctype="multipart/form-data" action="sample.jsp" >
<select name="test" id="test"> 
<option>1</option>
<option>2</option>
</select>
<input type="submit" value="Submit">
</form>
</body>
</html>

我想在提交表单之前在会话中设置选择选项 test 。这是可能的。我不能使用请求,因为multipart中存在一些缺陷的实施方式。

3 个答案:

答案 0 :(得分:2)

  

我无法使用请求,因为多部分实现存在一些缺陷。

然后你的实际问题是你使用的是糟糕的实现。 Servlet API默认不支持multipart/form-data请求编码,您不会在请求参数映射中看到任何内容。要检索上传的文件和其他请求参数,您需要自己解析InputStream的{​​{1}}。但幸运的是,有一个常用的API可以从您手中接受宝贵而繁琐的工作:Apache Commons FileUpload。在他们的主页上,您可以在用户指南常见问题部分找到许多代码示例和重要提示和技巧。仔细阅读它们。基本上,您只需要从HttpServletRequest对象中获取InputStream并使用通常的Java IO方式将其写入任何FileItem。您甚至可以使用简写OutputStream进行此操作。

如果有必要,您可以编写一个FileItem#write(),它使用Apache Commons FileUpload并检查每个请求是否为Filter,如果是,请将参数放回请求参数中在Commons FileUpload的帮助下映射并将上传的文件(或异常)作为请求属性放置,以便最终在servlet代码中更透明。你可以找到here一个基本的例子来获得这个想法。

总结:不要发明变通方法/黑客来解决这个问题。当然,当它们以任何方式发送到服务器端时,不要使用Ajax在会话中设置请求参数。只需使用正确的解决方案来解决问题。使用好的multipart/form-data解析器。

希望这有帮助。

答案 1 :(得分:0)

我感觉不对,根本不是好主意。会话应始终在服务器端完成。因此,当请求到达服务器时,您可以执行与会话相关的所有内容。

答案 2 :(得分:0)

您可以使用Ajax与服务器通信。我不明白你是想要会话中的所有表单还是只需要测试组合的值?!如果它只是测试组合的值,那么您可以从页面获取该值并将其异步(无论何时)提交给服务器以接收请求的某个操作,提取测试值并将其保存在会话中。当你以正常方式提交表格时,它会在那里。

使用Ajax是一种解决方案,但对于可能是简单操作的东西来说,它是一个复杂的解决方案。正如其他人所说,这不是一个好主意。

为什么要这种行为?你究竟想做什么?