以下内容均为个人理解,不当之处希望指出;
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种;
- ISO-8859-1编码:内存大小为1个字节[0,2^8-1];不能表示中文字符;提示:可以同过ASCLL码表来理解;
- gb2312编码:以两个字节表示中文字符;兼容ISO-8859-1编码;
- gbk编码:以两个字节表示中文字符;兼容gb2312编码;
- unicode编码:采用2或者4字节表示中文字符;不与任意编码兼容;
- utf-8编码:采用1个字节表英文,3个字节表中文;不兼容gb2312编码;utf-8是国际通用字符编码,常常统一为utf-8编码类型,也是用的最多的编码类型;
3. 解决乱码的五种编码方式;
常用解决编码的5种编码方式:
- 使用request.setCharacterEncoding(“编码类型”);
- 使用pageEncoding=“编码类型”
- 使用contentType=“编码类型”
- 使用response.setCharacterEncoding(“编码类型”);
- 修改server.xml中的URIEncoding编码方式;
4. 五种编码方式在jsp执行原理对应的范围;
5.五种编码方式在jsp执行原理对应的范围内的优先级;
-
从jsp到Servlet时:pageEncoding>contentType;
-
在指定服务器响应内容编码时:response.setCharacterEncoding>contentType>pageEncoding也就是标题4的服务器框框里面的最下面的框框那里;
(1)contentType>pageEncoding
输出结果:
(2)response.setCharacterEncoding>contentType>pageEncoding
输出结果:
对于request.setCharacterEncoding和server.xml中URIEncoding,这两种编码方式在后面搞清楚get以及post原理之后才来解释它的编码用处;
6. 表单中get/post区别;
- get是向服务器端获取数据的(搜索引擎就是通过客户端用get传值过来的数据,找到用户匹配的页面,返回改客户端。所以说是向服务器端获取数据),不对服务器端做修改,所以经常用来搜索,查询;post是向服务器端传送数据的,是要对服务器端做修改的;所以常用来注册,修改,上传用;但是注意:它们都是提交数据到数据库,只是提交方式不同,在下面的第3点有解释;
- get安全性<post安全性;
- 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了;
以上均为个人理解,如有不对请指教;