`

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





分享到:
评论

相关推荐

    JSP-GET-POST传递的乱码问题

    JSP-GET-POST传递的乱码问题 中文参数传递乱码问题一直伴随着我们,整理的解决过程。

    JSP中文乱码问题综述,中文乱码解决大全

    JSP中文乱码问题综述,中文乱码解决大全,表单使用Post方式提交后接收到的乱码问题,表单get提交方式的乱码处理方式,上传文件时的乱码解决,Java代码关于url请求,接受参数的乱码,关于jsp在MyEclipse中打开的乱码问题,...

    解决jsp提交乱码的问题

    解决jsp提交乱码的问题 可以解决get post 的乱码问题

    javaweb servlet(jsp)的乱码问题原理及解决

    讲述javaweb开发中的jsp乱码问题 get、post的区别 http协议的图解

    JSP中乱码解决办法

    JSP中解决POST方式和GET方式产生乱码的解决办法

    Jsp乱码问题解决2

    1 最基本的乱码问题。 这个乱码问题是最简单的乱码问题。...2 表单使用Post方式提交后接收到的乱码问题 3 表单get提交方式的乱码处理方式。 4 上传文件时的乱码解决 5 Java代码关于url请求,接受参数的乱码 ......

    做Java项目过程中遇到乱码问题的解决方案

    在做java项目(特别是web项目)的过程中,中文乱码一直是我们开发人员比较头疼的问题,因为涉及到编码,解码,字符集,以及国际化等诸多问题,所以在着手解决的时候也缺乏相关的知识。我花了一些时间自己动手实验了...

    Tomcat中Get和Post出现乱码的解决办法

    通过简单的办法解决Tomcat中出现的乱码,本文章使用于jsp servlet初学者

    JSP利用过滤器解决request中文乱码问题

    本文为大家分享了JSP用过滤器解决request中文乱码问题,具体内容如下 (1)客户端的数据一般是通过HTTP GET/POST方式提交给服务器,在服务器端用request.getParameter() 读取参数时,很容易出现中文乱码现象。 (2...

    JSP用过滤器解决request getParameter中文乱码问题

    (1)客户端的数据一般是通过HTTP GET/POST方式提交给服务器,在服务器端用request.getParameter()读取参数时,很容易出现中文乱码现象。 (2)用过滤器解决request中文乱码问题。 (3)代码如下: package my; ...

    Jsp文件上传下载(工具类源码)

    // 设置字符编码为UTF-8, 统一编码,处理出现乱码问题 response.setCharacterEncoding("UTF-8"); // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload DiskFileItemFactory dfif = new ...

    网页教程《跟姐姐学JSP》

    2.2. 中文乱码 2.2.1. 先解决响应中的乱码 2.2.2. POST乱码 2.2.3. GET乱码 3. 请求的跳转与转发 3.1. 范例 3.2. 如果用forward 3.3. 如果用redirect 3.4. forward和redirect的问题 3.4.1. 绝对路径与相对...

    AJAX中文乱码PHP中完美解决方法

    使用AJAX传送和接收中文参数时,如果不在客户端和服务器做相应的处理就会出现乱码问题,在网上相应的文章也不少,但是有的情况下很难从中找到符合自己理想的答案,我今天就是在网上找了很多,但是都差不多,讲ASP和...

    js调用AJAX时Get和post的乱码解决方法

    在使用”get”时,抓取的页面最后加上编码类型 代码如下: &lt;&#37; 服务器端:servletactioncontext.getresponse().setcharacterencoding(“utf-8”); 客户端 网页特效p/jsp.html target=_blank &gt;jsp教程: &lt;&#...

    ajax乱码解决汇总

    用AJAX 来GET回一个页面时,RESPONSETEXT里面的中文多半会出现乱码,这是因为xmlhttp在处理返回的responseText的时候,是把 resposeBody按UTF-8编码进解码考形成的,如果服务器送出的确实是UTF-8的数据流的时候汉字...

    Java学习笔记

    5、如何处理中文乱码问题 6、使用JavaMail发送注册验证邮件 7、不安全的用户名密码验证 8、用Session保存登录信息 9、面向对象分析通常分为三个步骤 10、使用DataSource接口连接数据源 11、避免表单重复提交的技术 ...

    php获取参数的几种方法总结

    $value = $_POST[“value”];... 您可能感兴趣的文章:JSP 从配置文件获取参数详解js传中文参数controller里获取参数乱码问题解决方法Java调用MySQL存储过程并获得返回值的方法java中如何获取相关参数

    支付宝第三方支付接口

    集成jsp,php,asp,vb等程序使用说明 1 index页面是创建支付url,...4 java程序要注意的中文乱码问题,一定要配置上去中文filter, 注意:一定要在web.xml中配置过滤器。每个项目中都配置了这个过滤器,具体可以直接打开

    jsp九大内置对象

     当Request对象获取客户提交的汉字字符时,会出现乱码问题,必须进行特殊处理。首先,将获取的  字符串用ISO-8859-1进行编码,并将编码存发岛一个字节数组中,然后再将这个数组转化为字符串对象  即可。如下:...

Global site tag (gtag.js) - Google Analytics