JSP中文乱码问题_涉及POST/GET比较

此文章涉及两方面:
1、JSP页面中文问题
2、表单的method使用post与get的比较

JSP中输入的中文默认是使用的ISO-8859-1编码,需要转换:
<%!
public String codeToString(String str){
String s=str;
try{
byte[] bytes=s.getBytes("ISO-8859-1");
s=new String(bytes);
return s;
}catch(Exception e){
return s;
}
}
%>

先说说HTTP协议之HTTP请求格式:
HTTP请求格式:
* HTTP协议规定,HTTP请求由3部分构成,分别是:
* 请求方式、URI、HTTP协议的版本
* 请求头(Request Header)
* 请求正文(Request Content)
*
*下面是一个HTTP请求的例子:
*POST /hello.htm HTTP/1.1
*Accept:image/gif,image/jpeg,*\/*
*Referer:http://localhost/login.htm
*Accept-Language:en,zh-cn;q-0.5
*Content-Type:application/x-www-form-urlencoded
*Accpet-Encoding:gzip,deflate
*User-Agent:Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.0)
*Host:localhost
*Content-Length:43
*Connection:Keep-Alive
*Cache-Control:no-cache
* (空一行)
*username=weiqin&password=1234&submit=submit
*
* 1.请求方式、URI、HTTP协议的版本
*HTTP请求的第一行包括请求方式、URI和协议版本3项内容,以空格分开:
* POST /hello.htm HTTP/1.1
*在以上代码中,"POST"表示请求方式,"/hello.htm"表示URI,"HTTP/1.1"表示HTTP协议版本。
* 根据HTTP协议,HTTP请求可以使用多种请求方式。
* GET:这种请求方式最为简单,客户程序可以通过这种请求方式访问服务器上的***一个文档**,
*服务器把文档发送给客户程序。
* POST:客户程序可通过这种方式发送大量信息给服务器。在HTTP请求中处了包含要访问的文档的URI外,
*还包括大量的***请求正文***,这些请求正文中通常还包含大量HTML表单数据。
* HEAD:客户程序和服务器之间交流一些内部数据,服务器不会返回具体的文档。 当使用GET和POST方法时,
*服务器最后都将特定的文档返回给客户程序,而HEAD请求方式则不同,它仅仅交流一些内部数据,这些数据不会
*影响用户浏览网页的过程,可以说对用户是透明的。 HEAD请求方式通常不单独使用,而是为其他请求方式起辅助作用。
*一些搜索引擎使用HEAD请求方式来获得网页的标志信息,还有一些HTTP服务器进行安全认证时,用这个方式来传递认证信息。
* PUT:客户程序通过这种方式把文档上传给服务器。
* DELETE:客户程序通过这种方式来删除远程服务器上的某个文档。客户程序可以利用PUT和DELETE请求方式来
*管理远程服务器上的文档。
*
* 2.请求头(Request Header)
* 请求头包含许多有关客户环境和请求正文的有用信息。例如,请求头可以声明浏览器的类型、所用的语言、请求正文的类型,
*以及请求正文的长度等:
* Accept:image/gif,image/jpeg,*\/*
* Referer:http://localhost/login.htm
* Accept-Language:en,zh-cn;q-0.5
* Content-Type:application/x-www-form-urlencoded
* Accpet-Encoding:gzip,deflate
* User-Agent:Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.0)
* Host:localhost
* Content-Length:43
* Connection:Keep-Alive
* Cache-Control:no-cache
*
* 3. 请求正文(Request Content)
* HTTP协议规定,请求头和请求正文之间必须以空行分割(只有CRLF符号的行),这个空行非常重要,它表示请求头已经结束,
*接下来是请求正文。请求正文中可以包含客户***以!POST!方式提交的表当数据***
* username=weiqin&password=1234&submit=submit
*
*CRLF(Carriage Return Linefeed)是指回车符和行结束符"\r\n"

实际例子:
JSP页面:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<form name="helloForm" method="get" action="hi.hello">
<table>
<tr>
<td><div align="right">朋友名:</div></td>
<td><input type="text" name="clientName"/></td>
</tr>
<tr><td></td>
<td><input type="Submit" name="submit" value="提交"/></td>
</tr>
</table>
</form>
对应的HttpServlet子类:
package mypack;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class HelloServlet extends HttpServlet //step1:扩展HttpServlet抽象类。
{
//step2:覆盖doGet()
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException ,ServletException
{
//step3:获取HTTP请求中的参数信息。
String clientName=request.getParameter("clientName");
if(clientName!=null){
clientName=new String(clientName.getBytes("ISO-8859-1"),"GB18030"); //编码转换,clientName按ISO-8859-1解码为(Unicode)字节,将得到的(Unicode)字节再按GB18030编码
}
else
clientName="我的朋友";

//step4:生成HTTP响应结果。
PrintWriter out;
String title="HelloServlet";
String heading1="This is output from helloservlet by doGet";
//set content type. 设置"输出响应数据"内容content的字符编码
response.setContentType("text/html;charset=GB18030");
//write html page.使用PrintWriter实例将内容输出到HTML 页面!
out=response.getWriter();
out.print("<HTML><HEAD><TITLE>"+title+"</TITLE>");
out.print("</HEAD><BODY>");
out.print(heading1);
out.println("<h1><p>"+clientName+":你好</h1>");
out.print("</BODY></HTML>");

//close out
out.close();
}

public void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException ,ServletException{
//step3:获取HTTP请求中的参数信息。
String clientName=request.getParameter("clientName");
if(clientName!=null){
//(clientName的)字符编码转化
//clientName=new String(clientName.getBytes("ISO-8859-1"),"UTF8");
clientName=new String(clientName.getBytes("ISO-8859-1"),"GB18030"); //编码转换,clientName按ISO-8859-1解码为(Unicode)字节,将得到的(Unicode)字节再按GB18030编码
}
else
clientName="我的朋友";

//step4:生成HTTP响应结果。
PrintWriter out;
String title="HelloServlet";
String heading1="This is output from helloservlet by doGet";
//set content type. 设置"输出响应数据"内容content的字符编码
//response.setContentType("text/html;charset=UTF8");
response.setContentType("text/html;charset=GB18030");
//write html page.使用PrintWriter实例将内容输出到HTML 页面!
out=response.getWriter();
out.print("<HTML><HEAD><TITLE>"+title+"</TITLE>");
out.print("</HEAD><BODY>");
out.print(heading1);
out.println("<h1><p>"+clientName+":你好</h1>");
out.print("</BODY></HTML>");

//close out
out.close();
}
}

当输入中文时method=get时显示乱码
当输入中文时method=post时中文正常显示
我的解释:
forrest:
* 原因很简单,就是当请求方式是GET时,并不把表单数据封装在请求信息的正文中,请求的只是简单的想获取 并不发送信息给服务器,
*并没有将(表单等)信息 传递给HTTP服务器,所以服务器在通过HttpServletRequest检索不到客户端在页面上输入的信息。
通过POST时,除了请求外,还外加发送信息给服务器,所以服务器可以通过HttpServletRequest检索到客户端在页面上输入的信息
(POST方式将页面上的表单数据封装在HttpServletRequest中作为请求信息发给了服务器程序)。

* 可以从IE的输入栏:
http://127.0.0.1:8080/TomcatAndJavaWeb_cp2_helloapp/hi.hello?clientName=%C5%ED%C1%D5&submit=%CC%E1%BD%BB为method=get
http://127.0.0.1:8080/TomcatAndJavaWeb_cp2_helloapp/hi.hello为method=post
得到佐证

当使用method=get服务器程序根本就得不到客户的额外请求信息(表单中的信息)。
我输入的clientName对应信息是 彭琳qw123
http://127.0.0.1:8080/TomcatAndJavaWeb_cp2_helloapp/hi.hello?clientName=%C5%ED%C1%D5qw123&submit=%CC%E1%BD%BB
但是通过HttpServletRequest request.getParameter("clientName")还是得到了数据����qw123,这是怎么回事?
中文被进行了转换,彭琳qw123:%C5%ED%C1%D5qw123
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值