jsp乱码问题,表单提交get/post的区别以及编码原理设置

以下内容均为个人理解,不当之处希望指出;

1. jsp执行原理;

要先彻底解决编码问题那么就需要清楚jsp执行的原理,jsp执行原理是一个转译+两个编译;具体见下图:
在这里插入图片描述
这里需要说明:
           jsp翻译为.java时候,是Tomcat服务器jsp引擎翻译的,如果idea点击执行;那么就会在你的项目的目录下生成.java源文件:
在这里插入图片描述
每个人的电脑路径不同,所以自己需要找一下,一般是放在你的Tomcat安装位置下面的;那么这个翻译过程就是Tomcat下面的jsp引擎完成的;打开.java源文件,那么就能发现实际上.jsp里面的内容是被翻译到了_jspService()函数里面的out.write中:

      out.write("\n");
      out.write("\n");
      out.write("<html>\n");
      out.write("  <head>\n");
      out.write("  </head>\n");
      out.write("<body>\n");
      out.write("    ");

//         response.setCharacterEncoding("ISO-8859-1");
         out.println("我是中文");
    
      out.write("\n");
      out.write("</body>\n");
      out.write("</html>");

2. jsp编码类型;

jsp编码常见类型一共分为5种;

  1. ISO-8859-1编码:内存大小为1个字节[0,2^8-1];不能表示中文字符;提示:可以同过ASCLL码表来理解;
  2. gb2312编码:以两个字节表示中文字符;兼容ISO-8859-1编码;
  3. gbk编码:以两个字节表示中文字符;兼容gb2312编码;
  4. unicode编码:采用2或者4字节表示中文字符;不与任意编码兼容;
  5. utf-8编码:采用1个字节表英文,3个字节表中文;不兼容gb2312编码;utf-8是国际通用字符编码,常常统一为utf-8编码类型,也是用的最多的编码类型;

3. 解决乱码的五种编码方式;

常用解决编码的5种编码方式:

  1. 使用request.setCharacterEncoding(“编码类型”);
  2. 使用pageEncoding=“编码类型”
  3. 使用contentType=“编码类型”
  4. 使用response.setCharacterEncoding(“编码类型”);
  5. 修改server.xml中的URIEncoding编码方式;

4. 五种编码方式在jsp执行原理对应的范围;

在这里插入图片描述

5.五种编码方式在jsp执行原理对应的范围内的优先级;

  1. 从jsp到Servlet时:pageEncoding>contentType;

  2. 在指定服务器响应内容编码时:response.setCharacterEncoding>contentType>pageEncoding也就是标题4的服务器框框里面的最下面的框框那里;
    (1)contentType>pageEncoding
    在这里插入图片描述
    输出结果:
    在这里插入图片描述
    (2)response.setCharacterEncoding>contentType>pageEncoding
    在这里插入图片描述
    输出结果:
    在这里插入图片描述


    对于request.setCharacterEncoding和server.xml中URIEncoding,这两种编码方式在后面搞清楚get以及post原理之后才来解释它的编码用处;

6. 表单中get/post区别;

  1. get是向服务器端获取数据的(搜索引擎就是通过客户端用get传值过来的数据,找到用户匹配的页面,返回改客户端。所以说是向服务器端获取数据),不对服务器端做修改,所以经常用来搜索,查询;post是向服务器端传送数据的,是要对服务器端做修改的;所以常用来注册,修改,上传用;但是注意:它们都是提交数据到数据库,只是提交方式不同,在下面的第3点有解释;
  2. get安全性<post安全性;
  3. get是将表单中的各个字段与其内容以键=值的对的放在http请求报文的请求行的,再将http请求报文传送到action指定的url地址的后面,其值在浏览器跳转时用户可见; 但是对于post的原理则是将表单中的字段以键=值对的形式放入http请求报文的主体,再将报文传送到action指定的url地址,页面跳转时用户看不到传值信息;
    相信看到这里一定会疑惑上面说的http报文是个什么东西;
    下面给出解释:
    http报文:它是HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义知,后面跟着可选的数据部分道。这些报文都是在客户端、服务器和代理之间流动。
    一下来看一下http报文样子:
    (1).下面的图就是解释get提交中http报文的请求行加在url后面;在这里插入图片描述
    (2).下面的图就是解释post提交的字段(以键=值形式)放到http报文的主体中;
    在这里插入图片描述
    其实报文我的理解就是认为是http协议里面的一个的数据块,因为客户端采用请求/响应式的方式与服务器交流,所以需要通过http协议,所以需要使用http报文;

7. get/post对应编码设置;

在这里插入图片描述
这里需要注意几点:

1.如何修改server.xml中的URIEncoding,首先找到conf目录下面的server.xml打开;找到:
在这里插入图片描述
在这里插入图片描述
没有显示出来说明是默认的,Tomcat8以前的都是默认ISO-8859-1,但是Tomcat9默认是UTF-8;那么这里把它补全为:
在这里插入图片描述
蓝色方框可以写一个编码类型,这里我写的UTF-8;不写就是默认UTF-8;写出来便于理解;
所以到这里乱码问题,表单get/post区别以及编码原理设置就OK了;



以上均为个人理解,如有不对请指教;

猜你喜欢

转载自blog.csdn.net/qq_44555205/article/details/105492835