今天在编写一个关于用不同的方式来设置form表单实验时发现了一个挺头痛的问题。程序如下:
第一种情况
<form name=form1 method="post">
?? user:<input type=text name=user1 ><br>
?? <input type=submit value=register>
</form>
?
第二种情况
<form name=form2 method="post">
?? user:<input type=text name=user2 value=<%= request.getParameter("user2") %>><br>
?? <input type=submit value=register>
</form>
?
第三种情况
<form name=form3 method="post">
?? user:<input type=text name=user3 value=${param.user3}><br>
?? <input type=submit value=register>
</form>
?
(1)???? 由于在jsp页面中直接写入中文,并且没有使用page指令设置页面的编码方式,于是在用浏览器访问时出现异常。
(2)???? 后来无意间在整个程序的最前面插入了一个空行,程序运行居然没问题了,用浏览器访问显示出了正常的内容。为什么加入了个回车换行程序就正常运行呢,不解,于是查看了一下有jsp程序生成的Servlet源程序。发现其实程序并不算完全没问题,因为在生成的Servlet源程序中jsp页面中的中文显示为乱码(浏览显示时正常)如下为生成的Servlet源程序中的一部分:
out.write("\r\n");
out.write("μúò????é??\r\n");
out.write("<form name=form1 method=\"post\">\r\n");
out.write("\tuser:<input type=text name=user1 ><br>\r\n");
out.write("\t<input type=submit value=register>\r\n");
out.write("</form>\r\n");
out.write("\r\n");
out.write("μú?t???é??\r\n");
out.write("<form name=form2 method=\"post\">\r\n");
out.write("\tuser:<input type=text name=user2 value=");
????? out.print( request.getParameter("user2") );
out.write("><br>\r\n");
out.write("\t<input type=submit value=register>\r\n");
out.write("</form>\r\n");
??? out.write("\r\n");
out.write("μúèy???é??\r\n");
out.write("<form name=form3 method=\"post\">\r\n");
out.write("\tuser:<input type=text name=user3 value=");
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${param.user3}", java.lang.String.class, (PageContext)_jspx_page_context, null, false));
out.write("><br>\r\n");
out.write("\t<input type=submit value=register>\r\n");
out.write("</form>\r\n");
? ? ? 于是猜测之前的程序异常是编码方面的问题,于是在程序的开头 ? ? ? ? ?出加入如下语句:
? ? ? ?<%@ page pageEncoding="gb2312" %>
? ? ? ?果然,程序又运行正常了。查看有jsp页面生成的Servlet源程 ? ? ? ? 序,之前的乱码也显示正常了。
(3)???? 尽管程序运行正常了,但之前的问题还没解决,在没使用page指令的情况下,为什么在程序开头处加入个空行就能在浏览器显示出正常的结果(尽管Servlet源程序中的中文部分是乱码),而不加空行就出现异常。查阅了相关资料发现,jsp引擎必须在读到page指令后才能知道jsp源文件的字符集编码,在读取到这些page指令之前,jsp引擎是无法知道jsp源文件的字符集编码。由于英文ASCII码字符在UTF-8编码和各个国家的本地字符集编码中的值完全一样,所以jsp引擎总是先按UTF-8编码方式来读取jsp源文件的内容,这就要求设置page指令的contentType属性和pageEncoding属性的语句之前不能有非UTF-8编码的字符。原来如此,由于我的程序开始是中文,系统默认情况下是gb2312字符集编码,所以没插入一个空行时就出现了异常。当插入一个空行之后,jsp不再是以中文开头,所以用UTF-8的编码方式将jsp源程序转换成Servlet源程序就没出现异常,但其中的中文部分在Servlet源程序中还是乱码。如果确实是以上分析编码原因的话,那么把jsp源文件以UTF-8方式编码,那么即使不适用page指令而且jsp源程序以中文开头,那么程序也应该不会出现问题,于是将jsp源程序另存为以UTF-8编码,用浏览器访问,果然没问题,而且生成的Servlet源程序中的中文也没出现乱码。
(4)???? 最后剩下的问题就是在jsp源程序插入一个空行后,生成的Servlet源程序中的中文是乱码,而用浏览器访问时却是正常显示,这又是为什么呢。本人猜测,由于一开始jsp源文件是以gb2312的编码方式保存,而在生成Servlet源程序时是使用UTF-8编码(错误的编码方式),于是出现乱码,而后来浏览器显示又再次以错误的编码方式编码,于是错错得对,浏览器显示出了正常的内容。(不知道这想法对不,麻烦有经验的人如果看到这篇文章解答下)