第3.42课 上课 Servlet表单处理, 定义表单, 表单验证方式, 后台获…

3_42

Servlet表单处理和编码

 定义表单

表单定义格式如下:

<form action="请求URL" method="post" enctype="编码类型">

...

</form>

 

  GET、POST区别

  enctype属性

1)application/x-www-form-urlencoded:默认值,它的作用是设置表单传输的编码格式。例如:userName=zhangsan&password=12345。

2)multipart/form-data:用来制定传输特殊类型的数据。例如图片、mp3等等。

3)text/plain:纯文本传输。表单数据以纯文本形式进行编码,其中不包含任何格式字符。在发邮件的时候要设置这种编码类型,否则会出现接收时编码混乱的问题。

 

 

 表单验证方式

  方式一:利用form的onsubmit()函数

 

 

  方式二:利用input类型为submit组件的onclick()函数

 

  方式三:利用input类型为button组件的onclick()函数

 

 后台获取表单参数

  request.getParameter(String name):获取指定名称的参数

  request.getParameterValues(String name):获取指定名称参数

 字符编码的处理

  乱码产生的原因

不管是request乱码还是response乱码,其实都是由于浏览器与服务器端采用的编码格式不相同造成的。

 

以request乱码为例:浏览器向服务器发送请求,因为浏览器与服务器之间的通信本质是Socket通信,所以要先将请求参数(字符)转换成字节,也就是编码过程,服务器接收到请求参数后进行解码(字节转字符)。

 

   request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码;

   response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码;

  浏览器发送GET和POST方式传递参数的区别

GET方式的请求,用req.setCharacterEncoding()方法设置解码方式是不行的。

原因在于:GET方式的请求参数放在消息头中,而消息头是在WEB容器的任何Servlet处理之前就已经先被WEB容器解析了,因为只有这样WEB容器才可以知道去具体调用哪个Servlet处理请求。

至于WEB容器如何解释消息的,Serlvet标准中并没用明确规定,所以有的WEB容器按ISO-8859-1去解释为Unicode,有的则是按系统默认编码。

 

 

 

POST方式的请求参数放在消息体中,消息体是在第一次调用HttpServletRequest对象的getParameter()方法时,才开始实际处理。

Servlet默认使用ISO-8859-1将消息体中的参数转化为Unicode。

如果是汉字,这是很不合理的,因为ISO-8859-1只有一个字节,是不支持汉字。

所以在对HttpServletRequest对象利用getParameter()方法获取参数值时,必须先要用setCharacterEncoding()方法设置其解码方式,如req.setCharacterEncoding("UTF-8"),这样调用的getParameter()方法会按UTF-8的方式把参数转化为Unicode。

 

所以由于GET方式解码的未知性,一般所带参数都是不带中文的,若要带中文,则用post方式比较方便。

 

服务器输出响应

 

服务器输出响应比较简单。由于servlet程序中所有字符都是统一码Unicode,所以输出时,按照response对象设定的Content-type中的字符集,servlet会自动根据其字符集将Unicode编码转为指定字符集输出。

 

编码问题的关键:

需要把接收的数据转化为Unicode编码,再由java处理;输出的数据由Unicode编码转化为指定编码后输出。

   GET方式:参数是放在消息头中,而消息头是由浏览器根据自身设置去进行编码的,一般是UTF-8。

   POST方式:根据HTML页面Content-Type属性,如:设置为"text/html;charset='GBK'"则浏览器按GBK去编码。

  request.setCharacterEncoding:设置从request中获取的值的编码

通过getParameter()获取参数时候,默认使用iso-8859-1编码。

如果参数包含中文,必须在调用request.getParameter()方法之前设置request.setCharacterEncoding("utf-8"); 的编码。

而且,只对POST请求有效,对GET请求无效。

 

对于GET请求乱码问题的解决方法:在Tomcat的server.xml文件的<Connector...> 元素中加入URIEncoding="UTF-8"。

 

<Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"

useBodyEncodingForURI="true"

IEncoding="utf-8"

URIEncoding="utf-8"

/>

  response.setCharacterEncoding:设置HTTP 响应的编码

response.setCharacterEncoding("UTF-8");

  response.setContentType:设置页面中为中文编码

 

response.setContentType("text/html;charset=UTF-8");

  response.setHeader("Content-Type","text/html;charset=UTF-8");

response.setContentType("text/html;charset=UTF-8");

等效

response.setHeader("Content-Type","text/html;charset=UTF-8");

  response.setContentType和response.setCharacterEncoding的区别

response.setContentType 设置发送到客户端的响应的内容类型,可以包括字符编码说明

如返回html数据,需要设置text/html。

也就是说在服务器端进行这个设置,那么它将在浏览器端起到作用,在你打开浏览器时决定编码方式。

 

 

 

该方法如果在response.getWriter()被调用之后或者在被提交之后调用,将不会设置响应的字符编码,在使用http协议的情况中,该方法设置 Content-type实体报头。

 

response.setCharacterEncoding 设置响应的编码

如果服务器端使用response.setContentType设置了编码格式,

那么如果使用 response.setCharacterEncoding指定的编码格式,这样就会将之前的设置覆盖 。

 

 

response.setContentType 或response.setCharacterEncoding的设置都必须在response.getWriter()被调用之前或response提交之前设置。

  如果之前使用response.setContentType设置了编码格式,再使用response.setCharacterEncoding来指定编码格式,那么将覆盖之前的设置

(response.setCharacterEncoding:设置HTTP 响应的编码response.setContentType:设置页面中为中文编码response.setHeader("Content-Type","text/html;charset=UTF-8");response.setContentType和response.setCharacterEncoding的区别)

posted on 2018-01-31 23:02  東風★破  阅读(386)  评论(0)    收藏  举报

导航