今天有个同事做二次开发的时候遇到一些表单数据的小问题,可是这些小问题却也难倒我了。因为之前一直在用struts处理表单数据,好久没直接处理过了。所以完全忘记了,温故知新一下。
获取JSP表单数据,通常的方法是request.getParameter。此方法对于POST提交方式来说,用来获得客户端传送给服务器请求中的消息体信息,对于GET来说是获取URL后面的参数值。无论哪一种方式,参数都是一样的,只是一个显示在消息体中,另外一个在URL上。该参数是由name指定的。
之前一直有个误区,以为request.getParameter只能获取URL上面的参数,正正忽略了还可以拿消息体里面的东西。因为一直以来都用FormBean的关系吧。这些都不大理会了。
[size=medium][b]如果request.getParameter获取不了值的话,原因会有三个。[/b][/size]
1.获取的request.getParameter的参数值不存在于表单中。即没有一个标签里面的name是跟获取的参数所对应的。注意是name而不是id。
2.form表单设置了enctype="multipart/form-data"属性。这个需要上传文件的时候会用到。
3.获取的参数标签里面存在disabled="disabled"
对于第二种情况,想要获取参数值比较麻烦。因为表单数据都封装成meta二进制格式传输了。好像可以通过common-fileupload组件来解决。具体没测试,搜下应该有的。或者有更多其他办法解决。
[size=medium][b]中文问题:[/b][/size]
表单提交的时候,数据流默认为ISO-8859-1。所以获取的值的时候,中文的话可能会出现乱码情况,这时候只用通过转码就可以了。
另外说一下 request.getAttribute
这个方法通常服务器端使用setAttribute,用来封装bean放回给视图层进行进一步的操作。此时视图层就使用getAttribute进行获取数据了。另外setAttribute方式不一定是request,参照scope吧。可选访问更广阔。
[size=medium] [b]关于如何选择GET还是POST[/b][/size]
URL的长度
URL是有长度限制的,一般不超过255bytes..实际不同的浏览器会有不同长度准则。
所以表单提交的时候选择method时还必须考虑数据量的问题。大数据和不想数据显示在URL上的话,选择POST比较好。
浏览器缓存机制
GET方法的时候需要注意URL缓存机制,因为浏览器为提供性能,如果通过GET方法投递的两次URL都相同的话,第二次会启动缓存机制。所以常常需要通过传送一个虚拟的值来区分,为了避免第二次获取了一次缓存值。
而对于POST,因为消息体浏览器并不知道它内容,不能判断是否两次投递的信息是否一样。所以不会启动缓存机制。
安全性
对于POST和GET两种请求方式,POST方法也相对的安全那么一点。
总结一点,在普通情况下,能用POST就用POST吧。但是GET方法又可以在很多的情况下给与我们带来很多的便利,也是不可缺少的。
获取JSP表单数据,通常的方法是request.getParameter。此方法对于POST提交方式来说,用来获得客户端传送给服务器请求中的消息体信息,对于GET来说是获取URL后面的参数值。无论哪一种方式,参数都是一样的,只是一个显示在消息体中,另外一个在URL上。该参数是由name指定的。
之前一直有个误区,以为request.getParameter只能获取URL上面的参数,正正忽略了还可以拿消息体里面的东西。因为一直以来都用FormBean的关系吧。这些都不大理会了。
[size=medium][b]如果request.getParameter获取不了值的话,原因会有三个。[/b][/size]
1.获取的request.getParameter的参数值不存在于表单中。即没有一个标签里面的name是跟获取的参数所对应的。注意是name而不是id。
2.form表单设置了enctype="multipart/form-data"属性。这个需要上传文件的时候会用到。
3.获取的参数标签里面存在disabled="disabled"
对于第二种情况,想要获取参数值比较麻烦。因为表单数据都封装成meta二进制格式传输了。好像可以通过common-fileupload组件来解决。具体没测试,搜下应该有的。或者有更多其他办法解决。
[size=medium][b]中文问题:[/b][/size]
表单提交的时候,数据流默认为ISO-8859-1。所以获取的值的时候,中文的话可能会出现乱码情况,这时候只用通过转码就可以了。
String str=request.getParameter("userName");
byte b[]=str.getBytes("ISO-8859-1");
str=new String(b);
另外说一下 request.getAttribute
这个方法通常服务器端使用setAttribute,用来封装bean放回给视图层进行进一步的操作。此时视图层就使用getAttribute进行获取数据了。另外setAttribute方式不一定是request,参照scope吧。可选访问更广阔。
[size=medium] [b]关于如何选择GET还是POST[/b][/size]
URL的长度
URL是有长度限制的,一般不超过255bytes..实际不同的浏览器会有不同长度准则。
所以表单提交的时候选择method时还必须考虑数据量的问题。大数据和不想数据显示在URL上的话,选择POST比较好。
浏览器缓存机制
GET方法的时候需要注意URL缓存机制,因为浏览器为提供性能,如果通过GET方法投递的两次URL都相同的话,第二次会启动缓存机制。所以常常需要通过传送一个虚拟的值来区分,为了避免第二次获取了一次缓存值。
而对于POST,因为消息体浏览器并不知道它内容,不能判断是否两次投递的信息是否一样。所以不会启动缓存机制。
安全性
对于POST和GET两种请求方式,POST方法也相对的安全那么一点。
总结一点,在普通情况下,能用POST就用POST吧。但是GET方法又可以在很多的情况下给与我们带来很多的便利,也是不可缺少的。