Java Web复习(6)get,post请求以及get,post,html,jsp编码

一:请求

1.get请求

在server.xml中,<Connector>标签没有设置编码是,那默认是ISO-8859-1

ISO只要遇到不认识的字符,都会将其用63表示,显示出来,也就是?  所有的都变成了问号这里可以看到六个中文对应6个?

我们也可以自己设置 URIEncoding="UTF-8",但是一般不被允许

最后要使用以下代码:

    //如果没有设置编码,默认ios-8859-1编码
String name = request.getParameter("name");
//反编过来,解码
byte[] bytes = name.getBytes("ISO-8859-1");
name = new String(bytes,"utf-8");

2.post请求

POST请求,只需在获取参数之前调用

request.setCharacterEncoding("utf-8");

然后就可以使用

getParameter()来获取参数了


二、响应编码:

1.服务器默认使用iso-8859-1把数据转换成字节(1.iso不支持中文,乱码, 2,浏览器会把数据当成gbk,乱码)

2.服务器可以使用response.setCharacterEncoding("utf-8")设置编码,即发送出去的是utf-8的字节(1.浏览器把数据当成是gbk,还是会乱码)

3.服务器可以使用setHeader()这个方法来设置名为Content-Tyoe的响应头,这个头告诉了浏览器我们的服务器使用的是什么编码   response.setHeader("Content-Type","text/html;character=utf-8");

4.一般都是用这句而不用上面那句,response.setContentType("text/html;character=utf-8");

response.setHeader("Content-Type","text/html;character=utf-8");便捷的写法:

response.setContentType("text/html;character=utf-8");

这一句不仅仅设置了响应头,他还会设置setCharacterEncoding()

所以想要不乱码,在使用getWriter()方法之前,先调用下面的方法

response.setContentType("text/html;character=utf-8");



所以,如果再有人问GET请求和POST请求的区别,可以回答:

GET请求的参数在URL中,在请求的第一行Request-Line中,而POST请求的参数在请求主体Message-Body中

(4)我们通过HttpWatch成功的抓取到form表单提交之后的请求信息。

[html]  view plain  copy
  1. POST /Example04/index.jsp HTTP/1.1  
  2. Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, */*  
  3. Referer: http://localhost:8080/Example04/form.html  
  4. Accept-Language: en-US,zh-CN;q=0.5  
  5. User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; qdesk 2.4.1265.203; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3)  
  6. Content-Type: application/x-www-form-urlencoded  
  7. Accept-Encoding: gzip, deflate  
  8. Host: localhost:8080  
  9. Content-Length: 30  
  10. Connection: Keep-Alive  
  11. Cache-Control: no-cache  
  12.    
  13. username=zhangsan&password=123  

(5)现在我们再抓取一段GET方式请求信息,在浏览器地址栏上输入:http://localhost:8080/Example04?username=zhangsan&password=123

(6)get请求信息

[html]  view plain  copy
  1. GET /Example04?username=zhangsan&password=123 HTTP/1.1  
  2. Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, */*  
  3. Accept-Language: en-US,zh-CN;q=0.5  
  4. User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; qdesk 2.4.1265.203; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3)  
  5. Accept-Encoding: gzip, deflate  
  6. Host: localhost:8080  
  7. Connection: Keep-Alive  
  8. Cookie: JSESSIONID=5386A9443729D7EB0B61E38A9C7CF52F  




-------------------------------------------------------------------------------------------

1.有效设置(火狐浏览器)设置html页面编码:
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
下面这个谷歌浏览器可以成功设置页面编码,但在火狐浏览器不行,而myeclipse自动生成的也是下面这个而不是上面那个
    <meta name="content-type" content="text/html; charset=UTF-8">
1、pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码




编码问题:
编码
  常见字符编码:iso-8859-1(不支持中文)、gb2312、gbk、gb18030(系统默认编码,中国的国标码)、utf-8(万国码,支持全世界的编码,所以我们使用这个)


1. 响应编码
  * 当使用response.getWriter()来向客户端发送字符数据时,如果在之前没有设置编码,那么默认使用iso,因为iso不支持中文,一定乱码
  * 在使用response.getWriter()之前可以使用response.setCharaceterEncoding()来设置字符流的编码为gbk或utf-8,当然我们通常会选择utf-8。
这样使用response.getWriter()发送的字符就是使用utf-8编码的。但还是会出现乱码!因为浏览器并不知道服务器发送过来的是什么编码的数据!这时浏览器会使用gbk来解码,
所以乱码!
  * 在使用response.getWriter()之前可以使用response.setHeader("Content-type","text/html;charset=utf-8")来设置响应头,通知浏览器服务器这边使用的是utf-8编码,
而且在调用setHeader()后,还会自动执行setCharacterEncding()方法。这样浏览器会使用utf-8解码,所以就不会乱码了!
  * setHeader("Content-Type", "text/html;charset=utf-8")的快捷方法是:setContentType("text/html;charset=utf-8)。
2. 请求编码
  * 客户端发送给服务器的请求参数是什么编码:
    客户端首先要打开一个页面,然后在页面中提交表单或点击超链接!在请求这个页面时,服务器响应的编码是什么,那么客户端发送请求时的编码就是什么。
  * 服务器端默认使用什么编码来解码参数:
    服务器端默认使用ISO-8859-1来解码!所以这一定会出现乱码的!因为iso不支持中文!
  * 请求编码处理分为两种:GET和POST:GET请求参数在请求体中,而POST请求参数不在请求体中,所以它们的处理方式是不同的!
  * GET请求编码处理:
    > String username = new String(request.getParameter("iso-8859-1"), "utf-8");
    > 在server.xml中配置URIEncoding=utf-8
方法二:反编!!
  * POST请求编码处理:
    > String username = new String(request.getParameter("iso-8859-1"), "utf-8");
    > 在获取参数之前调用request.setCharacterEncoding("utf-8");


3. URL编码
  表单的类型:Content-Type: application/x-www-form-urlencoded,就是把中文转换成%后面跟随两位的16进制。
  为什么要用它:在客户端和服务器之间传递中文时需要把它转换成网络适合的方式。


  * 它不是字符编码!
  * 它是用来在客户端与服务器之间传递参数用的一种方式!
  * URL编码需要先指定一种字符编码,把字符串解码后,得到byte[],然后把小于0的字节+256,再转换成16进制。前面再添加一个%。
  * POST请求默认就使用URL编码!tomcat会自动使用URL解码!
  * URL编码:String username = URLEncoder.encode(username, "utf-8");
  * URL解码:String username = URLDecoder.decode(username, "utf-8");


  最后我们需要把链接中的中文参数,使用url来编码!今天不行,因为html中不能给出java代码,但后面学了jsp就可以了。


------------------
JSP编码:


1、pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码。


       众所周知,JSP在服务器上是要先被编译成Servlet的。pageEncoding="UTF-8"的作用就是告诉JSP编译器在将JSP文件编译成Servlet时使用的编码。
       通常,在JSP内部定义的字符串(直接在JSP中定义,而不是从浏览器提交的数据)出现乱码时,很多都是由于该参数设置错误引起的。例如,你的JSP文件是以GBK为编码保存的,而在JSP中却指定pageEncoding="UTF-8",就会引起JSP内部定义的字符串为乱码。


       另外,该参数还有一个功能,就是在JSP中不指定contentType参数,也不使用response.setCharacterEncoding方法时,指定对服务器响应进行重新编码的编码。


2、contentType="text/html;charset=UTF-8"的作用是指定对服务器响应进行重新编码的编码。


       在不使用response.setCharacterEncoding方法时,用该参数指定对服务器响应进行重新编码的编码。服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。


------------------------------------------
URL编码:
Cookie的name和value都不能使用中文,如果希望在Cookie中使用中文,那么需要先对中文进行URL编码,然后把编码后的字符串放到Cookie中。
 向客户端响应中添加Cookie
编码:
String name = URLEncoder.encode("姓名", "UTF-8");
String value = URLEncoder.encode("张三", "UTF-8");
Cookie c = new Cookie(name, value);
c.setMaxAge(3600);
response.addCookie(c);


解码:String name = URLDecoder.decode(c.getName(), "UTF-8");
String value = URLDecoder.decode(c.getValue(), "UTF-8");



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值