关于JSP中,中文问题(泛指字符问题),以及常见错误调试手记
sports98写于2001-1-9
序言:
在论坛中,生活中,工作中,有不少和我一样属于鸟级的用户,在面对着不明白的问题的时候就盲目了,多交流,多写写日记就好的多了
文章内容关于:2001-01-08日,编写/调试[用户注册程序]
编写环境:WIN2K(简体中文版) server sp2 + TOMCAT4.0 + J2SDK1.3+MYSQL4.0(alpha)
检测数据库内容环境:WIN2K(简体中文版) server sp2 + IIS5.0 + php4.0+MYSQL4.0(alpha)+PHPMYADMIN2.0
程序代码(最终程序代码):
----------------------------------------------------------------------------------------------------------------------
<%@ page import="java.sql.*" contentType="text/html;charset=gb2312" %>
<%//获取提交信息
String reg_name=new String();
String reg_nick=new String();
String reg_pws=new String();
String reg_pws_rp=new String();
String reg_sex=new String();
String reg_email=new String();
String reg_email_rp=new String();
String reg_address=new String();
String reg_tel=new String();
String reg_hand=new String();
String reg_counter=new String();
String reg_city=new String();
String reg_zip=new String();
String reg_company=new String();
String reg_calling=new String();
String reg_place=new String();
String reg_question=new String();
String reg_answer=new String();
String reg_submit=new String();
String reg_check=new String();
String reg_momo=new String();
String SQL=new String();
String reg_teminfo=new String(); //欢迎信息,在论坛内将要使用
int flag_system;
int flag=1; //定义注册用户标记,1为活动用户,0为非活动拥护
int up=0; //定义用户登陆情况,注册时候默认为0次
//转换字符设置将ISO8859-1字符转为GBK字符,这样符合MYSQL字符,解决TOMCAT服务器下中文问题
reg_name=new String(request.getParameter("reg_truename").getBytes("GBK"),"ISO8859-1"); //用户真实名称
reg_nick=new String(request.getParameter("reg_name").getBytes("GBK"),"ISO8859-1"); //用户昵称
reg_pws=new String(request.getParameter("reg_pws").getBytes("GBK"),"ISO8859-1"); //用户密码
reg_pws_rp=new String(request.getParameter("reg_pws_rp").getBytes("GBK"),"ISO8859-1"); //校验密码
reg_sex=new String(request.getParameter("reg_sex").getBytes("GBK"),"ISO8859-1"); //用户性别
reg_email=new String(request.getParameter("reg_email").getBytes("GBK"),"ISO8859-1"); //电子邮件
reg_email_rp=new String(request.getParameter("reg_email_rp").getBytes("GBK"),"ISO8859-1"); //校验电子邮件
reg_address=new String(request.getParameter("reg_address").getBytes("GBK"),"ISO8859-1"); //详细地址
reg_tel=new String(request.getParameter("reg_tel").getBytes("GBK"),"ISO8859-1"); //联系电话
reg_hand=new String(request.getParameter("reg_hand").getBytes("GBK"),"ISO8859-1"); //手机或其他联系方式
reg_counter=new String(request.getParameter("reg_counter").getBytes("GBK"),"ISO8859-1"); //国家
reg_city=new String(request.getParameter("reg_city").getBytes("GBK"),"ISO8859-1"); //城市
reg_zip=new String(request.getParameter("reg_zip").getBytes("GBK"),"ISO8859-1"); //邮政编码
reg_company=new String(request.getParameter("reg_company").getBytes("GBK"),"ISO8859-1"); //公司名称
reg_calling=new String(request.getParameter("reg_calling").getBytes("GBK"),"ISO8859-1"); //职位性质
reg_place=new String(request.getParameter("reg_place").getBytes("GBK"),"ISO8859-1"); //职位
reg_question=new String(request.getParameter("reg_question").getBytes("GBK"),"ISO8859-1"); //机密问题
reg_answer=new String(request.getParameter("reg_answer").getBytes("GBK"),"ISO8859-1"); //机密答案
reg_submit=new String(request.getParameter("reg_submit").getBytes("GBK"),"ISO8859-1"); //提交变量
reg_check=new String(request.getParameter("reg_check").getBytes("GBK"),"ISO8859-1"); //是否检测过姓名标记
reg_momo=new String(request.getParameter("reg_momo").getBytes("GBK"),"ISO8859-1"); //用户简单信息MOMO
////////////////////////
reg_teminfo="论坛内欢迎信息";
reg_teminfo=new String(reg_teminfo.getBytes("GBK"),"ISO8859-1");
int reg_temflag=1; //在论坛内寻找该字段以便弹出即时信息
boolean temp=reg_check.equals("120980"); //判断标记,以后采用SESSION进行保存判断值
try{
if(temp)
{
%>
<html>
<head><title>注册</title>
</head>
<style type="text/css">
body {font:9pt;color:black;margin:0}
td {font:9pt;color:black}
</style>
<body>
<center>
<%
//////////////////////////////////////////判断用户注册信息////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
java.lang.String strConn;
Class.forName("org.gjt.mm.mysql.Driver").newInstance(); //声明驱动程序For mysql
//声明连接对象 Connection C------C 为连接对象 Connection 为声明语句
Connection C = DriverManager.getConnection("jdbc:mysql://localhost/news?user=mysql&password=mysql&useUnicode=true&characterEncoding=8859_1"); //连接到数据库
Statement s=C.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs=s.executeQuery("select * from reg where nick='"+reg_name+"'"); //声明执行对象
if(rs.next())
{
%>
<table width=100% cellpadding=0>
<tr><td height=100px></td>
<tr><td align=center><font color=red>错误:非法操作注册程序!</font>
<tr><td height=30px></td>
<tr><td align=center><font color=red>提示:您已经注册或正在非法浏览本页面<br>本页面不允许刷新!</td>
<tr><td height=30px></td>
<tr><td align=center><button onclick="javascript:window.close()">关闭本页面</button></td>
</table>
<%
}
else
{
SQL="INSERT INTO reg (id,flag, name, nick, sex, pws, email, address, tel, hand, city, zip, company, counter, momo, teminfo, temflag, calling, place, question, answer, up) VALUES ('','"+flag+"', '"+reg_name+"', '"+reg_nick+"', '"+reg_sex+"', '"+reg_pws+"', '"+reg_email+"', '"+reg_address+"', '"+reg_tel+"', '"+reg_hand+"', '"+reg_city+"', '"+reg_zip+"', '"+reg_company+"', '"+reg_counter+"', '"+reg_momo+"', '"+reg_teminfo+"', '"+reg_temflag+"', '"+reg_calling+"', '"+reg_place+"', '"+reg_question+"', '"+reg_answer+"', '"+up+"')";
s.executeUpdate(SQL);
%>
<br><br>
<table width="400" cellpadding=0 cellspacing=0 style="border:1 solid black ">
<tr><td colspan=2 height=15px></td>
<tr><td colspan=2 align=center>恭喜!您已经注册成功,您的基本信息为...
<tr><td colspan=2 height=15px></td>
<tr><td align=right width="30%">用户名:<td align=left width="70%"><%=new String(reg_nick.getBytes("ISO8859-1"),"GBK")%>
<tr><td align=right>真实姓名:<td align=left><%=new String(reg_name.getBytes("ISO8859-1"),"GBK")%>
<tr><td align=right>性别:<td align=left><%=reg_sex%>
<tr><td align=right>密码:<td align=left><%=reg_pws%>
<tr><td align=right>电子邮件:<td align=left><%=reg_email%>
<tr><td align=right>详细地址:<td align=left><%=new String(reg_address.getBytes("ISO8859-1"),"GBK")%>
<tr><td align=right>联系电话:<td align=left><%=new String(reg_tel.getBytes("ISO8859-1"),"GBK")%>
<tr><td align=right>第二联系方式:<td align=left><%=reg_hand%>
<tr><td align=right>所在城市:<td align=left><%=reg_city%>
<tr><td align=right>邮政编码:<td align=left><%=reg_zip%>
<tr><td align=right>公司名称:<td align=left><%=new String(reg_company.getBytes("ISO8859-1"),"GBK")%>
<tr><td align=right>国家:<td align=left><%=reg_counter%>
<tr><td align=right>工作性质:<td align=left><%=reg_calling%>
<tr><td align=right>职务:<td align=left><%=reg_place%>
<tr><td colspan=2 height=15px></td>
<tr><td colspan=2 align=center>提示:您已经登陆本站<font color=red><%=up%></font>次,您可以使用本帐户直接登陆论坛...
<tr><td colspan=2 height=15px></td>
<tr><td align=center><a href="/">返回主页</a><td align="center"><a href="">进入论坛</a></td>
</table>
<%
}
%>
</center>
</body>
</html>
<%
}
else
{
%>
<html>
<head>
<title>Error</title>
</head>
<body><center><br><br>
<font face="黑体" size=5 color=red>抱歉!非法的操作步骤!</font><br>
<font face="impact" color=black>Sorry!YOU have nullity at register!please register again!</font>
</center>
</body>
</html>
<%
}
}
catch (Exception t) {
out.println("<br><br>错误:本页不允许刷新!<br>或您执行了非法操作!<br>Error:This page can't refresh!<br>you have error</center></body></html>");
}
%>
本程序依照
协议-----》预注册(判断呢称是否被注册)-----》成功(打印注册项目)-----》提交
(重新选择呢称)↑ |(失败)
|_________|
提交后-》判断是否为正常注册(temp为检测标记)
提交成功-》打印注册基本资料,添加COOKIE
注册失败-》打印失败(有可能是服务器问题)。
至此,程序完成
碰到问题:
按照调试阶段碰到的问题先后攥写,
1、 数据正常添加,但使用PHPMYADMIN查看数据库内,所有的汉字均显示为?????????。
2、 数据正常添加,但JSP页面没有按照设定的程序打印出资料。
3、 不可以刷新,一刷新程序重复执行一次,而发生数据库内字段冲突,导致JSP报错!
调试过程:
在这里,首先感谢[令少爷][ wayne.xiao]以及关心咱这只“鸟“的朋友们
关于第一个碰到的问题,
问题1、
首先调试了程序,并且在executeUPdate前后都加上OUT来查看是否是程序造成的(转换类型),但是输出的均为正常。
进入PHPMYADMIN查看数据,所有的汉字均为?????。
具体内容可以查看
http://www.dev-club.com/club/bbs/showAnnounce.asp?id=1123399帖子
后经令少爷提示以及帮助,将字符改成GBK字符集合
(后来发现从数据库内提取出来的就要转换成ISO8859-1字符集了,要不也是?????!!头疼的字符问题)
到此,问题告一段落!
问题2
无法正常显示!当我按上面将需要输入与输出的字符均转为字符集后,却发现注册后无法显示信息。所显示的页面的HTML的默认的输出空页面(但executeUpdate已经执行,数据库内资料已经添加)!找了半天没找到问题,赶快求救!:J:JJJJJJJ
经过提示,先将所有的执行步骤加入 try内,然后查看出错在哪里,发现出错在打印注册成功资料那里?左看右看没发现什么啊!!!
“GBK“靠!又是字符集问题!!!我把”GBK“给写成”GDK”l了LLLLLLLLL
(很严重哦!!才学程序设计的时候所有的书本都说不要写错啊)
那是变量的名称,没想到只因为一个字符集合的名称害得我忙了2个小时!!
所有的鸟,不论大鸟,小鸟,可不要再犯我这个低级错误了啊!
至此问题解决
问题3、
页面刷新问题,由于2问题的解决采用了TRY,这个问题也就解决了,
在catch (Exception t) {}中捕获错误(数据库报出的错误!)另外在TRY中也有个捕捉错误的地方,不过我这里有时候他能报错有时候不报错!很讨厌,不过由于用catch (Exception t) {}捕获这个错误,所以这个问题也就解决了。
小结:
程序设计,很枯燥,不过也很美丽,当你完成她的时候,感觉是非常的爽!
不过大姑娘绣花要心细点~~ 低级错误尽量避免,拼写的时候要注意不要错了哦!
还有,下步准备将程序写到BEAN里,这样的写法对于页面来说不容易布置,
对于代码的安全,少了一个安全级,对于错误的处理,增加了麻烦,所以吗~~大家自己看了