jsp中的getParameter和setContentType

在jsp中,浏览器发送给jsp的字符串都会事先编码成字节。以表单为例,不管是post提交还还是get方法,也不管页面是否有meta元素,表单提交的数据都会以utf-8的编码(仅在IE和火狐测试过)。而jsp的getParameter则会以默认的ISO-8859-1进行解码,因而,在表单提交中文字符串时,jsp这边就会得到乱码。假设表单提交的是"春节",其utf-8编码是E6 98 A5 E8 BA 82,具体过程可以通过下图表示:

jsp中的getParameter和setContentType

很明显,由于编码和解码的方式不一致,最终jsp这边通过getParameter方法会得到乱码。解决的方式有两种:

1 在调用getParameter方式之前,调用setCharacterEncoding("utf-8"),设置jsp的request的解码方式,但是这一种只对post方式有效,由get方式提交的情形,这种方式无效。

2 在调用getParameter方法之后,在进行字符编码转换:

str = new String(str.getBytes("ISO-8859-1"), "utf-8"); //str为getParameter方法获取的字符串

第二种方式对于post方法和get方法均有效,其过程如下:

jsp中的getParameter和setContentType

至于jsp的setContentType方法,是设置响应正文的MIME类型,比如:

response。setContentType("text/html;charset=utf-8");

这就是告诉浏览器,返回的是html文档,并且请用utf-8进行解码,而jsp这边的输出,即PrintWriter.println()也会根据setContentType指定的字符集对中文进行编码,过程和接受刚好相反,过程如下:

jsp中的getParameter和setContentType

因此,相比于jsp的接受中文,jsp的发送中文相对简单,只要通过setContentType设置的字符集能对中文正确编码,就不会出现乱码。这里要注意的是,如果调用PrintWriter.println("春节")之前没有调用setContentType设置编码方式,默认使用ISO-8859-1进行编码,由于ISO-8859-1不能编码中文,尽管浏览器通过ISO-8859-1进行解码,得到的依然是乱码。

 

你可能感兴趣的:(parameter)